操作系统期末复习大题---经典进程的同步问题

目录

一、经典进程的同步问题

1. 利用记录型信号量解决生产者—消费者问题

执行流程:

”生产者-消费者”问题模型代码框架如下: 

 注意:

小结:

复习典型例题:

解答:

2. 利用AND信号量解决生产者——消费者问题

代码框架:

生产者消费者模型举例

例一、

例二、 

例3:父亲-母亲-儿子-女儿两个苹果或桔子

例4

练一练(2009年考研真题)

题目:

分析:考虑题目中的互斥和同步问题

答案:

 例题:

分析:

解答

练一练(2014年真题)

2.5.2哲学家进餐问题

 学以致用(2019真题)

2.5.3  读者-写者问题

 补充:吸烟者问题


一、经典进程的同步问题

重点内容:

•掌握“生产者-消费者”问题模型
•掌握“哲学家进餐”问题模型
•掌握“读者-写者”问题模型

1. 利用记录型信号量解决生产者消费者问题

执行流程:

”生产者-消费者”问题模型代码框架如下: 
semaphone mutex=1,empty=n,full=0;
item buffer[n];
int in=0, out = 0;
main(){
   cobegin
   { producer{  
        produce an item nextp;
        wait(empty);
        wait(mutex);
        buffer(in)=nextp;
        in=(in+1) % n;
        signal(mutex);   //释放使用权
        signal(full);    //唤醒消费者
      }
    consumer
      {
        wait(full);
        wait(mutex);
        nextc=buffer(out);
        out= (out+1) % n;
        signal(mutex);    //释放使用权
        signal(empty);    //唤醒生产者
        consume the item in nextc;
      }
   }coend
}
 注意:

在有多个信号量同时存在的情况下,WAIT操作往往是不能颠倒顺序的,必须先对资源信号量进行WAIT操作,再对互斥信号量进行WAIT操作,这样可以在占用共享资源的访问权时保证有资源可用,不然会导致产生占用使用权而无资源可用的“死等”现象。

小结:

复习典型例题:

解答:

2. 利用AND信号量解决生产者——消费者问题

代码框架:
semaphone mutex=1,empty=n,full=0;
item buffer[n];
int in=0, out = 0;
main(){
   cobegin
   { 
     producer
      {  
        produce an item nextp;
        wait(empty,mutex);
        buffer(in)=nextp;
        in=(in+1) % n;
        signal(mutex,full);
      }
    consumer
      {
        wait(full,mutex);
        nextc=buffer(out);
        out= (out+1) % n;
        signal(mutex,empty); 
        consume the item in nextc;
      }
   }coend
}

问题推广:

                  一组生产者,一组消费者,公用 n个环形缓冲区

思考:如何高效的存取,生产者之间公用一个in指针,消费者之间公用一个out指针,如何设置信号量?

empty:表示缓冲区是否为空,初值为n;      full:表示缓冲区是否为满,初值为0

mutex1:生产者之间的互斥信号量,初值为1;mutex2:消费者之间的互斥信号量,初值为1

设缓冲区的编号为1n-1,定义两个指针inout,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。

第三种情况,可以理解成有多间牛奶生产厂家,如蒙牛,达能,光明等,消费者也不只小明一人,有许许多多消费者。不同的牛奶生产厂家生产的商品可以放在不同的零售分店中销售,而不同的消费者可以去不同的分店中购买。当某一分店已放满某个厂家的商品时,下一个厂家只能把商品放在下一间分店。所以在这种情况中,生产者与消费者存在同步关系,而且各个生产者之间、各个消费者之间存在互斥关系,他们必须互斥地访问缓冲区。


生产者消费者模型举例

例一、

分析:爸爸和儿子两个进程相互制约,爸爸进程执行完即往盘中放入苹果后,儿子进程才能执行即吃苹果。因此该问题为进程间的同步问题。 

 


例二、 

2. 桌上有一空盘,允许存放一只水果,爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用。

   请用Wait/Signal原语实现爸爸、儿子、女儿三个并发进程的同步。

设置三个信号量:

Semaphore S=1;   //S 表示盘子是否为空;
Semaphore S1=0; //S1表示盘中是否有苹果;
Semaphore S2=0; //S2表示盘中是否有桔子;

此问题还可继续推广:父亲-母亲-儿子-女儿一个苹果或桔子 问题;父亲-母亲-儿子-女儿两个苹果或桔子 问题;

3:父亲-母亲-儿子-女儿两个苹果或桔子

分析:盘子为互斥资源,因可以放2个水果,empty初值为2 且需设置互斥信号量mutex=1

还可进一步推广:两个儿子,两个女儿的情况!

semaphores=2(可用位置);  s1=0(苹果数);  s2=0(桔子数);mutex=1;

爸爸:wait(s); wait(mutex);放苹果; signal(mutex); signal(s1);

妈妈:wait(s); wait(mutex); 放桔子; signal(mutex); signal(s2);

儿子:wait(s2); wait(mutex); 取桔子; signal(mutex); signal(s);

女儿:wait(s1); wait(mutex); 取苹果; signal(mutex); signal(s);

4

4某幼儿园举行趣味活动,每两个小朋友一组。重复做如下活动:一个小朋友负责用一个小桶在A沙堆取沙子,然后倒入一大盆中,另一小朋友负责用一个小桶从大盆中取沙子倒入B沙堆。大盆最多能装10桶沙子,且在大盆中取沙子和倒沙子不能同时进行。试用信号量操作描述这两个小朋友的同步过程。

empty:表示大盆是否为空,初值为10

full    :表示大盆是否为满,初值为0

mutex表示可否对大盆进行操作,初值为1.

解答:

练一练(2009年考研真题)

题目:

        三个进程P1P2P3互斥使用一个包含N个单元的缓冲区。P1每次用produe()产生一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步和互斥活动,并说明所定义信号量的含义(要求用伪代码描述)。

分析:考虑题目中的互斥和同步问题
互斥问题:缓冲区只能互斥,设置互斥信号量 mutex ;
同步问题 :  P1 P2 因为奇数的放置和取用同步,设置信号量 odd P1 P3 因为偶数的放置与取用取得同步,设置同步信号量 even P1 P2 P3 因为共享缓冲区,设置同步信号量 empty.

信号量定义:

semaphore mutex=1;//缓冲区操作互斥信号量
semaphore odd=0,even=0;//奇数偶数同步信号量
semaphore empty=N;//空缓冲区个数

答案:


 例题:

某寺庙有小和尚、老和尚若干。

有一个水缸,由小和尚打水入缸供老和尚饮用。 水缸可容纳 10 桶水
水取自同一井中。 每次只能容纳一个桶取水 水桶总数为 3 。每次入、取水仅为一桶, 且不可同时进行
给出有关取水、入水的算法描述。

分析:

semaphore empty=10;// 表示缸中目前还能装多少桶水,初始时能装10桶水

semaphore full=0;// 表示缸中有多少桶水,初始时缸中没有水

semaphore buckets=3;// 表示有多少只空桶可用, 初值为3

semaphore mutex_well=1;// 用于实现对井的互斥操作

semaphore mutex_bigjar=1; // 用于实现对缸的互斥操作

解答


练一练(2014年真题)

系统中有多个生产者进程和多个消费者进程,共享一个能存放1000件产品的环形缓冲区(初始为空)。当缓冲区未满时,生产者进程可以放入其生产的一件产品,否则等待;当缓冲区未空时,消费者进程可以从缓冲区取走一件产品,否则等待。要求一个消费者进程从缓冲区连续取出10件产品后,其他消费者进程才可以取产品。请使用信号量PVwait,singnal)操作实现进程间的互斥和同步,要求写出完整的过程,并说明所用信号量的含义和初值。

分析:

semaphore empty=1000;//空缓冲区的个数
semaphore full=0;//缓冲区的产品数
semaphore mutex1=1;//控制消费者进程一个周期内互斥访问
semaphore muter2=1;//进程单次互斥访问临界区

解答:


2.5.2哲学家进餐问题

前面描述了多个进程竞争一个临界资源的情况及通用模板,那么,对于多个进程竞争多个临界资源的情况,又该如何描述呢?哲学家就餐问题就是对这类问题的一个抽象!

思考:如果同时拿起左筷子?

死锁解决方法:

 解决方法1:

 

解决方法2:

解决方法3:

 学以致用(2019真题)

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

   信号量bowl用于协调哲学家对碗的使用, bowl<n,确保不死锁,

即至少保证有一个人拿不到碗,那么就能保证至少有一个人能拿到左右的筷子。

     semaphone bowl=min(n-1,m);

  信号量chopsticks用于协调哲学家对筷子的使用,两个哲学家之间的筷子数量为1

    semaphone chopsticks[n]={1,1,...,1};


2.5.3  读者-写者问题

对共享资源的读写操作,任一时刻“写者”最多只允许一个,而“读者”则允许多个。

  • “读-写”互斥,
  • “写-写”互斥,
  • "读-读"允许


 补充:吸烟者问题

假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草第二个拥有纸第三个拥有胶水。供应者进程无限地提供三种材料,供应者每次将两种材料放到桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者一个信号告诉完成了,供应者就会放另外两种材料在桌上,这种过程一直重复(三个抽烟者轮流地抽烟)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode2966. 划分数组并满足最大差限制

Every day a Leetcode 题目来源&#xff1a;2966. 划分数组并满足最大差限制 解法1&#xff1a;排序 将数组 nums 从小到大排序&#xff0c;每三个一组插入答案&#xff0c;如果有 nums[i 2] - nums[i] > k&#xff0c;则不满足要求&#xff0c;返回空数组。 代码&…

C++学习笔记(二十四):c++ this

this指针在c中较为常用。this是一个指向当前对象实例的指针&#xff0c;通过this指针&#xff0c;可以访问该类的成员函数。示例如下&#xff1a;this指针主要的使用场景是在类内部调用类外部的函数&#xff0c;该函数传递的参数是调用该函数的类对象&#xff0c;代码示例如下&…

【linux】更改infiniband卡在Debian系统的网络接口名

在Debian或任何其他基于Linux的系统中&#xff0c;网络接口的名称由udev系统管理。通过创建udev规则&#xff0c;可以修改网络接口名称。以下是更改InfiniBand卡接口名称的一般步骤&#xff1a; 1. 找到网络接口的属性&#xff0c;以编写匹配的udev规则 可以使用udevadm命令查…

Postman Newman 教程:轻松管理 API 自动化测试步骤

Postman 中的 Newman 是什么&#xff1f; Newman 是一个 CLI&#xff08;命令行界面&#xff09;工具&#xff0c;用于运行 Postman 中的集合&#xff08;Collection&#xff09;和环境&#xff08;Environment&#xff09;来进行自动化测试。它允许直接从命令行运行 Postman …

数字后端设计实现 | 数字后端PR工具Innovus中如何创建不同高度的row?

吾爱IC社区星球学员问题&#xff1a;Innovus后端实现时两种种不同高度的site能做在一个pr里面吗&#xff1f; 答案是可以的。 Innovus支持在同一个设计中中使用不同的row&#xff0c;但需要给各自子模块创建power domain。这里所说的不同高度的row&#xff0c;有两种情况。 1…

【mars3d】new mars3d.layer.GeoJsonLayer({实现多孔面遮罩mask: true,

【mars3d】new mars3d.layer.GeoJsonLayer({实现多孔面遮罩 官网测试示例&#xff1a; 1.功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 测试代码&#xff1a; export function showDraw(isFlyTo) { removeLayer() const geoJsonLayer new mars3d.layer.GeoJsonLaye…

【python_将列表整合成文本】

python_将列表整合成文本 # -*- coding: utf-8 -*-data [[指令卡主, 2023-12-25, 经贸有限公司, 孙悟空], [使用了屏幕保护之后&#xff0c;元素找不到了, 2023-12-25, 科技有限公司, 许三多], [操作用友的时候&#xff0c;找不到元素, 2024-01-02, 食品科技有限公司, 小张],…

代码随想录刷题第三十九天| 62.不同路径 ● 63. 不同路径 II

代码随想录刷题第三十九天 不同路径 (LC 62) 题目思路&#xff1a; 代码实现&#xff1a; class Solution:def uniquePaths(self, m: int, n: int) -> int:dp [[0 for _ in range(n1)] for _ in range(m1)]dp[0][1] 1for i in range(1,m1):for j in range(1, n1):dp[i]…

记一次 .NET 某零售管理系统 存储不足分析

一&#xff1a;背景 1. 讲故事 前几天有位朋友找到我&#xff0c;说他的程序会偶发性的报 存储空间不足&#xff0c;无法处理此命令 的错误&#xff0c;让我帮忙看下到底怎么回事&#xff0c;哈哈&#xff0c;人家是有备而来&#xff0c;dump都准备好了&#xff0c;话不多说&…

性能优化-OpenMP基础教程(五)-全面讲解OpenMP基本编程方法

本文主要介绍OpenMP编程的编程要素和实战&#xff0c;包括并行域管理详细实战、任务分担详细实战。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;C…

Softing LinkXpert M3荣获Connect Professional“2023年度产品”

2023年7月21日&#xff0c;Softing IT Networks凭借其LinkXpert M3产品荣获2023年度Connect Professional读者选择的“2023年度产品”奖项。 在信息及通信技术测量类别中&#xff0c;LinkXpert M3从众多竞争者中脱颖而出&#xff0c;最终获得提名并跻身“2023年度产品”之列。该…

Apache SeaTunnel:探索下一代高性能分布式数据集成工具

大家下午好&#xff0c;我叫刘广东&#xff0c;然后是来自Apache SeaTunnel社区的一名Committer。今天给大家分享的议题是下一代高性能分布式海量数据集成工具&#xff0c;后面的整个的PPT&#xff0c;主要是基于开发者的视角去看待Apache SeaTunnel。后续所有的讲解主要是可能…

MyBatis-Plus框架学习笔记

先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;❤️ ❤️ ❤️ 文章码字不易&#xff0c;如果喜欢可以关注我哦&#xff01; ​如果本篇内容对你有所启发&#xff0c;欢迎访问我的个人博客了解更多内容&#xff1a;链接地址 MyBatisPlus &#xff08;简称…

烟花燃放如何管控?智能分析网关V4烟火检测保障烟火安全

一、方案背景 随着元旦佳节的热潮退去&#xff0c;春节也即将来临&#xff0c;在众多传统的中国节日里&#xff0c;烟花与烧纸祭祀都是必不可少的&#xff0c;一方面表达了人们对节日的庆祝的期许&#xff0c;另一方面也是一种对故者思念的寄托。烟花爆竹的燃放不仅存在着巨大的…

Color Control

设计一个优秀的用户界面是一项艰巨的任务。特别是如果你想改变UI的颜色,调整所有元素可能需要花费大量时间。Color Control可以帮助你!在检查器中以可视化的方式将你的项目颜色定义为资源。Color Control为你提供了组件,当你编辑它们时,它们会自动更新你的UI元素。 颜色控制…

​已解决java.lang.ArrayIndexOutOfBoundsException异常的正确解决方法,亲测有效!!!​

已解决java.lang.ArrayIndexOutOfBoundsException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 报错问题 解决思路 解决方法 总结 Q1 - 报错问题 java.long.ArrayIndexOutOfBoundsException 是Java中的一个运行时异常​&#xff0c…

嵌入式系统复习--基于ARM的嵌入式程序设计

文章目录 上一篇编译环境ADS编译环境下的伪操作GNU编译环境下的伪操作ARM汇编语言的伪指令 汇编语言程序设计相关运算操作符汇编语言格式汇编语言程序重点C语言的一些技巧 下一篇 上一篇 嵌入式系统复习–Thumb指令集 编译环境 ADS/SDT IDE开发环境&#xff1a;它由ARM公司开…

JVM篇:直接内存

直接内存 直接内存并不是JVM的内存结构&#xff0c;直接内存是操作系统的内存&#xff0c;Java本身并不能对操作系统的内存进行操作&#xff0c;而是通过调用本地方法。直接内存常用于NIO作为缓冲区存在&#xff0c;分配成本较高但是读写性能好&#xff0c;并且不受JVM内存回收…

百度吉利合作造车生态,极越“智价比”能否带来科技平权?

文|AUTO芯球 作者|文泽 临近年关&#xff0c;车企迎来“降价潮”。为了获得更好的年终成绩单&#xff0c;包括上汽大众、比亚迪、长安汽车、智己汽车等20多家品牌推出了购车补贴、限时优惠等措施&#xff0c;优惠幅度最高近20万元。 在此背景下&#xff0c;新车发布一个多月…