하나의 자원에는 하나의 context만 접근하는 걸 보장하는 개념
여러 스레드가 공유자원에 동시접근한다면?
스레드의 작업결과가 부정확할 수 있다.
Race Condition을 피하기 위해 임계 영역을 상호배제적으로 만드는 것이 동기화의 목적이다.
Concurrent 시스템의 일반적인 동기화 방법
세마포어변수: 자원의수, 상태를 의미하는 정수값
P(): 임계영역에 들어가기 전의 작업, 세마포어를 감소시킴, 대기
V(): 임계영역에서 나온 후의 작업, 세마포어를 증가시킴, 호출
세마포어에는 busy waiting이 없다. 세마포어 자원이 없는 경우 스레드는 대기큐로 들어간다.
struct semaphore{
int count; //세마포어 자원
queueType queue; //프로세스 큐
};
void semWait(semaphore s){
// 세마포어 자원 감소
s.count--;
// 자원이 없는 경우
if(s.count < 0){
/* 현재 프로세스를 s.queue에 push */
/* 프로세스를 block 상태로 만듦 */
}
}
void semSignal(semaphore s){
// 세마포어 자원 증가
s.count++;
// 누군가 임계영역앞에서 대기중임
if(s.count <= 0){
/* s.queue에서 프로세스를 pop */
/* pop한 프로세스를 ready 상태로 전이 */
}
}
실제 세마포어와 상호배제의 구현은 하드웨어적으로 이루어진다. 소프트웨어로 동기화를 구현하는 것은 불가능하다.
s.count가 음수이면 abs(s.count)가 대기중인 프로세스의 수이다.
세마포어라는 걸 처음 들어봤는데 알아갈 수 있는 글이였던것 같습니당!!