메뉴 건너뛰기

그외 개발정보


갓 전역하고 복학해서 운영체제를 머리뽀개져 가며 배우고 있는 불쌍한 복학생입니다. 운영체제...
영~~ 만만한 녀석이 아니더군요.. 이번에 기말 레포트로 나온 프로그램은.. 완전 저의 기를 죽이더군요.. 그래서 인터넷에 운영체제 고수들을 찾아 도움을 청합니다. 문제는 철학자들의 만찬에서 나타나는 문제를 해결하는 c프로그램을 작성하라 인데요...
dead-lock과 starvation 해결인거 같은데..
전혀 손도 못대고 있습니다. 주변의 도움을 허용한 상태라 여기저기 알아보고 있는데
다들 고개를 흔들고 있습니다. ㅠ.ㅠ
기본적인 소스는 찾았는데... 데드락과 기아 문제를
해결하는 프로그램을 완성해 주실 수 있으신지 문의드립니다.
염치없는 행동이지만...
갓 전역한 복학생의 난감함으로 부탁드립니다.

/* The dining philosopher program. */

#include
#include /* for calloc() and exit() */

#define N 5 /* number of philosophers */
#define Busy_Eating 1
#define Busy_Thinking 1
#define Left(p) (p) /* chopstick macros */
#define Right(p) (((p) + 1) % N)

typedef int * semaphore;

semaphore chopstick[N]; /* global array */

int fork(void);
semaphore make_semaphore(void);
void philosopher(int me);
void pick_up(int me);
int pipe(int pd[2]);
void put_down(int me);
int read(int fd, void *buf, unsigned len);
void signal(semaphore s);
void sleep(unsigned seconds);
void wait(semaphore s);
int write(int fd, void *buf, unsigned len);

int main(void)
{
int i;

for (i = 0; i < N; ++i) { /* put chopsticks on the table */
chopstick[i] = make_semaphore();
signal(chopstick[i]);
}
for (i = 0; i < N - 1; ++i) /* create philosophers */
if (fork() == 0)
break;
philosopher(i); /* all executing concurrently */
return 0;
}

/* Acquire chopsticks, input is philosopher number. */

void pick_up(int me)
{
if (me == 0) {
wait(chopstick[Right(me)]);
printf("Philosopher %d picks up right chopstick\n", me);
sleep(1); /* simulate slow picking up to encourage deadlock */
wait(chopstick[Left(me)]);
printf("Philosopher %d picks up left chopstick\n", me);
}
else {
wait(chopstick[Left(me)]);
printf("Philosopher %d picks up left chopstick\n", me);
sleep(1); /* simulate slow picking up to encourage deadlock */
wait(chopstick[Right(me)]);
printf("Philosopher %d picks up right chopstick\n", me);
}
}

/* Relinquish chopsticks, input is the philosopher number. */

void put_down(int me)
{
signal(chopstick[Left(me)]);
signal(chopstick[Right(me)]);
}

/* Philosopher process, input is the philosopher number. */

void philosopher(int me)
{
char *s;
int i = 1;

for ( ; ; ++i) { /* forever */
pick_up(me);
s = i == 1 ? "st" : i == 2 ? "nd" : i == 3 ? "rd" : "th";
printf("Philosopher %d eating for the %d%s time\n", me, i, s);
sleep(Busy_Eating);
put_down(me);
printf("Philosopher %d thinking\n", me);
sleep(Busy_Thinking);
}
}

semaphore make_semaphore(void)
{
int *sema;

sema = calloc(2, sizeof(int)); /* permanent storage */
pipe(sema);
return sema;
}

void wait(semaphore s)
{
int junk;

if (read(s[0], &junk, 1) <= 0) {
printf("ERROR: wait() failed, check semaphore creation.\n");
exit(1);
}
}

void signal(semaphore s)
{
if (write(s[1], "x", 1) <= 0) {
printf("ERROR: write() failed, check semaphore creation.\n");
exit(1);
}
}




  • profile
    글 작성하시기 전에 주황색으로 나오는 경고글을 읽어 보셨는지... .
    나름대로, 게시물을 지워야 하는지- 답글을 달아드려야 하는지 많이 고민했습니다.
    식사하는 철학자 문제는 인터넷상에 자료가 많이 있습니다. 해결책도 덩달아 많이 있구요.
    소스코드를 보아하니 님이 말씀하신 문제를 해결한 내용이 포함되어 있습니다.
    gcc 로 컴파일 하시고, 실행해 보시겠습니까?
제목 날짜
[TIP] NEXUS(넥서스) 5x 루팅 방법입니다. 2016.01.05
mouclass 접근.. 3 2010.03.13
class callback호출시 에러가 나는데 뭐가 문제인지 모르겠습니다..ㅠㅠ 1 2006.07.22
[TIP] NEXUS(넥서스) 5x 루팅 방법입니다. 2016.01.05
mouclass 접근.. 3 2010.03.13
class callback호출시 에러가 나는데 뭐가 문제인지 모르겠습니다..ㅠㅠ 1 2006.07.22
USB Keyboard Filter Driver 제작 관련... 1 2006.11.22
운영체제에서 "철학자들의 만찬" 알고리즘에 대해.. 1 2004.06.04
실시간 동작감지 앱 - 추태(안드로이드용) 2011.05.29
https 패킷 디버깅 5 2012.04.30
"pc용 dos의 설계 및 구현" 책의 diskette 화일을 구합니다. 1 2009.11.10
Soft ICE 기존 사용법 및 내용추가 2002.02.25
플로피 필터 드라이버 관련 질문입니다..답변좀해주세요.. 2 2006.12.12
먼 길을 따라.. 1 2009.12.21
터치스크린 - 마우스제어 2 2010.03.10
[펌]Sony vegas - 영상의 객체를 따라다니는 텍스트 효과(Sony Vegas Motion Tracking Text) 2015.06.02
[TIP] 라즈베리파이 3를 AP로 만들기 (How to make Raspberry Pi 3 to Access point device) 2018.01.22
os를 공부하고 있습니다. 1 2009.12.14
inf 파일을 이용한 드라이버 자동 설치 2 2003.09.23
[TIP] CentOS 7에 MySql 5.7 설치 & 업그레이드 하기 2017.11.15
PC의 메모리 맵 정보 1 2007.04.24
GSector 플로피->하드로 쓰기가 가능한가요? 1 2007.01.26
드라이버의 로딩순서 바꾸기가 가능한가요. 1 2004.08.17
태그 목록
위로