728x90
7.1 고전적인 동기화 문제들
7.1.1 유한 버퍼 문제 (Bounded-Buffer Problem)
- 생산자와 소비자가 공유 버퍼를 사용하는 문제.
- 버퍼는 제한된 크기를 가지며, 생산자는 항목을 생성하고 버퍼에 추가하며, 소비자는 버퍼에서 항목을 제거해 소비한다.
공유 자료구조
int n; // 버퍼 크기
semaphore mutex = 1; // 상호 배제를 위한 이진 세마포어
semaphore empty = n; // 빈 버퍼 슬롯 개수
semaphore full = 0; // 꽉 찬 버퍼 슬롯 개수
생산자 프로세스 구조
while (true) {
produce(); // 항목 생성
wait(empty); // 빈 슬롯 확인
wait(mutex); // 버퍼 접근 제어
add_to_buffer(); // 항목 추가
signal(mutex); // 버퍼 접근 해제
signal(full); // 꽉 찬 슬롯 증가
}
소비자 프로세스 구조
while (true) {
wait(full); // 꽉 찬 슬롯 확인
wait(mutex); // 버퍼 접근 제어
remove_from_buffer(); // 항목 제거
signal(mutex); // 버퍼 접근 해제
signal(empty); // 빈 슬롯 증가
consume(); // 항목 소비
}
7.1.2 Readers-Writers 문제
- 데이터베이스를 여러 프로세스가 공유하는 상황에서 일부는 읽기만, 일부는 쓰기 작업을 수행.
- 쓰기 작업 중에는 다른 프로세스의 접근을 막아야 함.
공유 자료구조
semaphore rw_mutex = 1; // 읽기/쓰기 상호 배제
semaphore mutex = 1; // read_count 업데이트 보호
int read_count = 0; // 읽는 프로세스 수
Reader 프로세스 구조
while (true) {
wait(mutex);
read_count++;
if (read_count == 1) wait(rw_mutex); // 첫 독자만 쓰기 차단
signal(mutex);
read(); // 읽기 작업 수행
wait(mutex);
read_count--;
if (read_count == 0) signal(rw_mutex); // 마지막 독자만 쓰기 허용
signal(mutex);
}
Writer 프로세스 구조
while (true) {
wait(rw_mutex); // 쓰기 접근 제어
write(); // 쓰기 작업 수행
signal(rw_mutex); // 쓰기 접근 해제
}
7.1.3 식사하는 철학자 문제 (Dining-Philosophers Problem)
- 5명의 철학자가 공유 테이블에서 밥을 먹거나 생각하는 문제.
- 각 철학자는 양쪽의 젓가락이 모두 있어야 식사가 가능.
철학자 i의 구조
semaphore chopstick[5] = {1, 1, 1, 1, 1}; // 각 젓가락 초기화
while (true) {
wait(chopstick[i]); // 왼쪽 젓가락 집기
wait(chopstick[(i+1) % 5]); // 오른쪽 젓가락 집기
eat(); // 식사
signal(chopstick[i]); // 왼쪽 젓가락 내려놓기
signal(chopstick[(i+1) % 5]); // 오른쪽 젓가락 내려놓기
think(); // 생각하기
}
데드락 방지 전략:
- 최대 4명만 동시에 테이블에 앉을 수 있게 제한.
- 두 젓가락이 모두 사용 가능할 때만 집도록 변경.
- 홀수 철학자는 왼쪽 젓가락부터, 짝수 철학자는 오른쪽 젓가락부터 집도록 비대칭적 규칙 설정.
728x90
반응형
'운영체제 공룡책' 카테고리의 다른 글
[운영체제 공룡책] 8장 교착상태 (1) | 2025.01.25 |
---|---|
[운영체제 공룡책] 6장 Synchronization Tools(동기화 도구) (1) | 2025.01.02 |
[운영체제 공룡책] 5장 CPU Scheduling (2) | 2024.12.14 |
[운영체제 공룡책] 4장 Threads &Concurrency (1) | 2024.11.26 |
[운영체제 공룡책] 3장 ProcessManagement (4) | 2024.11.20 |