▶상호배제
병행 프로세스에서 프로세스 하나가 공유 자원을 사용할 때 다른 프로세스들이 동일한 일을 할 수 없도록 하는 방법이다.
소프트웨어로 해결 : 데커의 알고리즘
소프트웨어 제공(프로그래밍 언어와 운영체제 수준에서 제공) : 세마포, 모니터
하드웨어로 해결 : TestAndSet
▶동기화
공유 자원을 동시에 사용하지 못하게 실행을 제어하는 방법을 말한다.
동기화는 순차적으로 재사용 가능한 자원을 공유하려고 상호작용하는 프로세스 사이에서 나타난다.
동기화로 상호배제를 보장할 수는 있지만, 이 과정에서 교착 상태와 기아 상태가 발생할 수 있다.
임계 자원(critical resource) : 두 프로세스가 동시에 사용할 수 없는 공유 자원
임계 영역(critical section) : 임계 자원에 접근하고 실행하는 프로그램 코드 부분
임계 영역에는 다수의 프로세스가 접근할 수 있지만, 어느 한순간에는 프로세스 하나만 사용할 수 있다. 그러므로 어떤 프로세스가 임계 영역에 들어가면 다른 프로세스는 임계 영역으로 진입할 수 없어야 한다.
여러 프로세스가 동시에 공유 데이터에 접근할 때 접근 순서에 따라 실행 결과가 달라지는 상황에 놓인 프로세스들을 경쟁 상태(race condition)에 있다고 한다.
▶세마포 (0 <= 세마포:플래그 변수)
관례적으로 세마포가 0일 때 lock 또는 사용 중이고, 0이 아닌 양의 값은 세마포를 사용할 수 있다는 의미이다.
크게 P연산과 V연산이 있는데, P(wait)연산은 크리티컬 섹션 진입을 알리는 역할을 하며 세마포 값이 0인 경우 대기 하다가 값이 0보다 커졌을 때 세마포 값을 감소시킨 뒤 프로그램을 진행시키게 되고, V(signal)연산은 크리티컬 섹션에서 빠져나옴을 알리는 역할을 하며 세마포 값을 증가시켜 다른 프로세스가 크리티컬 섹션에 진입할 수 있도록 한다.
- 세마포를 이용한 동기화
세마포 sync를 0으로 초기화한다.
프로세스 P1 |
프로세스 P2 |
S1; signal(sync); // sync값을 증가시킴 |
wait(sync); // 0<sync 되기를 기다림 S2; |
위와 같은 방법으로 S1을 수행한 뒤 S2가 수행되도록 할 수 있다.
sync 값이 0일 때 크리티컬 섹션에 진입하지 못하고 대기중인 프로세스들은 while(sync == 0);에 걸려서 무한루프를 돌며 프로세서 시간을 낭비하게 된다.
이를 해결하는 방법으로,
P연산에서 while문 대신 해당 프로세스를 준비 큐에 추가하고 block상태로 전환시키는 연산을 수행하고
V연산에서는 세마포를 증가시키는 연산 대신 프로세스를 준비 큐에서 제거하고 wake up을 통해 ready상태로 전환시키는 연산을 수행할 수 있다.
세마포의 주요 특징은 원자적으로 수행한다는 점이다. 두 프로세스가 동시에 동일한 세마포에서 P와 V연산을 할 수 없도록 해야한다.
단일 프로세서에서는 wait과 signal 연산 수행 중에 인터럽트를 금지하면 되지만,
다중 프로세서에서는 인터럽트를 금지할 수 없으므로 응용 프로그램의 진입 영역에서 임계 영역까지 바쁜 대기를 제거하고 그 시기를 이동시켜야한다.
▶모니터
세마포는 wait와 signal 연산이 프로그램 전체에 퍼져 있고 이들 연산이 각 세마포에 주는 영향을 전체적으로 파악하기가 쉽지 않기에 세마포를 잘못 사용하면 여러 가지 오류가 쉽게 발생하여 프로그램을 작성하기가 어렵다. 이런 단점을 극복하기 위해 모니터가 등장했다.