操作系统经典互斥问题哲学家就餐问题

news2024/7/4 4:58:40

问题描述

由Dijkstra提出并解决的哲学家就餐问题是典型的同步问题。该问题描述的是五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替的进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。
如下图所示:
在这里插入图片描述## 问题分析

  1. 关系分析
    在此处,筷子是互斥的信号量,在同一时间只能由一双筷子被使用。
    此外,每位哲学家只有在手上有一双筷子(两只)才能进餐,因为这筷子不是简单的单一信号量,而是应该用数组新式表现出来。

  2. 信号量设置
    设置chopsticks为筷子的互斥信号量,用chopsticks[i]表示左手边的筷子,chopsticks[(i+1)%5]表示右手边的筷子。

假设代码如下,那么会发生什么问题呢?

semaphore chopsticks[5]={1,1,1,1,1};
Pi(){//Pi表示是第i个哲学家的进程,因为每个哲学家进程都实现同样的操作,因此不变化。
	//thinking
	P(chopsticks[i]);	
	P(chopsticks[(i+1)%5]);
	//eating
	V(chopsticks[i])
	V(chopsticks[(i+1)%5]);
}

假设当第一位哲学家执行完P(chopsticks[i]);,也就是拿起一只筷子后,切换到了第二位哲学家的进程,而他也在执行了同样的操作后切换到了第三个哲学家,以此类推。就会变成下图的情况:

在这里插入图片描述
每个人手里都拿着一只筷子,但于此同时又都在等待其他人手里的筷子,最终这种循环等待的情况会造成死锁(此处不展开讨论死锁)。

那么大致的解决方案有三种:

  • 保证至少有一位哲学家手中有一双筷子(两只),可以进行就餐并就餐完毕后释放资源
  • 保证最多只有四位哲学家争夺筷子,不存在五个人,从而保证了必定有一只筷子是空闲的,也就一定会有人能够就餐。
  • 按照哲学家编号分为奇偶筷子,最终会使得至少有一个哲学家有一双筷子

方案一

额外设置一个信号量mutex,用来保证至少有一位哲学家手中有一双筷子(两只)。

//保证至少有一个哲学家左右手都有筷子
semaphore chopsticks[5]={1,1,1,1,1};
semaphore mutex=1;
Pi(){
	//thinking
	P(mutex);
	P(chopsticks[i]);	
	P(chopsticks[(i+1)%5]);
	V(mutex); 
	//eating
	V(chopsticks[i])
	V(chopsticks[(i+1)%5]);
}

方案二

额外设置一个信号量limit,通过设置该信号量初值来保证只有四位哲学家争夺筷子。

//每次只允许四个哲学家进餐
semaphore chopsticks[5]={1,1,1,1,1};
semaphore limit=4;

Pi(){
	//thinking
	P(limit);
	P(chopsticks[i]);	
	P(chopsticks[(i+1)%5]);
	//eating
	V(chopsticks[i])
	V(chopsticks[(i+1)%5]);
	V(limit);
}

方案三

判断序号,如果是偶数序号的人先右后左,如果是奇数则先左后右。


semaphore chopsticks[5]={1,1,1,1,1};

Pi(){
	if(i%2==0){//如果是偶数
		P(chopsticks[(i+1)%5]);
		P(chopsticks[i]);	
		//eating
		V(chopsticks[(i+1)%5]);
		V(chopsticks[i]);	
	}
	else{//如果是奇数
		P(chopsticks[i]);
		P(chopsticks[(i+1)%5]);	
		//eating
		V(chopsticks[i]);
		V(chopsticks[(i+1)%5]);
		
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/903363.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 42题:接雨水

题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,…

c#扩展方法的使用

扩展方法可以向现有类型“添加”方法,无需创建新的派生类型、重新编译或以其他方式修改原始类型,用起来很方便,下面是我写的例子,为string这个常用的类型添加一个showmes方法,以下是扩展方法的代码: public…

React+Typescript 状态管理

好 本文 我们来说说状态管理 也就是我们的 state 我们直接顺便写一个组件 参考代码如下 import * as React from "react";interface IProps {title: string,age: number }interface IState {count:number }export default class hello extends React.Component<I…

【LeetCode-中等题】49. 字母异位词分组

题目 题解一:排序哈希表 思路:由于互为字母异位词的两个字符串包含的字母相同&#xff0c;因此对两个字符串分别进行排序之后得到的字符串一定是相同的&#xff0c;故可以将排序之后的字符串作为哈希表的键。 核心api: //将字符串转换为字符数组char[] ch str.toCharArray();…

【力扣】84. 柱状图中最大的矩形 <模拟、双指针、单调栈>

目录 【力扣】84. 柱状图中最大的矩形题解暴力求解双指针单调栈 【力扣】84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例…

从一到无穷大 #11 Is mmap shit or not?

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 前言mmap原理madvise / mlock / msync放弃使用mmap的理由InfluxdbsinglestoreRocksDB…

链表之第三回

欢迎来到我的&#xff1a;世界 该文章收入栏目&#xff1a;链表 希望作者的文章对你有所帮助&#xff0c;有不足的地方还请指正&#xff0c;大家一起学习交流 ! 目录 前言第一题&#xff1a;判断是否为环形链表第二题&#xff1a;找到两条链表的相交点第三题&#xff1a;返回…

调整逻辑卷的大小

调整逻辑卷的大小 将名字为 vo 的逻辑卷的大小调整到 500MiB &#xff0c;确保文件系统的内容保持不变。 调整后的逻辑卷的大小范围 在 480MiB 到 520MiB 的范围内都是可以接受的。 lsblk lvresize -L 500M /dev/vg0/vo 4. 创建交换分区 向 serverb 添加一个额外的交换…

解决nginx的负载均衡下上传webshell的问题

目录 环境 问题 访问的ip会变动 执行命令的服务器未知 上传大文件损坏 深入内网 解决方案 环境 ps :现在已经拿下服务器了&#xff0c;要解决的是负载均衡问题, 以下是docker环境&#xff1a; 链接: https://pan.baidu.com/s/1cjMfyFbb50NuUtk6JNfXNQ?pwd1aqw 提…

HotSpot虚拟机之内存模型与线程安全

目录 一、线程内存模型 1. 内存模型 2. 内存模型操作 二、Happens-Before原则 三、Java线程 1. 线程实现方式 2. Java线程状态 四、Java线程安全 1. 线程安全程度 2. 锁优化 五、参考资料 一、线程内存模型 1. 内存模型 内存模型主要目的是定义共享变量的访问规则&…

iconfont的使用方法 | 踩过的坑

据 iconfont官网&#xff0c;其使用方法是 拷贝项目下面生成的fontclass代码&#xff0c;挑选相应图标并获取类名。 注意&#xff0c;这个fontclass代码是涵盖了你所有要使用的图标 起因&#xff1a;部分icont图标生效了&#xff0c;部分图标无效。 问题&#xff1a;fontclas…

邮件开发信技巧大公开!

特别是对外贸企业或者跨境电商企业来讲&#xff0c;写邮件开发信仍是一个常用的手。通过邮件开发信&#xff0c;企业可以很快地获得精准客户&#xff0c;同时扩展业务&#xff0c;进行营销活动。但是做过邮件群发的人可能都会遇到类似问题&#xff0c;比如邮件到达率低、邮件回…

Python框架【url_for 函数、重定向、响应内容、自定义响应、模板介绍、模板的使用、过滤器介绍、Jinja模板自带过滤器】(二)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

大数据课程K3——Spark的常用案例

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的常用案例——WordCount&#xff1b; ⚪ 掌握Spark的常用案例——求平均值&#xff1b; ⚪ 掌握Spark的常用案例——求最大值和最小值&#xff1b; ⚪ 掌握…

​8th参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑出版传媒,2022.

​&#xff18;th参考文献&#xff1a;&#xff3b;&#xff18;&#xff3d;许少辉&#xff0e;乡村振兴战略下传统村落文化旅游设计&#xff3b;&#xff2d;&#xff3d;北京&#xff1a;中国建筑出版传媒&#xff0c;&#xff12;&#xff10;&#xff12;&#xff12;&…

根据源码,模拟实现 RabbitMQ - 内存数据管理(4)

目录 一、内存数据管理 1.1、需求分析 1.2、实现 MemoryDataCenter 类 1.2.1、ConcurrentHashMap 数据管理 1.2.2、封装交换机操作 1.2.3、封装队列操作 1.2.4、封装绑定操作 1.2.5、封装消息操作 1.2.6、封装未确认消息操作 1.2.7、封装恢复数据操作 一、内存数据管理…

机器学习深度学习——NLP实战(情感分析模型——数据集)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——BERT&#xff08;来自transformer的双向编码器表示&#xff09; &#x1f4da;订阅专栏&#xff1a;机器…

【数据结构】_7.二叉树

目录 1.树形结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的应用—表示文件系统的目录树结构 ​编辑​2.二叉树 2.1 概念 2.2 特殊二叉树 2.3 二叉树的性质 2.4 二叉树的存储结构 2.4.1 顺序存储结构&#xff08;数组存储结构&#xff09; 2.4.2…

LeetCode--HOT100题(36)

目录 题目描述&#xff1a;146. LRU 缓存&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;146. LRU 缓存&#xff08;中等&#xff09; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache…