1:生产者消费者问题

生产者和消费者共享一个初始值为0,大小为n的缓冲区。

当缓冲区未满时,生产者才能生产产品。

当缓冲区未空时,消费者才能消费产品。

缓冲区属于临界资源,生产者和消费者需要互斥的访问。

semaphore mutex=1    //互斥信号量,生产者和消费者互斥访问缓冲区semaphore  empty=n   //同步信号量,表示空缓冲区的数量semaphore  full=0         //同步信号量,表示产品数量即非空缓冲区的数量producer ( ){while(1){生产产品p(empty); //申请空缓冲区p(mutex);    //申请缓冲区的访问放入空缓冲区v(mutex);    //取消对缓冲区的访问v(full);          // 增加一个产品,即增加一个非空缓冲区}
}
consumer( ){while(1){p(full);   //申请非空缓冲区p(mutex);  //申请缓冲区的访问从缓冲区取出v(mutex);  //取消对缓冲区的访问v(empty);  //增加一个空缓冲区消费产品}
}

注意:对p(empty)/p(full)和p(mutex)的顺序不可以调换,如果调换会产生死锁。

  1. 如果此时缓冲区为满,如果生产者进程申请了对缓冲区的访问,而此时没有空缓冲区,生产者进程将会阻塞,而消费者进程无法进入缓冲区,消费者进程也会阻塞。
  2. 如果此时缓冲区为空,如果消费者进程申请了对缓冲区的访问,而此时没有非空缓冲区,消费者进程将会阻塞,而生产者进程无法进入缓冲区,生产者进程也会阻塞。

注意:生产者生产产品,消费者消费产品的代码不能放到缓冲区访问期间,会降低程序的并发度

2: 多生产者多消费者问题

semaphore   plant=0  //同步信号量,表示盘子还可以放几个水果
semaohore   apple=0  //同步信号量,表示盘子中苹果的数量
semaphore   orange=0 //同步信号量,表示盘子中橘子的数量dad( ){准备苹果p(plant);放入苹果v(apple);}mom( ){准备橘子p(plant);放入橘子v(orange);}daughter( ){p(apple);取走苹果v(plant);吃苹果}son( ){p(orange);取走橘子v(plant);吃橘子}

注意:此时不需要设置对盘子的互斥访问量 semaphore mutex=1,因为此时apple orange plant 三个同步信号量的值最多有一个为1。在任何时刻只能由一个进程的p操作不会被阻塞,并进去临界区。

桌上有一空盘,只允许存放一个水果。爸爸可向盘中放苹果,也可向盘中放桔子。儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘中空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。

semaphore  plant=1  //同步信号量,表示盘子可存放水果的数量
semaphore  apple=0  //同步信号量,表示盘子中苹果的数量
semaphore  orange=0 //同步信号量,表示盘子中橘子的数量dad( ){准备水果p(plant);放水果if(苹果){v(apple);}else{v(orange);}
}daughter( ){p(apple);拿走苹果v(plant);吃苹果
}son( ){p(orange);拿走橘子v(plant);吃橘子
}

3:哲学家问题

semaphore chopstick[5]{1,1,1,1,1} //表示五只筷子 从0-4编号
semaphore mutex=1 //哲学家之间 互斥取筷子pi( ){while(1){p(mutex);p(chopstick[i]);//左边筷子p(chopstick[(i+1)%5])//右边筷子v(mutex);吃饭v(chopstick[i]);//左边筷子v(chopstick[(i+1)%5])//右边筷子思考}}
  1. 设置mutex互斥信号量,哲学家之间互斥的取筷子
  2. 最多允许四位哲学家取筷子
  3. 奇数的哲学家先拿左边筷子,再拿右边筷子,而偶数哲学家相反

4:读写者问题

默认读者优先:

semaphore  rw=1   //对文件的互斥访问
int count =0      //记录当前读进程的个数
semaphore  mutex=1 //保证对count变量的互斥访问writer( ){p(rw);写文件v(rw);}reader( ){while(1){p(mutex);if(count==0){p(rw);}count++;v(mutex);读文件p(mutex);count--;if(count==0){v(rw);}v(mutex);}}

读写公平:

semaphore  rw=1   //对文件的互斥访问
int count =0      //记录当前读进程的个数
semaphore  mutex=1 //保证对count变量的互斥访问
semaphore  w=1    //读写公平
writer( ){p(w);
p(rw);
写文件
v(rw);
v(w);
}reader( ){while(1){p(w);p(mutex);if(count==0){p(rw);}count++;v(mutex);v(w);读文件p(mutex);count--;if(count==0){v(rw);}v(mutex);}
}

操作系统-信号量机制的一些习题相关推荐

  1. 操作系统-信号量机制

    信号量机制 用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥.进程同步. 什么是信号量? 信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量), ...

  2. 操作系统(二十一)信号量机制

    2.3.4 信号量机制 在前两节中我们分别学习了用软件方式以及硬件方式实现互斥访问,但是他们或多或少的存在一些问题,1965年荷兰的一名学者迪杰斯特拉(是的,就是那个男人)提出了信号量机制,有效的解决 ...

  3. 王道操作系统考研笔记——2.3.4 信号量机制

    文章目录 2.3.4 信号量机制 2.3.4.1 引入 2.3.4.2 整型信号量 2.3.4.3 记录型信号量 2.3.4.4 小结 2.3.4 信号量机制 知识总览 在1965年,荷兰学着Dijk ...

  4. 二、操作系统——用信号量机制实现进程互斥、同步、前驱关系(详解)

    一.什么是进程同步? 二.什么是进程互斥? 临界资源:一个时间段内只允许一个进程使用的资源 为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则: 空闲让进.临界区空闲时,可以允许一个 ...

  5. 8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系

    文章目录 1 信号量机制 1.1 整形信号量 1.2 记录形信号量 1.3 信号量机制小结 2 用信号量机制实现进程互斥.同 步.前驱关系 2.1 信号量机制实现进程互斥 2.2 信号量机制实现进程同 ...

  6. 操作系统课设之基于信号量机制的并发程序设计

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  7. 【操作系统】进程管理(五)—— 信号量机制

    [操作系统]进程管理(五)-- 信号量机制 前言 一.信号量机制 信号量机制--整型信号量 信号量机制--记录型信号量 二.用信号量机制实现进程互斥.同步.前驱关系 信号量机制实现进程互斥 信号量机制 ...

  8. 【操作系统·考研】信号量机制/PV操作

    在操作系统引入进程后,一方面,系统中的多道程序可以并发执行,不仅有效改善资源利用率,而且显著提高系统的吞吐量.另一方面,如果不对多个进程的运行进行妥善管理,必然会因为这些进程对系统资源的无序争夺给系统 ...

  9. 操作系统(三)| 进程同步详解(主要任务、制约关系、临界资源、临界区、同步机制遵循规则、信号量机制、信号量的应用)

    文章目录 进程的同步基本概念 进程同步的主要任务 进程间的制约关系 临界资源 临界区 同步机制应遵循的规则 信号量机制 整型信号量 记录型信号量 ❤❤❤ AND型信号量 信号量的应用 实现进程互斥 实 ...

  10. 操作系统(二十二)用信号量机制实现进程互斥、同步、前驱关系

    2.3.5 用信号量机制实现进程互斥.同步.前驱关系 目录 2.3.5 用信号量机制实现进程互斥.同步.前驱关系 2.3.5.1 用信号量机制实现进程互斥 2.3.5.2 用信号量机制实现进程同步 2 ...

最新文章

  1. luogu 3796 【模板】AC自动机(加强版)
  2. 安装了但是报错找不到_安装MySQL时由于找不到vcruntime140_1.dll,无法继续安装
  3. TIOBE 11月编程语言排行:Java首次跌出前二,Python 势不可挡。
  4. 项目设计基础:处理过程设计相关知识介绍​
  5. 腾讯与微软合作,准备应用Silverlight技术
  6. python问卷调查系统设计案例_从设计到施工,全面剖析超级玻璃屋面系统案例!...
  7. java质因数算法_Java实现的质因数分解操作示例【基于递归算法】
  8. js中递归调用返回值为undefined问题
  9. python类型转换方法_整理了最全的Python3数据类型转换方法,可以收藏当手册用...
  10. Sass与Compress实战:第一章
  11. 社团管理系统软件测试,软件测试大作业社团管理系统.doc
  12. Studio3T安装
  13. android版手机qq 5.0,界面精简功能更强 手机QQ5.0安卓版发布
  14. Junit4初始化错误
  15. C/C++ 编程 —— OpenCV API 学习 笔记(更新中...)
  16. 顶级国漫镇魂街唯一正版IP授权之作镇魂街武神躯手游正式上线!
  17. python学习笔记:类的方法总结
  18. css如何添加模糊效果,css动态模糊效果
  19. 零基础怎么学会计实操?
  20. 【numpy操作】numpy的函数

热门文章

  1. Android扫描wifi二维码自动连接wifi
  2. Tianchi big data competition天池大数据挑战(CV场)
  3. 远程办公软件:TeamViewer使用评测与安装
  4. Python实现最小二乘法曲线拟合
  5. 机器视觉培训教程-硬件选型
  6. 计算机硬件关系密切,与计算机硬件关系最密切的软件是( ).
  7. lamp一键安装包不安装mysql_lamp一键安装包的一些注意点
  8. 音频-什么是PCM编码格式?
  9. 分布式任务调度框架设计与实现解读(1)
  10. NPOI iTextSharp导出Excel并加水印