[OS] Ch6. 프로세스 동기화
임계구역 문제 (The Critical-Section Problem)
- 각 프로세스는 임계구역이라고 부르는 코드 부분을 포함하고 있고, 그 안에서 다른 프로세스와 공유하는 변수를 변경하거나, 테이블 갱신 등의 작업을 진행한다.
- 이 시스템의 중요한 특징은 한 프로세스가 자신의 임계 구역에서 수행하는 동안 다른 프로세스들은 그 임계구역에 들어갈 수 없다는 사실이다.
- 각 프로세스는 임계구역에 진입하려면 진입 허가를 요청해야 한다.
- 요청을 하는 부분을 진입 구역(entry section), 그 뒤는 퇴출 구역(exit session)이라고 한다.
- 임계 구역이 아닌 구역은 나머지 구역(remainder section) 이라고 한다.
- 임계 구역 문제 해결안은 다음의 3가지를 충족해야 한다.
- 상호 배제 (mutual exclusion)
- 프로세스가 자기의 임계 구역에서 실행된다면 다른 프로세스들은 자신의 임계 구역에서 실행될 수 없다.
- 진행 (progress)
- 자기의 임계 구역에서 실행되는 프로세스가 없고 자신의 임계 구역으로 진입하려는 프로세스가 있다면, 나머지 구역이 아닌 프로세스들만 그 다음에 누가 진입할지를 결정하는 데 참여할 수 있다. 이 선택은 무한정 연기될 수 없다.
- 한정된 대기 (bounded waiting)
- 프로세스가 자기의 임계 구역에 진입하려는 요청을 한 후 부터 허용 될 때 까지 다른 프로세스들이 그들 자신의 임계구역에 진입하는 횟수에 제한이 있어야 한다.
- 상호 배제 (mutual exclusion)
피터슨의 해결안
- flag를 두어 두 개의 프로세스가 번갈아 가면서 실행된다.
Mutex Locks
- 프로세스는 임계 구역에 들어가기 전에 반드시 lock을 획득 해야 하고, 빠져 나올 때 반납 해야 한다.
acquire()
락을 획득, busy waiting 사용 (spin lock) -> CPU 사이클 낭비, but 문맥 교환을 필요로 하지 않는다. 짧은 시간 동안만 락을 소유할 경우 유용하다.release()
락을 반환
세마포 (Semaphore)
- 세마포는
wait()
과signal()
로만 접근 가능하다. - 카운팅 세마포 값은 제한이 없고, 이진 세마포 값은 0, 1 사이의 값만 가능하다.
- 따라서 이진 세마포는 mutex락과 유사하게 동작한다.
- 카운팅 세마포는 가용한 자원의 갯수로 초기화 된다. 자원을 사용하려는 프로세스는
wait()
연산을 수행하며, 세마포의 값이 감소가 된다. 값을 방출 하면signal()
연산을 수행하고, 세마포 값은 증가한다. 세마포의 값이 0이 되면 모든 자원이 사용중이고, 0 이상이 될 때까지 봉쇄된다.
교착 상태와 기아
- 세마포에서 프로세스들이 하나에 의해서만 야기될 수 있는 상황 (signal 연산)을 무한정 기다리는 상황이 발생할 수 있다. 이를 교착 상태(deadlock) 이라고 한다.
- 무한 봉쇄, 또는 기아는 세마포에서 무한정 대기하는 것이다. 이는 큐에서 LIFO 순서로 제거할 경우 발생 할 수 있다.
우선순위 역전
- 셋 이상의 우선 순위를 가진 시스템에서만 발생한다. 상대적으로 낮은 우선 순위를 가진 프로세스가 높은 프로세스에게 영향을 끼치는 상황이다.
- 두 가지 우선순위만 가지게 하면 해결 할 수 있다.
- 우선순위 상속 프로토콜을 구현함으로서 해결할 수 있다.
- 우선순위가 높은 프로세스가 필요로 하는 자원을 사용하는 프로세스들은 끝날 때 까지 더 높은 우선순위를 상속받는다.
고전적인 동기화 문제들
유한 버퍼 문제 (The Bounded-Buffer Problem)
- 유한한 크기를 가지는 버퍼에 여러 프로세스들이 접근할 때 발생하는 문제.
- 이진 세마포어를 통해 해결할 수 있다.
Readers-Writers 문제
- writer와 reader이 동시에 접근 할 때 발생할 수 있는 문제.
- reader/reader 접근은 허용, writer은 한 개만 접근할 수 있도록 함.
식사하는 철학자들 문제 (The Dining-Philosophers Problem)
- 자신의 바로 좌우의 젓가락만 집을 수 있다.
- 두 젓가락을 모두 집어야 식사를 할 수 있다.
- 식사를 하고 난 다음에 두 젓가락을 모두 내려놓는다.
- 모두 오른쪽의 젓가락을 집게 된다면 아무도 먹을 수 없을 것이다. (교착상태와 기아)
- 이는 모니터로 해결 할 수 있다.
모니터
- 세마포를 사용할 때 다음과 같은 문제점이 발생할 수 있다.
- 코딩하는 것이 힘들다.
- 타이밍 오류가 발생할 수 있다.
- 정확성(correctness) 입증이 어렵다.
- 자발적 협력(voluntary cooperation)이 필요하다.
- 한 번의 실수가 시스템 전체에 치명적으로 영향을 미친다.
- 모니터 구조물은 모니터 안에 항상 하나의 프로세스만이 활성화된다. -> 동기화 제약 조건을 구현할 필요 없다.
- 동기화는 condition이라는 구조물로 제공된다.
- condition은
signal()
과wait()
을 가지고 있다. x.wait()
,x.signal()
과 같이 사용한다.
함수형 프로그래밍 언어
- C++, Java와 같은 절차형 언어들은 변수들이 다른 값을 배정받을 수 있기 때문에 변경이 가능하다.
- 함수형 프로그래밍은 상태를 유지하지 않는다. 변수가 정의 되어 값을 배정받으면 값이 변경 될 수 없기 때문에 경쟁 조건이나 교착 상태의 쟁점에서 자유롭다.