본문 바로가기
반도체 그 다음 학문/운영체제 (OS)

운영체제 Mutex Locks & Semaphore

by 전컴반 2022. 5. 12.
반응형
Mutex Locks (Mutual exclusion)

 

프로그래머들이 하드웨어의 지원을 가지고 쉽게 동기화를 사용할 수 있게 API를 만들었는데 이 중 하나가 Mutex이다.

 

boolean변수로 lock이 가능한지 안 한 지 알려준다. 즉, True, False로 CS에 들어갈 수 있나 없나를 판단한다. 이러니 프로세스가 하나밖에 들어갈 수 없다는 의미다.

 

CS를 사용하고 싶을 때는 "acquire()"라는 API를 사용하고, CS를 나왔을 때는 다른 프로세스에게 넘겨주기 위해 "release()"라는 API를 사용한다. 

 

다음 프로세스는 busy waitiing을 할 수밖에 없다는 단점이 있다.( CPU를 계속 사용하면서 대기함 == spin lock ) 하지만 실제로 리눅스에선 RQ (ready queue)에 들어갔다가 나오는데, 상황에 따라 busy watiting을 하는 것이 더 나을 수도 있으니 디자인 옵션으로 지정할 수 있다. 

 

코드를 보자

 

while (true) {
	acquire lock
		critical section
	release lock
remainder section
}

 

Entry와 Exit section이 하나의 함수로 깔끔해질 수 있다. 

 

 

Semaphore

 

CS에 무조건 하나의 프로세스만 들어가는 것이 아니라 종종 2개 이상의 프로세스가 들어가야 되는 경우도 생긴다. 이때 semaphore를 사용한다. integer 변수를 사용하는데.

 

CS에 들어가기 전에 "wait()"를 선언하고 CS에 들어갈 수 있고, 다 사용하고 난 후에는 "signal()"을 선언하여 release 한다. 각각이 어떻게 구성돼 있는지 코드로 보자

 

wait(S) {
    while(S <= 0);
    S--;
}
    

signal(S) {
    S++;
}

 

2가지 종류가 있는데

binary semaphore는 mutex lock과 똑같은 기능을 하고, counting semaphore는 CS에 2개 이상의 프로세스가 들어갈 수 있게 한다. 

 

간단한 예를 들어보자, synch라는 semaphore 변수를 만들고 초기값을 0으로 세팅한다. 그리고 서로 독립적인 프로세스지만 S1이 S2보다 먼저 실행돼야 한다고 하면 아래와 같이 짤 수 있다.

 

P1:
    S1;
    signal(synch);
    
P2;
    wait(synch);
    S2;

 

먼저 P2에서 wait(synch)를 하면 synch는 0이라 대기하고 있다고 S1이 실행되고 singnal에 synch가 들어가면 S++;을 수행한 뒤에 wait는 1로 되오 S2가 실행될 수 있다.

 

 

하지만 똑같이 대기할 때 busy waiting를 하는데 busy waiting 없이 구현하는 방법으로는

semaphore마다 waiting queue를 정해주는 것이다. waiting queue에는 block이라는 기능과 wakeup이라는 기능을 하게 하는데,

 

block을 호출하면 busy waiting에 들어가지 않고 waiting queue에 들어가게 하는 것이다.

wakeup을 호출하면 waiting queue에 있던 프로세스를 ready queue로 옮기는 것이다.

 

 

이렇게 동기화를 해결하기 위한 방법이 있다.

반응형

댓글