免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4255 | 回复: 13
打印 上一主题 下一主题

跪求模拟“五个哲学家”问题的程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-15 21:02 |只看该作者 |倒序浏览
要求:
1、程序语法
                philosopher   [ -t  <time> ]

<time>是哲学家进餐和沉思的持续时间值,缺省值为2秒。
2、五个哲学家的编号为0~4,分别用五个进程独立模拟。
3、程序的输出要简洁,仅输出每个哲学家进餐和沉思的信息。例如,当编号为3的哲学家在进餐时,就打印:
                philosopher 3 is eating
而当他在沉思时,则打印:
                 philosopher 3 is thinking
除此之外不要输出其他任何信息。
4、利用课堂已教授的知识而不使用线程或IPC机制进行同步。
哪位高手做过这个程序,给点提示,小弟不胜感激!

论坛徽章:
0
2 [报告]
发表于 2008-04-15 21:04 |只看该作者
我们上操作系统课的时候也要求了这个题目的.

论坛徽章:
0
3 [报告]
发表于 2008-04-15 21:05 |只看该作者
又见作业。。。。。

论坛徽章:
0
4 [报告]
发表于 2008-04-15 23:13 |只看该作者
伪码倒是可以写,但是实际程序没写过。

论坛徽章:
0
5 [报告]
发表于 2008-04-15 23:19 |只看该作者
不用IPC ?
课上讲的什么 ?

论坛徽章:
0
6 [报告]
发表于 2008-04-16 00:07 |只看该作者
apue第二版,刚讲完进程控制和进程关系两章
伪代码好弄,就是实现起来有点困难
网上找了段代码,但不知道lock函数是干吗用的??不太懂,哪位高手能帮解释下
具体的lock函数怎么编?
i nclude "apue.h"
i nclude "lock.c"
i nclude "lock.h"


#define      N     5
static char* forks[5]={"fork0","fork1","fork2","fork3","fork4"};

int nsecs=2;                                                      //进餐和沉思的持续时间值,缺省值为2
pid_t  pid;   

  

void philosopher(int i);                                                      
void takeFork(int i);
void putFork(int i);
void thinking(int i,int nsecs);
void eating(int i,int nsecs);


int
main (int argc, char *argv[]) {                                                                                                         
     int i=0;

     if(argc==3 && !strcmp(argv[1],"-t") )  nsecs=atol(argv[2]);                        //修改进餐和沉思的持续时间值 atol函数将字符串转换为整数

           for(i=0;i<N;i++)  initlock(forks);                                                //清除掉上次运行遗留下的文件

           for (i=0;  i<N;  i++){
                pid=fork() ;                                                               //
创建5个进程
                if (pid == 0)  

{                                                                                                
                     philosopher(i);
                }// if
          }//for
     wait(NULL);                                                       //
父进程等待子进程的结束
}


void philosopher(int i)
{   
         while(1) {
                     thinking(i,nsecs);
                      takeFork(i);
                      eating(i,nsecs);
                     putFork(i);
             }
}


void  takeFork(int i)
{        
          if(i == N-1)   {
                             lock(forks[0]);
                             lock(forks);
          }
           else {
                              lock(forks);
                               lock (forks[i+1]);
          }
}


void putFork(int i)
{         
           if(i == N-1)   {
                    unlock(forks[0]);
                    unlock(forks);
           }
          else {
                   unlock(forks);
                   unlock (forks[i+1]);
          }
}


void thinking(int i, int nsecs)
{
        printf("philosopher %d is thinking\n",i);
        sleep(nsecs);
}


void eating(int i,int nsecs)
{  
       printf("philosopher %d is eating\n",i);
      sleep(nsecs);
}

论坛徽章:
0
7 [报告]
发表于 2008-04-16 00:24 |只看该作者
原帖由 cugb_cat 于 2008-4-15 21:05 发表
又见作业。。。。。

呵呵,其实我也不想啊,自己也试着编了下,但是有问题,实在郁闷得慌啊,所以才来这寻求帮助
恳求大侠指导~!

论坛徽章:
0
8 [报告]
发表于 2008-04-16 09:09 |只看该作者

回复 #1 wonderfulboiz 的帖子

有个疑问, 这个哲学家进餐问题本身就是经典IPC问题, 如果不用IPC和线程你要如何做呢?

论坛徽章:
0
9 [报告]
发表于 2008-04-16 09:40 |只看该作者
原帖由 scutan 于 2008-4-16 09:09 发表
有个疑问, 这个哲学家进餐问题本身就是经典IPC问题, 如果不用IPC和线程你要如何做呢?

是不是要用队列之类的东东,采用FIFO,把阻塞的进程入队,等到资源释放后,在出队获取资源,这样做好像蛮复杂的。。

论坛徽章:
0
10 [报告]
发表于 2008-04-16 12:46 |只看该作者
IPC 的全称是 Inter Processes Communication。
是不是两个进程间只要是一点通信,无论是什么“方式”,都要算到里面呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP