프로세스간 메시지를 전송하거나, 공유메모리를 통해 특정 데이터를 공유하게 되는 경우 문제가 발생한다.
즉, 공유된 자원에 여러 개의 프로세스가 동시에 접근 하면서 문제가 발생하는 것으로써 공유된 자원 속 하나의 데이터는 한 번에 하나의 프로세스만 접근할 수 있도록 제한해 두어야 하는데, 이를 위하여 고안된 것이 바로 세마포어(Semaphore)다.
세마포어와 뮤텍스의 차이
- 세마포어(Semaphore): 공유 자원의 데이터 혹은 임계영역(Critical region)등에 여러 Process 혹은 Thread가 접근하는 것을 막아줌.(동기화 대상이 하나 이상)
- 뮤텍스(Mutex): 공유 자원의 데이터 혹은 임계영역(Critical region)등에 하나의 Process 혹은 Thread가 접근하는 것을 막아줌.(동기화 대상이 하나)
세마포어 예)
컴퓨터가 여러 프로그램을 동시에 수행하는 다중 프로그래밍 시스템에서는 프로세스들간의 상호배체와 동기화를 위한 기본적인 연산이 필요하게 되고 세마포어는 여러 프로세스들에 의해 공유되는 변수로 정의된다.
세마포어는 P연산, V연산으로 이루어져있다.
P: S를 1 감소
V: S를 1 증가
이 연산을 이용해 임계영역에 동기적으로 진입하는지)
S를 1로 생각해보고 프로세스는 S가 1일때만 임계영역으로 진입할 수 있다고 볼 경우, S가 0일 경우 진입하지 못한다.
초기 S = 1
P(S) // S가 1 감소되어 0
//critical region start
//공유 자원을 사용할 수 있는 영역
//critical region end
V(S) //S가 증가되어 1
P(S)를 수행하면 S가 1이 감소되어 0이된다. 만약 다른 프로세스가 이 임계영역을 보고 S가 0이면 대기한다. P연산에는 S가 0이라면 대기하는 코드가 들어갈 것이다. 만일 0이 아니라면, 즉 1이상이라면 S를 1감소시킨 후에 임계영역에 들어갈 수 있게 된다.
P(S)의 코드
P(S){
while(S==0){
//S가 0이면 wait
}
S--; //S를 1 감소시킴.
}
V(S)는 S를 하나 증가시킨다. 그렇게 함으로써 P(S)에서 기다리고 있는 프로세스가 S가 1이 되는 순간 진입할 수 있게 해준다.
V(S){
S++;
}
여기서 S에 주목할 필요가 있다. 만일 S가 1이라면 임계영역에 들어갈 수 있는 프로세스는 하나가 된다. 그렇다면 S가 2라면 임게영역에 들어갈 수 있는 프로세스는 2개가 된다.
이렇게 Mutex와 Semephore차이가 생기게 된다.