[운영체제] 세마포어 : 세마포어를 사용한 프로세스 동기화
세마포어
세 개의 특수한 명령들만 접근할 수 있게 허용되는 보호된 변수
높은 수준 (프로그래밍 언어와 운영체제 수준에서 병행성을 위해 제공되는 기법) 에서 상호배제 명령을 구현할 수 있음
무슨말이지?
소프트웨어상에서임계구역 문제를 해결하기 위한 동기화 도구
멀티프로그래밍 환경에서 공유 자원에 대한 접근을 제한하는 방법
공유된 자원에 여러 프로세스가 동시에 접근하면서 문제가 발생할 수 있다.
이때 공유된 자원의 데이터는 한 번에 하나의 프로세스만 접근할 수 있도록 제한을 둬야 한다.
이를 위해 나온 것이 바로 '세마포어'
세마포어의 종류
변수가 가질 수 있는 값의 범위에 따라 종류가 구분된다.
이진 세마포어 : 세마포어가 0, 1 값을 가짐
계수(Counting) / 정수(Integer) 세마포어 : 세마포어가 음이 아닌 모든 정수 값을 가짐
세마 포어를 위한 명령 = 비분리(Indivisble)명령 = 동시에 일어나지 않는다
세마포어 값을 초기화 하는 명령 : P명령, V명령
(P명령 = wait, signal / V명령 = down, up 으로 쓰기도 함)
한 프로세스가 P 혹은 V를 수행하고 있는 동안 프로세스가 인터럽트 당하지 않게 된다.
P명령과 V명령은 세마포어인 S만을 매개변수로 한다 ( == S에 대한 접근은 P, V명령으로만 가능하다)
세마포어 구현 방법
P(S);
// --- 임계 구역 ---
V(S);
P와 V를 사용하여 임계 구역에 대한 상호배제 구현 가능
P(S) if (S > 0) {
then S = S - 1;
else S > 0; // 조건이 만족될 때까지 큐에서 대기
}
// 임계 구역
V(S) if (큐에서 대기 중인 프로세스들이 존재) {
then 그 중의 한 프로세스를 준비 또는 준비에 아무도 없으면 실행 상태로 만듦;
else S = S + 1;
}
P명령 (최초 S값은 1이다)
S가 0보다 크면 S를 1 감소시킨다.
그렇지 않으면 S가 0보다 크길 기다린다. (이진 세마포어일 때는 1이길 기다림)
S를 0으로 만든다 = 다른 프로세스가 들어오지 못하게 한다.
V명령
프로세스들이 존재하면 그 중 한 프로세스를 준비, 준비에 아무도 없으면 실행상태로 만든다.
그렇지 않으면 S를 1 증가시킨다.
S를 1로 만든다 = 원위치
최초 S 값은 1이고, 현재 해당 구역을 수행할 프로세스 A, B가 있다고 가정하자
- 먼저 도착한 A가 P(S)를 실행하여 S를 0으로 만들고 임계구역에 들어감
- 그 뒤에 도착한 B가 P(S)를 실행하지만 S가 0이므로 대기 상태
- A가 임계구역 수행을 마치고 V(S)를 실행하면 S는 다시 1이 됨
- B는 이제 P(S)에서 while문을 빠져나올 수 있고, 임계구역으로 들어가 수행함
Busy wait 방식
어떤 조건을 만족하지 못할 경우에, 그 조건을 만족할 때 까지 다른 작업을 수행하지 않고 기다리는 경우
세마포어가 0 이하라면 CPU는 하염없이 기다려야 한다...
Block & Wake up (Sleep)
어떤 조건을 만족시키지 못하면 특정 시간동안 sleep상태로 프로세스를 두고, 이후에 조건을 확인하는 방식
세마포어에서 임계구역 진입을 시도했지만 실패한 프로세스에 대해 Block 시키고 임계구역에 자리가 날 때 다시 깨운다.
Busy wait vs Block & Wake up 장단점
Busy wait | Block & Wake up | |
장점 | 일이 끝나면 지체없이 바로 다음 실행 | cpu 활용 |
단점 | cpu 낭비 ( 프로세스가 계속해서 condition검사 ) | wake up -> ready 과정으로 즉각적인 반응과 실행 불가 OS개입 필요 (커널 개입 필요) |
참고
책 ) 누워서 보는 운영체제 이야기
블로그 ) https://velog.io/@youngminss/OS-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%8F%99%EA%B8%B0%ED%99%942