프로세스 동기화 (2)

강창민·2022년 5월 10일
0

동기화 도구 : Semaphore


세마포어 (Semaphore)란 무엇인가?

세마포어는 테스트될 수 있는 음이 아닌 정수 변수를 두 개(P,V)의 분할할 수 없는 함수에 의해서 변경가능한 기법을 말한다.

아래는 P와 V에 관한 설명이다.

  • V = 증가시키다 / P = 테스트하다.
  • V(s) : [s = s+1]
  • P(s) : while(s==0) {wait} ; s = s-1

이러한 세마포어 기법을 활용하면, 앞전 포스팅에서 발생하였던 은행 계좌 문제를 쉽게 해결할 수 있다.

아래 이미지에서 만약, CPU에 의해 p0가 실행했다고 가정하자.
현재 semaphore 타입의 변수 mutex는 1로 초기화 되어있다.

진행순서는 다음과 같다.

  1. p0에서 P(mutex)가 실행되면, while문 조건에 위배되어 mutex = mutex - 1이 실행된다.
  2. 만약 중간에 CPU스케줄러에 의해, p1에게 CPU를 할당해준다고 하여도 p1의 P(mutex)에서 while(mutex==0)조건에 해당하기 때문에, wait명령을 수행하게 된다. 이와 같은 이유로인해, 앞전 포스팅에서 발생하였던 CS(Critical Section)에 대한 Race Condition을 해결할 수 있다. 만약 스케줄러가 다시 p0으로 CPU를 할당한다면, 이제 balance += amount 줄이 실행될 것이고, V(mutex)가 실행된다면 다시 mutex를 1증가시켜 p1의 P(mutex)가 동작할 수 있게 된다.
  3. 위와 같은 방법으로 CS에 대한 Race Condition없이 정상적으로 프로세스를 마칠 수 있게 된다.

👌공유 자원이 2개인 경우에는 semaphore타입의 변수를 2개 생성하여 각각의 용도에 맞게 P,V를 사용하면 된다.


Semaphore의 사용

1. Counting semaphore
가용한 개수를 가진 자원 에 대한 접근 제어용으로 사용되며, 세마포는 그 가용한 자원의 개수로 초기화 된다. 자원을 사용하면 세마포가 감소, 방출하면 세마포가 증가 한다.

예를 들어, 현재 사용 가능한 CS가 5개가 있다고 가정하자. 서로 다른 프로세스(또는 쓰레드)
들이 CS에 접근을 시도하면, 사용가능한 자원의 수(5개)가 하나씩 감소한다. 그러다가 0이 되면, 더이상 다른 쓰레드는 사용을 하지 못하며 오직, 현재 CS를 사용중인 쓰레드가 자원을 다 쓰고 반납하면 반납한 개수만큼, 다른 쓰레드가 CS를 사용 가능하다.

2. Binary semaphore
0과 1사이의 정수 값 범위

위에서 다룬 예시의 mutex와 같다.

위와 같이 semaphore의 사용으로 다양한 동기화 문제를 해결 가능하다.


Semaphore사용의 단점

😂1. Busy Waiting

P(mutex)를 실행하려는 프로세스(또는 쓰레드)는 다른 프로세스가 사용중인 CS를 내놓기 전까지 계속 무한루프(while문)돌며 busy waiting해야 한다.

마치 자동차가 공회전하는 것과 같아서 CPU의 낭비가 심하다.

😂2. Deadlock

두개 이상의 프로세스가 서로 필요로하는 CS를 가지고 있을 때 상대방의 CS를 무한정 기다리는 상태이다.

자세한 설명은 다음포스팅에서 하겠습니다!

아주 자세하게 할 것임!

profile
오늘 그것을 할 수 없다면, 대체 무슨 근거로 내일 그것을 할 수 있다고 생각하는가?

0개의 댓글