1. 用信号量解题步骤:(1)设置信号量(2)给信号量赋初值(3)P、V操作安排位置

2. 信号量实现进程互斥


2.1 互斥信号量取值范围
例:两个进程,取值范围(-1,0,1)
m个进程,取值范围(1-m,1)

3. 信号量实现前趋关系


例如:

解答: a = V(S1); V(S2)
b = P(S1)
c = P(S2) ;P(S3)
d = p(S4)

4. 初始状态下:empter = 1,因为缓冲区“空”的位置有,所以为1;full = 0,因为缓冲器“满”的位置没有,所以为0.

5. 生产者–消费者问题

分析问题里有几个进程;分析之间存在互斥模式还是同步模式,例:生产者–消费者问题是互斥模式和同步模式;
(1)一个生产者,一个消费者,共用一个缓冲区

代码:
void producer( ) {
while(true) {
生产一个产品;
P(empty);
产品送往Buffer;
V(full);
}
}
void consumer( ) {
while(true) {
P(full);
从Buffer取出一个产品;
V(empty);
消费该产品;
}
}
(2)一个生产者,一个消费者,公用n个环形缓冲区

代码:
void producer() {
while(true) {
生产一个产品;
P(empty);//申请一个空缓冲区
buffer[in] =nextp;
in=(in+1)% n;
V(full); //释放一个满缓冲区
}
}
void consumer() {
while(true) {
P(full); //申请一个满缓冲区
nextc = buffer[out];
out = (out+1)%n;
V(empty); //释放一个空缓冲区
消费该产品;
}
}
(3) 一组生产者,一组消费者,公用n个环形缓冲区

为什么存在互斥问题:
在这个问题中,不仅生产者与消费者之间要同步,而且各个生产者之间、各个消费者之间还必须互斥地访问缓冲区。
代码:
void producer() {
while(true) {
生产一个产品;
P(empty); //申请一个空缓冲区
P(mutex1); //申请空缓冲区使用权
buffer[in] =nextp;
in=(in+1)% n;
V(mutex1); //释放空缓冲区使用权
V(full); //释放一个满缓冲区
}
}
void consumer() {
while(true) {
P(full);
P(mutex2);
nextc = buffer[out];
out = (out+1)%n;
V(mutex2);
V(empty);
消费该产品;
}
}

6. 哲学家进餐


定义互斥信号量组,筷子是临界资源,初始值为1
代码:
semaphore chopstick[5] = {1,1,1,1,1};
do{
wait(chopstick[i]); //先取左手的筷子 左手的筷子都能拿起,但都不释放
wait(chopstick[(i+1)%5]); //再取右手的筷子

//eat

signal(chopstick[i]);
signal(chopstick[(i+1)%5]);

//think

}while(TRUE);

(1)
semaphore chopstick[5] = {1,1,1,1,1};
semaphore count=4;
do{
wait(count);
wait(chopstick[i]);
wait(chopstick[(i+1)%5]);
eat();
signal(chopstick[i]);
signal(chopstick[(i+1)%5]);
signal(count);
think();
}while(TRUE);
3号先吃,然后2号,1号,0号,4号
(2)
semaphore chopstick[5] = {1,1,1,1,1};
do{
Swait(chopstick[i], chopstick[(i+1)%5]);
eat();
Ssignal(chopstick[i], chopstick[(i+1)%5]);
think();
}while(TRUE);
0号,2号,1号,3号,4号
(3)
semaphore chopstick[5] = {1,1,1,1,1};
do{
if(i%2==1)
{
P(chopstick[i]);
P(chopstick[(i+1)%5]);
eat();
V(chopstick[i]);
V(chopstick[(i+1)%5]);
think();
}
else{
P(chopstick[(i+1)%5]);
P(chopstick[i]);
eat();
V(chopstick[i]);
V(chopstick[(i+1)%5]);
think();
}
}while(TRUE);
0号,2号,1号,3号,4号

7. 读者–写者问题

类型:读、读共享,读、写互斥,写、写互斥。
互斥信号量,Readcount:表示正在读的进程数目
读操作的时候顺便把写操作也占用

8. 总结:P、V操作中何时该做的操作

一般情况下,empty=1,full=0。当进行wait操作时,就是要申请一个位置,因为empty=1,所以写empty,这样的话empty=1-1=0;然后进行signal操作的时候,就是释放一个位置,所以full=0+1=1。
也就是说,wait里填写的是不为0的值,signal里填写的是值为0的

操作系统---信号量相关推荐

  1. 操作系统信号量与P、V操作 初步认识整理

    初步接触,若有不足之处,请各位不吝赐教.谢谢! 首先介绍:信号量 信号量包括整型信号量.结构型信号量.二值信号量. ① 整型信号量 最初,将信号量定义为一个共享的整型量,它保存可供使用的唤醒数目.如果 ...

  2. UCOS操作系统——信号量与互斥信号量(九)

    UCOS操作系统 文章目录 UCOS操作系统 一.信号量简介 1.二进制信号量 2.计数型信号量 二.使用信号量 1.相关API函数 2.OSSemCreate()创建信号量 3.OSSemPend( ...

  3. 过桥问题linux信号量课设,操作系统信号量问题——信号量的精简

    是考研辅导书王道(操作系统)中关于信号量的一个题,个人觉得答案有精简的余地,所以讨论了一下,但是和王道高分牛校学长讨论的结果不满意,所以贴出来再探讨一下. 有一座桥,南北向,都有入口出口.(图我不画了 ...

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

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

  5. 操作系统——信号量(理解什么是信号量,信号量如何解决同步互斥问题,信号量一些注意点)

    信号量是什么 信号量(semaphore)是操作系统用来解决并发中的互斥和同步问题的一种方法. 信号量是一个与队列有关的整型变量,你可以把它想象成一个数后面拖着一条排队的队列,如图: 那信号量上面值n ...

  6. 操作系统-信号量的使用

    简述信号量 何时使用信号量 当有多个进程存在时,为了避免当一个进程正在执行的时候,其他进程不断询问cpu是否空闲(比较消耗时间)(他们此刻处于等待状态->没锁,当可以使用cpu时就可以上锁(锁是 ...

  7. 操作系统信号量和管程

    1 背景 同步互斥回顾: 并发问题: 竞争条件(竞态条件) 多程序并发存在大量问题 同步 多线程共享公共数据的协调执行 包括互斥与条件同步 互斥: 在同一时间只有一个线程可以执行临界区 确保线程同步 ...

  8. 操作系统—信号量实验项目

    信号量实验项目: 桌子上有一个能盛得下5个水果的空盘子,爸爸不停地向盘子中放入苹果或者桔子,儿子不停地从盘子中取出桔子享用,女儿不停的从盘子中取出苹果享用.规定三人不能同时从盘子中取放水果.试用信号量 ...

  9. 操作系统-信号量(生产者消费者问题)

    1.问题描述:一组生产者进程和一组消费者进程共享一个初始为空大小为n的缓冲区,只有缓冲区没满时,生产者才能给缓冲区投放信息,否则必须等待:只有缓冲区不空时,消费者才能继续取出消息,否则也必须等待.由于 ...

最新文章

  1. Linux下通过v4l2获取视频设备名、支持的编解码及视频size列表实现
  2. GetSafeHwnd()函数
  3. vue input file onchange_vue常用指令汇总
  4. mysql导入dat文件_从零开始学习 MySQL 系列--索引、视图、导入和导出
  5. 更改UISearchBar button属性
  6. 《c语言从入门到精通》看书笔记——第3章 数据类型
  7. acdsee扫描没有图像_详解CT图像常见伪影成因及解决方法
  8. python 某个数是不是在某个范围内_教写一个简单的python小程序(04)
  9. IM系统中聊天记录模块的设计与实现
  10. OpenCV-中值滤波cv::medianBlur
  11. asp.net mvc4使用DropDownList
  12. c# define 类似_c#跟c++的相似之处
  13. springboot的异常处理
  14. 小米5splus(高配版/全网通)线刷兼救砖_解账户锁_纯净刷机包_教程
  15. Mysql 超键 候选键 主键 外键之间关系
  16. ‘__NR_sigreturn’ was not declared in this scope
  17. 使用python调用百度API实现文字转语音功能
  18. 南航里程每年清空吗_年末提醒| 除了换机票,那些即将清零的航空里程还有什么用...
  19. 我支持平板能代替笔记本电脑
  20. AliOS-Things--ESP8266-linkkitapp-配网(一)

热门文章

  1. 怎么在计算机里找到CF里保存的视频,Win10电脑上查看穿越火线录制保存视频的具体方法...
  2. 怎么把小丑的可怕和疯狂表现出来
  3. 使用Moses脚本进行数据预处理
  4. 电脑打印准考证图片显示不出来
  5. 美团上交开源PromptDet:无需标注,开放世界的目标检测器
  6. 物体识别全流程(Ubuntu16.04)结合ROS
  7. 16nm粒径的规则球形纳米金粒AuNPs-CPE-香兰素/Tf-金纳米海胆的制备方法
  8. 面向过程(PO)和面向对象(OO)的区别(思维导图)
  9. final cut pro 最快速,最简单的批量字幕制作方法!
  10. snmpwalk命令常用方法总结