philosophers.ko.pdf

개발일지

궁금한점

철학자 문제 해결 개선안

/*
** i 번째 철학자가 식사를 할 준비가 되었는지 확인한다.
** 양 옆의 철학자가 식사를 하고 있지 않아 젓가락을 모두 이용할 수 있다면, 철학자가 take_chopsticks에서 wait하지 않도록 signal을 보낸다.
** 주어진 조건을 만족하는 경우에는 philo[i]의 값이 1이므로 take_chopsticks에서 Block되지 않고 EATING 할 수 있다.
*/

check(int i)
{
	if (state[i] == THINKING && state[LEFT] != EATING && state[RIGHT] != EATING)
	{
		state[i] = EATING;
		signal(philo[i]);
	}
}

/*
** mutex를 통해 i 번째 철학자의 상태를 변경한다.
** check를 통해 양쪽 철학자의 상태를 확인한다.
** i 번째 철학자는 자신이 식사를 할 수 있을 때까지 기다린다.
*/

take_chopsticks(int i)
{
	wait(mutex);
	state[i] = THINKING;
	check(i);
	signal(mutex);
	wait(philo[i]);
}

/*
** mutex를 통해 i 번째 철학자의 상태를 변경한다.
** check를 통해 왼쪽 철학자와 오른쪽 철학자의 양 옆을 확인한다.
** 둘 중 식사가 가능한 철학자에게 check 내부에서 signal을 보낸다.
*/

put_chopsticks(int i)
{
	wait(mutex);
	state[i] = SLEEPING;
	check(LEFT);
	check(RIGHT);
	signal(mutex);
}

/*
** Solution
*/

do
{
		...
		THINKING
		...
	take_chopsticks(i)
		...
		EATING
		...
	put_chopsticks(i);
		...
		SLEEPING
		...
} while (1);

현재 상황

과정

  1. 철학자3가 take_chopsticks함수로 들어감

    take_chopsticks(int i)
    {
    	wait(mutex);
    	state[철학자3] = THINKING;
    	check(철학자3);
    	signal(mutex);
    	wait(philo[철학자3]);
    }
    
  2. 철학자2가 put_chopsticks함수로 들어감

    put_chopsticks(int i)
    {
    	wait(mutex);
    	state[철학자2] = SLEEPING;
    	check(철학자1);
    	check(철학자3);
    	signal(mutex);
    }
    

context switch