[운영 체제] 철학가의 식사 문제
5769 단어 운영 체제
다섯 명의 철학자가 둥근 탁자 옆에 둘러앉았는데 탁자 중앙에 통심분 한 접시가 있고 각자 앞에 빈 접시가 하나 있고 두 사람 사이에 젓가락이 하나 놓여 있었다.모든 철학자의 행동은 생각하고 배고픔을 느끼고 통심분을 먹는 것이다.통심분을 먹기 위해서는 철학자마다 두 개의 젓가락을 가져가야 하며, 각자 자신의 왼쪽이나 오른쪽에서만 젓가락을 찾을 수 있다.하나의 간단한 해법은 하나의 신호량으로 젓가락을 표시하는데 이 다섯 개의 신호량은 신호량 수조를 구성하고 모든 신호량의 초기값은 1이다. 첫 번째 I철학자의 활동 과목은 다음과 같다.
semaphore chopstick[0…4] = {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] );
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
독서 노트문제1: 한 파일에 10000000개의 기록이 포함되어 있으며, 각 기록의 내용은 7자리의 정수이다.기록은 중복되지 않는다.파일 내용을 읽는 프로그램이 필요하고, 이 기록을 정렬한 후 파일을 출력해야 하며, 메모리는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.