[운영 체제] 철학가의 식사 문제

5769 단어 운영 체제
문제.
다섯 명의 철학자가 둥근 탁자 옆에 둘러앉았는데 탁자 중앙에 통심분 한 접시가 있고 각자 앞에 빈 접시가 하나 있고 두 사람 사이에 젓가락이 하나 놓여 있었다.모든 철학자의 행동은 생각하고 배고픔을 느끼고 통심분을 먹는 것이다.통심분을 먹기 위해서는 철학자마다 두 개의 젓가락을 가져가야 하며, 각자 자신의 왼쪽이나 오른쪽에서만 젓가락을 찾을 수 있다.하나의 간단한 해법은 하나의 신호량으로 젓가락을 표시하는데 이 다섯 개의 신호량은 신호량 수조를 구성하고 모든 신호량의 초기값은 1이다. 첫 번째 I철학자의 활동 과목은 다음과 같다.
semaphore chopstick[04] = {1,1,1,1,1};
Repeat
   think;
   wait(chopstick[i]);
    wait(chopstick[(i+1) mod 5]);
    eat;
    signal(chopstick[i]);
    signal(chopstick[(i+1) mod 5]);
until false;     

다섯 명의 철학자가 동시에 배고파서 각자 왼쪽 젓가락을 들면 다섯 개의 신호량인 chopstick가 모두 0이 된다. 그들이 오른쪽 젓가락을 잡으려고 할 때 젓가락이 없어서 무기한으로 기다리게 된다. 즉, 자물쇠가 사라질 수도 있다.사라진 자물쇠의 발생을 방지하기 위해 철학가의 식사 문제에 대한 개선 해법: 방법1: 네 명의 철학자가 동시에 왼쪽 젓가락을 가지도록 허락하면 적어도 한 명의 철학자가 식사를 할 수 있고 다 쓴 후에 두 개의 젓가락을 놓아서 다른 사람이 사용할 수 있다.방법2: 철학자의 좌우 젓가락을 모두 들 때만 식사를 허용한다.방법3: 홀수호 철학자가 먼저 왼쪽 젓가락을 들고 오른쪽 젓가락을 들도록 규정하는데 짝수호 철학자는 반대이다.이 세 가지 방법을 PV 작업으로 설명하십시오.
해결 방법
방법 1
기껏해야 네 명의 철학자가 동시에 왼쪽 젓가락을 가지도록 허락할 수 있을 뿐, 최종적으로 적어도 한 명의 철학자가 식사를 할 수 있을 뿐만 아니라, 다 쓴 후에 두 개의 젓가락을 놓아서 다른 사람이 사용하도록 제공할 수 있다
int chopstick[5] = {1, 1, 1, 1, 1};
int man = 4;  //  4        
Philosopher( int i ) {  // i    
    while( true ) {
        think();
        wait( man );  //           4 
        wait( chopstick[i] );
        wait( chopstick[ (i+1)%5 ] );
        eat();
        signal( chopstick[i] );
        signal( chopstick[(i+1)%5] );
        signal( man );
    }
}

방법 2
철학가의 좌우 젓가락을 모두 들 때만 식사를 허락할 수 있으며, 그렇지 않으면 든 젓가락을 내려놓을 수 없다
1)     (2),   AND    

int chopstick[5] = {1, 1, 1, 1, 1};
Philosopher( int i ) {
    while( true ) {
        think();
        Swait( chopstick[i], chopstick[(i+1)%5] );
        eat();
        Ssignal( chopstick[i], chopstick[(i+1)%5] );
    }
}

(2)   PV  

//       ,                
int chopstick[5] = {1, 1, 1, 1, 1};
int muitex = 1;
Philosopher( int i ) {
    while( true ) {
        think();
        wait( mutex );
        wait( chopstick[i] );
        wait( chopstick[(i+1)%5] );
        signal( mutex );
        eat();
        signal( chopstick[i] );
        signal( chopstick[(i+1)%5] );
    }
}

방법 3
홀수 번호를 정한 철학자는 먼저 그의 왼쪽 젓가락을 들고 나서 그의 오른쪽 젓가락을 가져간다.짝수 호의 철학자는 상반된다
int chopstick[5] = {1, 1, 1, 1, 1};
Philosopher( int i ) {
    while( true ) {
        think();

        if( i % 2 ) {  //      
            wait( chopstick[i] );
            wait( chopstick[(i+1)%5] );
        } else {  //      
            wait( chopstick[(i+1)%5] );
            wait( chopstick[i] );
        }

        eat();
        signal( chopstick[i] );
        signal( chopstick[(i+1)%5] );
    }
}

좋은 웹페이지 즐겨찾기