哲学家进餐问题
1.操作系统的概念与功能2.操作系统的特征3.操作系统的发展与分类4.操作系统的运行机制5.中断和异常6.系统调用7.计算机系统体系结构8.操作系统引导 (Boot)9.虚拟机10.进程的概念、组成、特征11.进程的状态与转换、进程的组织12.进程控制13.进程通信14.线程的概念、作用和属性15.线程的实现方式和多线程模型16.线程的状态与转换、组织与控制17.调度的概念与层次18.进程调度的时机、方式、切换与过程19.闲逛进程20.调度算法的评价指标21.调度算法22.调度算法(一)23.调度算法(二)24.调度算法(三)25.进程同步与进程互斥26.进程互斥的软件实现方法27.进程互斥的硬件实现方法28.互斥锁29.信号量机制30.信号量实现进程互斥、同步、前驱关系31.生产者-消费者问题32.多生产者-多消费者问题33.吸烟者问题34.读者-写者问题
35.哲学家进餐问题
36.管程37.死锁38.死锁的处理策略39.(一)预防死锁40.(二)避免死锁41.(三)死锁检测和解除42.内存的基础知识43.内存管理的概念44.覆盖与交换45.连续分配管理方式46.动态分区分配算法47.基本分页存储管理的基本概念48.基本地址变换机构49.具有快表的地址变换机构50.两级页表51.基本分段存储管理方式52.段页式管理方式53.虚拟内存的基本概念54.请求分页管理方式55.页面置换算法56.页面分配策略57.内存映射文件58.初识文件管理59.文件的逻辑结构60.文件目录61.文件的物理结构(文件分配方式)62.逻辑结构与物理结构63.文件存储空间管理64.文件的基本操作65.文件共享66.文件保护67.文件系统的层次结构68.文件系统的全局结构(布局)69.虚拟文件系统&文件系统挂载(安装)70.IO设备的概念和分类71.IO控制器72.IO控制方式73.IO软件层次结构74.IO应用程序接口&设备驱动程序接口75.IO核心子系统76.假脱机技术(SPOOLing技术)77.设备的分配与回收78.缓冲区管理79.磁盘的结构80.磁盘调度算法81.减少延迟时间的方法82.磁盘的管理83.固态硬盘哲学家进餐问题
一、问题背景及分析
(一)基本分析及实现
每个进程争抢地使用一种资源,其中若分配不当会导致死锁现象。
基本实现:
(二)避免死锁发生的三种方法(仍有很多种,这里仅作列举参考)
(1)限制资源容量
可以对哲学家进程施加一些限制条件,比如最多允许四个哲学家同时进餐。这样可以保证至少有一个哲学家可以拿到左右两只筷子。
这里代码实现可将资源数量设置为4。
(2)以奇偶特征分开
要求奇数号哲学家先拿左边的筷子,然后再拿右边的筷子,而偶数号哲学家刚好相反。用这种方法可以保证如果相邻的两个奇偶号哲学家都想吃饭,那么只会有其中一个可以拿起第一只筷子,另一个会直接阻塞。这避免了占有一支后再等待另一只的情况。
(3)仅当一个哲学家左右两只筷子都可用时才允许他抓起筷子
详细见 二、
二、问题实现
三、问题思考
(注:对上面的实现的思考)
理解:情景:A 先吃饭
- 若另一个相邻的哲学家 B 在 A 仍在 mutex 的 P、V 操作时也想来吃饭,则会因 P 操作阻塞。
- 若另一个相邻的哲学家 B 在 A 吃饭时(A 已释放了 mutex 资源)也想来吃饭,则会因其中一个拿起筷子操作阻塞。
- 在 2. 的基础上若还有哲学家 C 也想吃饭,则会在 P(mutex) 阻塞(B在占用并处于阻塞状态)
- 即 3. 的问题可能导致:明明 C 不在 A 隔壁,且两边都有筷子,却因 P(mutex) 阻塞 (被其他人占用且处于阻塞)而吃不到饭
- 同时会带来效率低下等其他问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)