운영체제 공룡책

[운영체제 공룡책] 7장 동기화 예제

studyingalone 2025. 1. 15. 19:05
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(); // 생각하기
    
}

 

데드락 방지 전략:

  1. 최대 4명만 동시에 테이블에 앉을 수 있게 제한.
  2. 두 젓가락이 모두 사용 가능할 때만 집도록 변경.
  3. 홀수 철학자는 왼쪽 젓가락부터, 짝수 철학자는 오른쪽 젓가락부터 집도록 비대칭적 규칙 설정.

 

 

 

728x90
반응형