# 하드웨어에서 이런 명령어를 제공
bool Test_and_Set(bool *flag) {
bool old = *flag;
*flag = True;
return old;
}
lock = false;
repeat
while Test_and_Set(lock) do no-op;
Critical Section
lock = false;
Remainder Section
until false
문제
Spin Lock 이기 때문에 CPU를 계속 써야 함 (Lock 값 계속 체크해야 함)
14. Sleep and Wakeup
busy-waiting 해결 → 임계 구역 진입이 허용되지 않을 때, CPU 시간을 낭비하는 대신 블록 하는 프로세스 간 통신 고려
sleep : 호출자를 block → 다른 프로세스가 깨울 때 (wakeup)까지 보류
wakeup
발생 문제 : 생산자 - 소비자 문제 (한정된 버퍼 문제)
생산자 (producer) : 버퍼에 정보를 삽입
소비자 (consumer) : 버퍼에서 정보를 제거
버퍼가 가득 차 있다면? 생산자를 sleep --> 소비자 수행 후, wakeup
15. Semaphore
화장실이 여러 개 있는 레스토랑, 열쇠 = 칸 개수만
현재 공유자원에 접근할 수 있는 프로세스/스레드 수를 나타내는 값을 두어 상호 배제
Lock시 특정 수만큼의 카운트를 더하고
Unlock시 빼주는 형식으로 처리
이런 락을 슬립( Sleep ) 가능한 락이라고 함
Up, Down은 atomic 하게 동작
생산자 소비자 문제의 근본적 해결
동기화해야 하는 대상이 여러 개일 때 사용
1) 카운팅 세마포어
가용한 개수를 가진 자원에 대한 접근 제어용으로 사용되며, 세마포는 그 가용한 자원의 개수로 초기화된다. 자원을 사용하면 세마포가 감소, 방출하면 세마포가 증가한다.
생산자 소비자 문제와 비교하기
count 하나로 표현되던 부분들이 up, down을 이용하여 mutex, empty, full로 표현
#define N 100 // 버퍼 용량
int mutex = 1; // 공유 데이터를 위한 mutex
int empty = n // 빈 용량
int full = 0 // 찬 용량
void producer(void) {
int item;
while(TRUE) {
item = produce_item(); // item 생성
down(&empty); // if 꽉차지 않았으면 empty--;
down(&mutex); // mutex = 0 으로 해서, lock 처리
insert_item(item); // 버퍼에 추가
up(&mutex); // mutex = 1 으로 해서, unlock 처리
up(&full);
}
}
void consumer(void) {
int item;
while(TRUE) {
down(&full);
down(&mutex);
item = remove_item(); //
up(&mutex);
up(&empty);
consume_item(item);
}
}
2) 이진 세마포어 (MUTEX)
MUTEX라고도 부르며, 상호 배제의 (Mutual Exclusion)의 머릿글자를 따서 만들어졌다. 이름 그대로 0과 1 사이의 값만 가능하며, 다중 프로세스들 사이의 Critical Section 문제를 해결하기 위해 사용한다.
16. Monitor
동기화를 구현하기 위한 특수 프로그램 기법
특정 공유 자원을 프로세스에게 할당하는 데 필요한 데이터와 이 데이터를 처리하는 프로시저로 구성
자료 추상화, 정보 은폐 개념을 기초, 병행성 구조
상호 배제가 low-level 단에서 지원됨
→ "단 하나의 프로세스만 한 순간에 모니터에서 활동할 수 있다."
생산자-소비자 문제 해결
조건 변수 wait, signal 도입
sleep, wakeup과 달리 모니터에서는 자동적으로 상호 배제가 됨→ 문맥교환 될 걱정하지않고 연산 완료 가능
→ wait, signal은 상호배제가 아님
17. Message Passing
send / receive ; 시스템 호출 일종
acknowledgement 분실 문제 -> 메시지 구별 필요
인증 --> 프로세스의 유일성 보장
생산자 - 소비자 문제
공유 메모리가 아닌, 메시지 전달로 해결
가정
모든 메시지는 동일한 크기
메시지는 운영체제에 의해 자동 버퍼링
방법
소비자는 시작할 때, N개의 빈 메시지를 생산자에게 보냄
생산자는 소비자에게 전달할 아이템을 생산하면, 빈 메시지 수신 → 아이템이 들어 있는 메시지 전송