哲学家进餐问题

豆子 豆子     2022-08-27     491

关键词:

哲学家就餐问题之解

1. 引言

问题描述: 5个哲学家围坐在一个圆桌上,每两个哲学家之间都有一只筷子,哲学家平时进行思考,只有当他们饥饿时,才拿起筷子吃饭。规定每个哲学家只能先取其左边筷子,然后取其右边筷子,然后才可以吃饭。

2. 求解方法

  1. 信号量设置。定义互斥信号量数组chopstick[5] = {1, 1, 1, 1, 1}, 用于对5个筷子的互斥访问。

    对哲学家按顺序从0~4编号,哲学家i左边的筷子编号为i, 哲学家右边的筷子编号为(i+1)%5.

     
    //定义信号量数组chopstick[5],并初始化i号哲学家的进程
    semaphore chopstick[5] = {1,1,1,1,1};
    Pi() {
      do {
        P(chopstick[i]);       //取左边筷子
        P(chopstick[(i+1)%5]); //取右边筷子
        eat;                   //进餐
        V(chopstick[i]);       //放回左边筷子
        V(chopstick[(i+1)%5]); //放回右边筷子
        think;                 //思考
      } while (1);
    }

     

  2. 为了防止死锁的发生,可以对哲学家进程施加一些限制条件,比如至多允许四个哲学家同时进餐;仅当一个哲学家左右两边的筷子都可用时才允许他抓起筷子; 对哲学家顺序编号, 要求奇数号的哲学家先抓起左边的筷子,然后再转他右边的筷子, 而偶数号哲学家则刚好相反。

    正解指定规则如下: 假设采用第二种方法, 当一个哲学家左右两边的筷子都可以用时, 才允许他抓起筷子。

    //初始化信号量
    semaphore chopstick[5] = {1,1,1,1,1};
    semaphore mutex = 1;       //设置取筷子的信号量
    Pi() {                     //i号哲学家的进程
      do {
        P(mutex);              //在取筷子前获得互斥量
        P(chopstick[i]);       //取左边筷子
        P(chopstick[(i+1)%5]); //取右边筷子
        V(mutex);              //释放取筷子的信号量
        eat;                   //进餐
        V(chopstick[i]);       //放回左边筷子
        V(chopstick[(i+1)%5]); //放回右边筷子
        think;                 //思考
      } while(1);
    }

     

     

3. 结语

  • 哲学家进餐问题的思维精髓是: 考虑能不能一次拿起两只筷子才做决定的话,就会避免死锁问题.

 

(考研)哲学家进餐问题(附代码)

问题描述一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭,如图2-10所示。哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿的时候,才试图拿... 查看详情

哲学家进餐

问题描述一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭,如图2-10所示。哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿的时候,才试图拿... 查看详情

哲学家进餐问题 - 只有 2 个线程有效

】哲学家进餐问题-只有2个线程有效【英文标题】:Diningphilosophersproblem-only2threadworked【发布时间】:2020-05-0523:01:09【问题描述】:我正在尝试解决diningphilosophersproblem。就我而言,每个哲学家都应该吃1,000,000次。问题是它似乎只... 查看详情

ipc之哲学家进餐问题

问题:  1965年,Dijkstra提出并解决了一个他称之为哲学家进餐的同步问题。   “五个哲学家围坐在一张圆桌周围,每个哲学家的前面都有一份通心面,由于面条很滑,必须使用2把叉子才能夹住。相邻2份通心面之间有1把叉... 查看详情

哲学家进餐问题

哲学家就餐问题之解1.引言问题描述:5个哲学家围坐在一个圆桌上,每两个哲学家之间都有一只筷子,哲学家平时进行思考,只有当他们饥饿时,才拿起筷子吃饭。规定每个哲学家只能先取其左边筷子,然后取其右边筷子,然后... 查看详情

哲学家进餐问题的死锁问题

...请求保持条件利用原子思想完成。即只有拿起两支筷子的哲学家才可以进餐,否则,一支筷子也不拿。解法一:利用AND机制实现第1位哲学家的活动描述为:philosopher(intI)while(true)思考;swait(chopstick[(I+1)]%5,chopstick[I]);进餐;Ssignal(ch... 查看详情

操作系统结合哲学家进餐问题分析如何预防死锁(代码片段)

零、哲学家进餐问题  哲学家就餐问题可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐... 查看详情

经典进程的同步问题(生产者--消费者问题哲学家进餐问题读者--写者问题)(代码片段)

文章目录生产者--消费者问题分析实现哲学家进餐问题方法一:最多4人同时拿左筷子,最终保证一人能进餐方法二:同时给左右筷子解法1:AND信号量解法2:信号量保护机制方法三:让奇数先左后右,... 查看详情

操作系统经典的同步问题(生产者消费者问题,哲学家进餐问题,读写问题)

...就引出了进程同步中的经典问题: 生产者消费者问题,哲学家进餐问题,读写问题 生产者-消费者问题有一群生产者进程在生产产品,并将这些产品提供给消费者进程取消费.为使生产者进程与消费者进程能并发进行,在两者间... 查看详情

哲学家就餐问题与死锁总结

...一种头尾相接的循环等待资源关系先写一个会造成死锁的哲学家问题。当所有哲学家同时决定进餐,拿起左边筷子时候,就发生了死锁。解决方案一:破坏死锁的循环等待条件。不再按左手边右手边顺序拿起筷子。选择一个固定... 查看详情

(王道408考研操作系统)第二章进程管理-第三节11:哲学家进餐问题

...-第三节9:读者写者问题一:问题描述一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子中间是一碗米饭哲学家只干两件事情:思考和进餐哲学家在思考时,不影响别人哲学饥饿时,才试图拿起左、右两根筷... 查看详情

操作系统|经典进程的同步问题(生产者--消费者问题哲学家进餐问题读者--写者问题)(代码片段)

文章目录生产者--消费者问题分析实现哲学家进餐问题方法一:最多4人同时拿左筷子,最终保证一人能进餐方法二:同时给左右筷子解法1:AND信号量解法2:信号量保护机制方法三:让奇数先左后右,... 查看详情

操作系统王道考研2019第二章:进程管理--吸烟者问题&读者-写者问题&哲学家进餐问题

1.吸烟者问题1.1问题描述1.2问题分析1.3代码实现1.4小结2.读者-写者问题2.1问题描述2.2问题分析2.3如何实现问题解决:2.4小结3.哲学家进餐问题3.1问题描述3.2问题分析解决方法(3个):3.3代码实现 查看详情

1226-哲学家进餐(代码片段)

问题描述https://leetcode-cn.com/problems/the-dining-philosophers/求解思路题目没有提供C语言解决方案,只能采用C++,C++有一套自己封装了POSIX的线程库,然而我并不会用,只能还是调用底层的sem_t互斥量及其相关... 查看详情

吸烟者问题读者—写者问题以及哲学家进餐问题的实现(代码片段)

一、吸烟者问题假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草、第二... 查看详情

吸烟者问题读者—写者问题以及哲学家进餐问题的实现(代码片段)

一、吸烟者问题假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草、第二... 查看详情

进程调度模拟——哲学家进餐问题(代码片段)

...面,5个盘子,5把筷子,5个座位上可以座5个哲学家,当哲学家就坐以后,其左右有且仅有一个筷子,每个筷子左又有且仅有一个哲学家。哲学家动作:思考,取筷(需要两个),取面... 查看详情

操作系统第6次实验报告:使用信号量解决进程互斥访问(代码片段)

李微微201821121001计算18111.选择哪一个问题哲学家进餐问题有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,平时哲学家进行思考,饥... 查看详情