前言

解决同步互斥问题的思路,源于对王道讲解的总结笔记

同类型题目:

【考研】操作系统:2015年真题45(同步互斥问题)_住在阳光的心里的博客-CSDN博客

【考研】操作系统:2014年真题47(同步互斥问题)_住在阳光的心里的博客-CSDN博客

【考研】操作系统:2009年真题45(同步互斥问题)_住在阳光的心里的博客-CSDN博客

一、思路

解决同步互斥问题,思路步骤:

1. 分析各进程之间的同步互斥关系;

2. 设置互斥信号量 mutex = 1、同步信号量(一般设可使用的资源数为empty = N)。

3. 最好画出同步互斥关系图,并判断属于哪一种类型,如生产者-消费者问题、读者-写者问题、哲学家进餐问题、吸烟者问题。

二、题目

(建议先回顾经典的哲学家进餐问题:在本文最后)

43. 有 n (n >= 3) 位哲学家围坐在一张圆桌边,每位哲学家交替地就餐和思考。在圆桌中心有 m (m >= 1) 个碗,没两位哲学家之间有 1 根筷子。每位哲学家必须取到一个碗和两侧的筷子之后,才能就餐,进餐完毕,将碗和筷子放回原位,并继续思考。为使尽可能多的哲学家同时就餐,且防止出现死锁现象,请使用信号量的 P、V 操作(wait(), signal() 操作)描述上述过程中的互斥与同步,并说明所用信号量及初值的含义。

解:

传统的哲学家问题:

假设餐桌上有 n 个哲学家,n 根筷子。为避免死锁,限制至多 n - 1 个哲学家同时“抢”筷子,那么至多会有 1 个哲学家可以获得两根筷子并顺利进餐。

对于本题:n 位哲学家,n 根筷子,m 个碗。

利用碗这个限制资源来避免死锁:

(1)m < n, bowl = m;

碗的数量小于哲学家数量,此时最多允许 m 个哲学家进餐,确保不会出现所有哲学家都拿一侧筷子而无限等待另一侧筷子所造成死锁现象。

(2)m > n, bowl = n - 1;

碗的数量大于哲学家数量,此时保证最多只有 n - 1 个哲学家同时进餐。

所以 bowl = min{n-1, m};

再定义互斥信号量数组 chopsticks[n],利用 for 循环对 n 个数组元素赋值为1。

哲学家按顺序编号为 0 ~ n - 1,哲学家 i 左边筷子编号为 i,右边筷子编号为 (i + 1) % n。

完整代码:

//信号量
semaphore bowl;   // 用于协调哲学家对碗的使用
semaphore chopsticks[n];  // 用于协调哲学家对筷子的使用for(int i = 0; i < n; i++)chopsticks[i].value = 1;  // 设置两个哲学家之间筷子的数量,或者用 chopsticks[i] = 1;bowl.value = min(n-1, m);  // bowl.value <= n-1,确保不死锁;或者用 bowl = min(n-1,m); CoBegin
Pi(){while(True){               //哲学家 i 的程序思考;P(bowl);        //取碗P(chopsticks[i]);      //取左边筷子P(chopsticks[(i + 1) MOD n]);       //取右边筷子就餐;V(chopsticks[i]);V(chopsticks[(i + 1) MOD n]);V(bowl);}
}
CoEnd

三、哲学家进餐问题

1、问题描述:五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在桌子上有五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐毕,放下筷子继续思考。请使用信号量的P、V操作(wait( )、 signal( )操作)描述上述过程中的互斥与同步,并说明所用信号量及初值的含义。

2、为避免死锁,有三种解决方法:

1)最多允许4位哲学家同时进餐

2)只有当一名哲学家左右两边筷子都可用时,才允许他抓起筷子。

3)偶数号哲学家先拿左边筷子,奇数号哲学家拿右边筷子

方法一:最多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。

定义信号量 count,只允许4个哲学家同时进餐,这样就能保证至少有一个哲学家可以就餐。

semaphore chopstick[5] = {1, 1, 1, 1, 1};  // 初始化信号量semaphore count = 4; // 设置一个count,最多有四个哲学家可以进来Pi(int i){while(true){思考;P(count);   // 请求进入房间进餐 当 count 为 0 时,不能允许哲学家再进来了P(chopstick[i]);   // 请求左手边的筷子P(chopstick[(i + 1) % 5]);   // 请求右手边的筷子进餐;V(chopstick[i]);   // 释放左手边的筷子V(chopstick[(i + 1) % 5]);   // 释放右手边的筷子V(count);   // 离开饭桌释放信号量}}

方法二:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。设置信号量 mutex 对取左边和右边筷子进行互斥操作。

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

方法三:规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数号的哲学家则先拿起他右边的筷子,然后再去拿他左边的筷子。按此规定,将是1、2号哲学家竞争1号筷子,3、4号哲学家竞争3号筷子。即五个哲学家都竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一个哲学家能获得两支筷子而进餐。

semaphore chopstick[5] = {1, 1, 1, 1, 1};  // 初始化信号量Pi(int i){while(true){思考;if(i % 2 == 0){   // 偶数哲学家,先右后左。P(chopstick[(i + 1) % 5]) ;   // 取右边筷子P(chopstick[i]) ;   // 取左边筷子进餐;V(chopstick[(i + 1) % 5]) ;V(chopstick[i]) ;}else{   // 奇数哲学家,先左后右。P(chopstick[i]) ;   // 取左边筷子P(chopstick[(i + 1)%5]) ;    // 取右边筷子进餐;V(chopstick[i]) ;V(chopstick[(i + 1)%5]) ;}}
}

【考研】操作系统:2019年真题43(同步互斥问题)相关推荐

  1. 计算机高级工考试题库2018,080720 自考软件工程:07163高级数据库技术历年真题及答案 2018年 2017年 2019年真题和答案...

    07163高级数据库技术历年真题及答案 2018年 2017年  2019年真题和答案 http://yy870.com/article/36537.html http://zoole.wang/ar ...

  2. 2012计算机考研408,2012年考研计算机统考408真题

    2012年考研计算机统考408真题 (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 11.90 积分 2012年考研计算机统考408真题一. 单项选 ...

  3. 计算机408试题2014,2014年考研计算机统考408真题

    该文档为本从准备考研期间,收集整理的计算机408考研真题 2014年考研计算机统考408真题 一.单项选择题 1.下列程序段的时间复杂度是 1 . count =0; for(k=1; k<=n ...

  4. 2011年华科计算机考研复试机试题真题

    很好的资料哦,更多资料请访问王道论坛:www.cskaoyan.com 2011年华科计算机考研复试机试题真题:

  5. 考研概率论--87年真题--MATLAB暴力求解

    考研概率论--87年真题--MATLAB暴力求解 1. 问题描述 2. MATLAB代码 3. 运行结果 4. 总结 1. 问题描述 (1987考研数学真题)假设有两箱同种零件:第一箱内装50件,其中 ...

  6. 2018考研数学二答案真题解析.pdf

    2018考研数学二答案真题解析.pdf

  7. 2010-2019考研英语二 阅读真题+答案

    2010-2019考研英语二 阅读真题+答案 链接: https://pan.baidu.com/s/1lDVGWPviiojBkYR1HsQswA 提取码: in3j 复制这段内容后打开百度网盘手机 ...

  8. 2017考研计算机百度云,2017考研计算机统考408真题版.pdf

    2017 年考研计算机统考 408 真题 一. 单项选择题 1. 下列函数的时间复杂度是 1 . int func(int n) { int i = 0; sum = 0; while( sum &l ...

  9. 2017计算机考研题型,2017年考研计算机统考408真题.doc

    2017 年考研计算机统考 408 真题 一.单项选择题 1.下列函数的时间复杂度是1. int func(int n) {int i = 0; sum = 0; while( sum < n) ...

最新文章

  1. python解析mht文件_php解析mht文件转换成html的方法
  2. 一个函数让你看懂 'Why 0.1+0.2!=0.3'
  3. boost::mp11::mp_intersperse相关用法的测试程序
  4. 防火墙(11)——防止爬虫过多访问(ping)我们的服务器
  5. linux7电脑配置要求,安装win7系统电脑配置有何要求--win10专业版
  6. java class 关键字_java关键字及其作用
  7. 课程目标 java 1615308884
  8. mysql q4m_Mysql Q4M 队列操作封装(二)
  9. 能行走如飞,会自己折叠:这个哈佛实验室有一群神奇的机器人
  10. .Net转Java自学之路—基础巩固篇二十二(XML)
  11. 3-12岁经典必读书
  12. 正则表达式匹配第一个单个字符
  13. 编程中的c语言32个英文代码,C语言图形编程代码(国外英文资料).doc
  14. 题目:js实现求100以内的质数
  15. 木子-数据库-oracle如何创建一个新的实例
  16. react服务端渲染技术
  17. 苹果手机iCloud备忘录删除怎么恢复
  18. csgo开箱网站有哪些?NEW
  19. 极智开发 | ubuntu 安装有线网卡驱动
  20. 求出 2 到 n 之间 (含 n)的所有素数。

热门文章

  1. android 模拟器输入中文
  2. java QQ客户端
  3. 轻量级CI/CD自动构建平台Gitea+Drone保姆级实践教程
  4. P型MOS管开关电路及工作原理详解-KIA MOS管
  5. ISE14.7 Spartan3e 呼吸灯
  6. 33-viper 配置文件加载
  7. ubantu 解决软件商店打不开问题
  8. CVS命令深入研究 zz
  9. NVIDIA英伟达jetson xavier nx怎么进入Recovery模式
  10. 《上海市居住证》积分申请基本流程