본문 바로가기
컴퓨터공학/운영체제

프로세스 동기화(뮤텍스,세마포어,임계구역)

by Daniel.kwak 2018. 10. 26.

목표

1.프로세스 동기화에 대해 간략히 이해한다.

2.Critical Section(임계구역)을 이해한다. 

2.세마포어에 대해서 이해한다.

1.뮤텍스에 대해서 이해한다.

3.뮤텍스와 세마포어의 차이에 대해 이해한다.



프로세스 동기화 

프로세스는 서로 메세지를 보내고 프로세스 내부에서는 쓰레드끼리 자원을 공유하면서 '동기화'에 대한 문제가 항상 발생할 수 있다. 즉 공유된 자원에 여러 프로세스, 여러 쓰레드가 동시에 접근하면서 문제가 발생하게 된다. 유저 동기화 방법과 커널 동기화 방법이 있는데 유저 동기화는 Critical Section(임계영역) , 커널 동기화는 Mutex , Semaphore 가 있다.




Critical Section(임계구역)

OS에서 임계구역은 상당히 중요한 부분이다. 멀티 프로세스 환경에서 둘 이상의 프로세스가 동시에 접근해서는 안되는 공유 자원의 코드 영역이다. 임계구역은 시간이 지나면 종료되며, 어떤 프로세스가 임계구역에 접근하기 위해서는 지정된 시간만큼 대기해야 한다. 이때 쓰레드나 프로세스가 배타적인 사용권을 보장받기 위해서 세마포어 같은 동기화 메커니즘이 사용된다. 

하나의 쓰레드가 임계구역에 접근하기 위해서는 요청->필요시 대기->임계구역 처리->빠져나간다 의 순서로 이루어진다.


임계구역 문제를 해결하기 위한 3가지 조건

임계구역에서 발생하는 문제들은 3가지 조건을 충족시키면 해결할 수 있다.

1.Mutual Exclusion(상호배제) : 하나의 프로세스가 임계구역에 들어가 있으면 다른 프로세스는 들어갈 수 없다.

2.Progress(진행) : 임계구역에 들어간 프로세스가 없다면, 어느 프로세스가 들어갈 것인지 적절히 선택해줘야 한다.

3.Bounded Waiting(한정 대기) : 기아상태를 방지하기 위해, 한 번 들어갔다 나온 프로세스는 다음에 들어갈 때 제한을 준다. 



Peterson's Algorithm(피터슨의 알고리즘)

위의 3가지 조건을 충족하면서 임계구역 문제를 해결한다. flag와 turn변수를 사용한다. 



그러나 프로세스가 많이 몰리게 되면 계속 while문을 대기해야 하는데, 이를 Busy Waiting(바쁜대기) 상태라고 부른다. 




Mutex(상호배제)
MUTual EXclusion에서 부르기 좋게 따온 이름으로써 '상호배제' 의미를 가진다. 커널 모드 동기화 객체이다. 동시 프로그래밍 환경(멀티 프로세스 및 멀티 쓰레드 같은)에서 공유 불가능한 자원의 동시 사용을 막기 위해 사용되는 알고리즘으로, 임계구역에서 구현된다. 단일 프로세서 시스템에서 상호배제를 구현하는 간단한 방법은 인터럽트를 억제해서 공유데이터 손상을 막는 것이다. 일종의 Locking 메커니즘이라 할 수 있다. lock을 가진 쓰레드만이 임계구역에 접근할 수 있는것이다. 임계구역에서 작업이 끝난 쓰레드는 Unlock하여 lock을 반환한다. 




Semaphore(세마포어)

두 개의 원자적 함수로 조작되는 정적 변수로써, 멀티 프로그래밍 환경에서 공유 자원(임계구역)에 대한 접근을 제한하는 방법으로 사용된다. 이는 철학자들의 만찬 문제의 고전적인 해결책이지만, 모든 교착 상태를 해결하지는 못한다.



구성
세마포어 S는 정수값을 가지는 변수이며 다음과 같은 P와 V라는 명령어에 의해서만 접근할 수 있다. (P와 V는 try와 increment를 뜻하는 네델란드어에서 따왔다.)
P는 임계구역에 들어가기 전에 수행되고(try) , V는 임계구역에서 나올 때 수행된다. (increase) 이 때 변수값을 수정하는 연산은 모두 '원자성'을 만족해야 한다. 다시 말해, 한 프로세스나 쓰레드에서 S값을 변경하는 동안에는 다른 프로세스나 쓰레드가 동시에 접근해서 변경할 수 없다. 
값이 0보다 크면 접근을 허용하되 1을 감소하고, 값이 0이면 접근을 block시킨다.  반대로 작업이 끝나고 프로세스나 쓰레드가 나갈때는 값을 1로 증가시켜 다른 프로세스나 스레드가 접근할 수 있도록 한다. 여기서 접근되는 자원은 임계구역이므로 시스템 퍼포먼스에 많은 영향을 끼친다.

적용
최초 제시된 방법은 Busy-Waiting(바쁜대기,대기중인 쓰레드가 여전히 활성상태이지만 아무 작업도 하지 않는 상태)를 활용하는 방법이다.
 P(S) {
     while S <=0; // 아무것도 하지 않음 (반복문)
     S--;
 }

 V(S) {
     S++;
 }

이 방법은 임계구역에 진입하기 전 까지 빈 반복문을 계속 수행하므로 단일 처리기 다중 프로세스 환경에서는 효율이 떨어진다. 또한 대기중인 프로세스 중 어느것을 먼저 임계구역에 진입시킬지 결정할 수 없다.


첫번째 방법의 단점을 보완한 방법으로써 '재움 큐'를 활용한 방법이다.

 P(S) {
     S--;
     if S < 0
         // 이 프로세스를 재움 큐에 추가 (잠 듦)
 }

 V(S) {
     S++;
     if S <= 0
         // 재움 큐로부터 프로세스를 제거 (깨어남)
 }




뮤텍스와 세마포어의 차이


우리(프로세스)가 방(자원)에 들어가려고 할 때, 뮤텍스는 방에 들어가기 위한 열쇠의 개수이며, 세마포어는 빈 방의 열쇠의 개수이다.

즉 뮤텍스는 한 사람이 빈 방에 대한 열쇠를 가지고 있어서 방에 들어간다면, 그 사람이 나와야만 다른 사람이 열쇠를 건네받아 방을 들어갈 수 있다.

반면 세마포어는 방이 네개면 열쇠도 네개일 것이고 한 사람이 들어갈 때마다 들어갈 수 있는 방은 하나씩 줄어들어 0개가 되면 빈 방이 나올때 까지 대기해야 하는 상황이다. 아무나 먼저 나와야만 방과 열쇠를 한개씩 얻어서 들어갈 수 있다.


1.세마포어는 자원의 상태를 나타내는 일종의 '변수'로써 소유 개념이 아니지만, 뮤텍스는 자원을 점유한 프로세스나 쓰레드가 잠시 소유하였다가 작업이 끝나면 반환하는 개념이다.

2.뮤텍스는 소유하고 있는 쓰레드가 뮤텍스 자원을 해제할 수 있지만 세마포어는 소유하지 않는 쓰레드여도 해제할 수 있다.(?)

3.가장 큰 차이점은 뮤텍스가 동기화 대상이 자원의 하나라면, 세마포어는 하나 이상일 때 사용된다.


'컴퓨터공학 > 운영체제' 카테고리의 다른 글

메모리 관리 전략(2)  (0) 2018.10.28
메모리 관리 전략(1)  (0) 2018.10.27
DeadLock(교착상태)  (0) 2018.10.25
CPU 스케쥴링 알고리즘  (0) 2018.10.24
프로세스와 쓰레드의 차이점  (0) 2018.10.24
쓰레드  (0) 2018.10.24