본문 바로가기

전공지식/운영체제

[운영체제] 프로세스 동기화

1. 프로세스 동기화 기법

1.1 뮤텍스

1)뮤텍스

일종의 Locking 매커니즘이다. lock을 가지고 있을 경우에만 공유 데이터에 접근 가능하다. 일부 음식점들은 공용 화장실 관리 차원에서 화장실을 잠궈두고(Locking) 다닌다. 손님들이 화장실에 가려면 주인에게 열쇠를 받은 후 가야한다. 물론 다음 손님이 화장실에 가려면 앞 손님이 열쇠를 반납해야 갈 수 있다. 이렇게 열쇠가 있는 lock을 가지고 있는 경우에만 공유자원(화장실)에 접근할 수 있다. 이게 바로 Mutex라고 보면 된다. 유의할 점은 Lock에 대한 소유권이 있다는 점이다. 열쇠를 획득한 사람만 반납할 수 있다.

2) 세마포어

세마포어는 동시에 리소스에 접근할 수 있는 '허용 가능한 Counter의 갯수'를 가지고 있는 Counter로 보면 된다. 예를 들면 107호 병실에 방문객용 의자가 5개 있다고 치자. 간호사는 이 병실에 방문자가 5명만 들어갈 수 있도록 허용하고 나머지 방문객들은 밖에서 대기하도록 한다. Counter 갯수만큼 공유자원(병실)에 접근할 수 있다. 이 세마포어 Counter의 갯수에 따라 1개의 경우 Binary Semaphore, 2개 이상의 경우 Counting Semaphore라고 불린다. Binary Semaphore의 경우 개념적으로 Mutex와 같다고 볼 수 있다.

3) 모니터

Mutex(Lock)와 Condition Variables(Queue라고도 함)을 가지고 있는 Synchronization 메카니즘이다. 예를 들어 자바에서 모든 객체는 Object 클래스를 상속 받는다. 이 Object 클래스에는 wait(), notifyAll(), notify() 메소드를 가지고 있는데 이게 바로 Condition Variables 역할이라고 보면 된다. 고로 모든 자바 객체는 Monitor를 가지고 있다. 자바에서는 Mutual Exclusion 해결을 위한 구현체로 Synchronized 키워드가 있다. 예를 들어 Synchronized가 메소드에 선언되어있고, 쓰레드A가 이미 Lock을 획득해서 Critical Section(메소드)을 수행중이라고 가정하자. 쓰레드B가 동일한 메소드를 수행하기 위해 해당 Object의 Lock을 획득해야 할 것이다. 이 Lock이 반환될 때까지 대기를 해야하는데 그 때 사용되는게 바로 Monitor다. 쓰레드A가 Lock을 반환하면 쓰레드B는 기다렸다가 Lock을 획득하게 된다. 그리고 Critical Section인 메소드를 수행할 수 있게 된다. 물론 Synchronized 키워드를 사용했을 때 자동적으로 수행되는 내부 동작이고, 별도로 명시적인 Monitor를 구현할 수도 있다. 아무튼 Monitor는 이렇게 Mutex(Lock)과 Condition Variables을 이용해서 Mutual Exclustion을 해결하고 있다. 그 외 Monitor의 다른 정의로는 공유자원에 안전하게 접근하기 위해 Mutual Exclusion가 랩핑된 Thread-Safe한 클래스, 객체, 모듈들을 의미하기도 한다.


4) 뮤텍스와 세마포어의 차이

공유자원에 대한 접근권한, Lock이라는 키를 한 개만 가지고 있는 것은 뮤텍스(mutex)이다.
반면에, Lock이라는 키를 여러 개 가질 수 있는 것은 세마포어(Semaphore)이다.


5) 크리티컬 섹션 (임계 영역과 동기화)

Critical Section (크리티컬 섹션)  을 설정한 구간은 한 번에 하나의 '스레드'에서만 사용가능하다.

- 프로세스 내에 여러 스레드가 있는 환경에서, 우리가 설정해둔 '크리티컬 영역' 에 어떤 스레드가 먼저 진입하여 크리티컬 영역을 벗어나지 않은 상태에서는 동일 프로세스의 다른 스레드에서 해당 크리티컬 영역에 진입하는 것을 금지한다. 

- 후발 스레드의 '크리티컬 섹션' 진입금지 방식에 '리턴' 혹은 '대기'를 설정할 수 있다. '대기'란 선 진입한 스레드가 해당영역을 벗어날때까지 후발 스레드는 '대기' 상태로 있다가  선진입한 스레드가 해당영역 벗어나면 대기중인 후발 스레드가 크리티컬 영역을 실행하는것. '리턴'이란 후발 스레드는 '대기'상태에 있지 않고 '리턴'되어 크리티컬 영역을 실행 하지 않는 방식이다. 

질서가 잘 지켜지고 있다는 말은 임계영역에 접근하는 쓰레드의 순서가 잘 지켜진다는 것을 뜻한다. 동시접근하면 발생하는 문제를 예방하기 위해 동시접근을 예방하는 동시에 한 번에 하나의 쓰레드만 임계영역에 접근할 수 있다록 하는 것이 바로 임계영역 접근 동기화이다.


- 크리티컬 섹션 예제

1. 임계영역에 접근하려는 3개의 쓰레드가 있다. 고양이가 바로 쓰레드이다.


2. 3개의 쓰레드들이 동시에 임계영역에 접근하려고 한다. 하지만 이는 알고 있듯이 문제가 발생한다. 그래서 하나의 쓰레드만 임계영역에 접근할 수 있다. 하나의 쓰레드가 임계영역에 진입하면 다른 쓰레드들은 기다린다. 위 그림에서는 쓰레드들이 잠을 자는 것으로 그려놓았는데, 실제로 BLOCK 상태가 된다. 


3. 먼저 들어간 쓰레드가 임계영역을 빠져나오면, 잠자던(BLOCK 상태) 쓰레드 중에 한 쓰레드가 임계영역에 진입할 수 있다. 진입하지 못한 쓰레드는 계속 잠을 자게 된다.


'전공지식 > 운영체제' 카테고리의 다른 글

[운영체제] 교착상태  (0) 2017.03.09
[운영체제] 프로세스와 쓰레드  (0) 2017.03.09
5장 CPU Schedule  (0) 2016.12.18