[OS] 프로세스 동기화
1. 동기화
프로세스 동기화 : 프로세스 사이의 수행 시기 맞추기
- 실행 순서 제어 : 프로세스 올바른 순서대로 실행
-
상호 배제 : 동시에 접근하면 안 되는 자원에 한 프로세스만 접근하게 하기
- 생산자와 소비자 문제 : ‘총합’ 데이터 공유. 동시에 실행하면 오류 발생
- 공유 자원(shared resource) : 공동으로 이용하는 파일, 변수, 장치 등 자원
- 임계 구역(critical section) : 공유 자원 코드 중 동시 실행하면 문제가 발생하는 코드 영역
- 레이스 컨디션(race condition) : 여러 프로세스가 동시에 임계 구역 코드 실행해 문제 발생
상호 배제를 위한 원칙
- 상호 배제 (mutual exclusion) : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
- 진행 (progress) : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
- 유한 대기 (bounded waiting) : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다. (무한정 대기 X)
2. 동기화 기법
뮤텍스 락 (Mutex lock : MUTual EXclusion lock)
- 상호 배제를 위한 동기화 도구
- 전역 변수
lock: 프로세스 공유, 자물쇠 역할 acquire함수 : 임계 구역 잠그는 역할acquire() { while(lock == true) // 잠금 있으면 ; // 반복적으로 체크 lock = true; // 잠금 없으면 잠그기 }release함수 : 임계 구역 잠금 해제 역할release() { lock = false; // 잠금 해제 }- 바쁜 대기(busy wait) : 잠겨있으면 반복적으로 확인
세마포 (Semaphore)
- 공유 자원 여러 개여도 적용 가능한 동기화 도구
- 전역 변수
S: 임계 구역 진입 가능한 프로세스 개수 (사용 가능 공유 자원 개수) wait함수 : 임계 구역 들어가? 말아?wait() { while ( S <= 0 ) // 임계 구역 진입 불가능하면 ; // 반복적으로 확인 S--; // 가능하면 S 1 감소하고 진입 }signal함수 : 나 다 썼어signal() { S++; // 작업 마친 후 S 1 증가 }- 바쁜 대기 대신 대기 큐 사용하기
wait() { S--; if(S < 0) { add this process to Queue; // 해당 프로세스를 대기 큐에 삽입 sleep(); // 대기 상태로 이동 } }
signal() {
S++;
if(S <= 0) {
remove p from Queue; // 대기 큐에서 p 꺼내서
wakeup(p); // 대기 상태 -> 준비 상태로 만들기
}
}
모니터(monitor)
- 공유 자원 & 공유 자원 접근 위한 인터페이스 묶어 관리.
-
프로세스는 반드시 인터페이스 통해서만 공유 자원 접근 가능 → 접근 원하는 프로세스를 큐에 삽입. 큐 순서 대로 하나씩 공유 자원 이용
- 사용자가 사용하기 편리
- 조건 변수 (condition variable) : 프로세스 or 스레드 실행 순서 제어 위해 사용
wait(): 특정 프로세스가 아직 실행될 조건이 되지 않았을 때signal(): 특정 프로세스가 실행될 조건이 충족되었을 때
공유하기
Twitter Facebook LinkedIn글 이동
Comments