信号量机制实现进程的互斥、同步、前驱
1965年,荷兰学者Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法——信号量机制
信号量其实就是一个变量(可以是一个整数,也可以是一个更复杂的变量),可以用信号量来表示系统中某种资源的数量。比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。
P、V操作:
P表示通过,V表示释放
1.整型信号量:
整型信号量与普通的信号量的区别:
对信号量的操作只有:初始化、P操作、V操作
缺点:不满足“让权等待”原则,会发生“忙等”
2.记录型信号量:
在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应该增加一个进程链表指针L,用于链接上述的所有等待进程。记录型信号量是由于它采用了记录型的数据结构而得名的。
例题:
用P、V操作进行进程的通过和释放,再加入原语来实现进程的“上锁”和“解锁”,等资源使用完毕,再利用block原语进行阻塞(主动让出处理机),该机制遵循了“让权等待”的原则。
3.AND型信号量:
AND型信号量在一些应用场合,是一个进程需要先获得两个或者更多的共享资源后方能执行其任务。
AND同步机制的基本思想是:将进程在整个运行过程中需要的所有资源,一次性全部的分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其它所有有可能为之分配的资源也不分配给它。亦即,对若干个临界资源的分配,采取原子操作方式:要么把它所请求的资源全部分配给进程,要么一个也不分配。由死锁理论可知,这样就可以避免上述死锁情况发生。为此,在wait操作中,增加一个“AND”条件,故称为AND同步,或称为同时wait操作。
缺点:AND型信号量满足了 “多种资源,数量为1”的使用情景,但是实际上还会有多种资源数量不固定的情景,AND型信号量显然处理不了这种情况的进程调度。
死锁的概念:
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去;此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
4.信号量集:
信号量集由两部分组成:标识组和等待任务列表;
标识组由三部分组成:1.OSFlagType——识别是否为信号量集的标志
2.OSFlagWaitList——指向等待任务列表的指针
3.OSFlagFlags——信号量表
注意:信号量集的标识组只是保存了各输入信号量的值,而至于如何对这些任务进行处理则是等待任务的事情。
等待任务必须完成以下两个操作:1.在多个信号量输入中挑选等待任务感兴趣的输入。
2.把挑选出来的输入按照等待任务所期待的方式运算,以得到输出。
1. 信号量集的标志组
UCOS不是使用事件控制块的结构描述信号量集,而是使用一个标志组的机构来描述信号量集OS_FLG_GRP
2. 等待任务链表
与其他事件不同,信号量集采用一个双向链表来组织等待任务。标志组OS_FLG_GRP的成员OSFlagWaitList指向信号量集的这个等待任务链表。
等待任务链表中的节点OS_FLAG_NODE中的成员OSFlagNodeFlags相当于一个过滤器,它可以将请求任务需要的信号筛选出来,不需要的信号屏蔽掉。
对等待任务链表的操作:添加节点和删除节点。
“信号量集”的三种特殊情况:
(1) Swait(S, d, d)。 此时在信号量集中只有一个信号量S, 但允许它每次申请d个资源,当现有资源数少于d时,不予分配。
(2) Swait(S, 1, 1)。 此时的信号量集已蜕化为一般的记录型信号量(S>1时)或互斥信号量(S=1时)。
(3) Swait(S, 1, 0)。这是一种很特殊且很有用的信号量操作。当S≥1时,允许多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。
信号量的应用:
- 利用信号量实现进程互斥关系
- 利用信号量实现进程同步关系
- 利用信号量实现进程前趋关系
小结:
5.信号量实现进程的互斥:
解释一下互斥原理:
先设置一个互斥信号量mutex(可自己定义),再初始化信号量,使mutex=1,然后进行P操作(申请资源使用),这时候mutex-1,即mutex=0,对这个资源进行“加锁”,别人无法再使用这个资源,也就是相当于(C语言中for循环的条件判断,满足条件就进行,不满足就跳出),等程序使用资源完毕时,就会进行V操作(释放资源),对资源进行“解锁”,这时候mutex+1,重新使mutex=1,使资源解放出来,等待下一个程序的使用。
6.信号量机制实现进程同步:
进程同步:要让各进程按要求有序地进行推进。
解释一下进程同步的原理:
让各进程按要求有序地进行推进,先将初始化同步信号量的初始值设置为0。我们让代码4在代码2之后进行执行,这时候因为异步性,不知道是P1进程先进行还是P2进程先进行,我们先在代码2后面设置一个V(S)操作,在代码4后面设置一个P(S)操作。【可能有以下两种情况】
1.当先进行P1进程时,进程会按照代码1,代码2的顺序进行,当执行完代码2时,到达了V(S)操作,这时候将资源释放了出来,这时候初始值增加(S+1),接着进行P2进程,由于P2中进行了P(S)[申请资源]的操作,所以进程会按照代码4,代码5,代码6进行下去。
2.当先进行P2进程时,会遇到P(S),但这时候的初始值为0,无法提供资源,P2进程进入自我阻塞状态。然后就进行P1进程的执行。这样就实现了让各进程按要求有序地进行推进。也就是实现了进程同步。
7.信号量机制实现前驱关系:
前驱关系本质上就是更复杂的同步问题。
在这一个进程实现之后执行V操作
在下一个进程实现之前执行P操作
总结:
这篇文章写了三个半小时,先进行看视频学习,两个视频反复看了两三遍,等自己理解之后,再写,进行整理和写上了自己对内容的理解,感觉虽然时间花费的比较多,但这些内容自己都理解了,还拓展了一部分,感觉自己棒棒,哈哈 。
信号量机制实现进程的互斥、同步、前驱相关推荐
- 操作系统之进程管理:11、用信号量机制实现进程同步、互斥、前驱关系
11.用信号量机制实现进程同步.互斥.前驱关系 思维导图 用信号量机制实现进程同步 用信号量机制实现进程互斥 用信号量机制实现进程的前驱关系 思维导图 用信号量机制实现进程同步 先来看一下什么是进程同 ...
- 2.3.5 操作系统之信号量机制实现进程的互斥、同步与前驱关系
文章目录 0.思维导图 1.信号量机制实现进程互斥 2.信号量机制实现进程同步 3.信号量机制实现前驱关系 0.思维导图 在看此小结内容之前,需熟悉这一篇博客里面的知识,关于P.V操作内部实现原理等h ...
- 十六、用信号量机制实现进程互斥、同步、前驱关系
一.知识总览 二.信号量机制实现进程互斥 注意: 1.信号量mutex表示进入临界区的名额 2.对不同的临界资源需要设置不同的互斥信号量 3.P.V操作必须成对出现,缺少P(mutex)就不能保证临界 ...
- 操作系统(二十二)用信号量机制实现进程互斥、同步、前驱关系
2.3.5 用信号量机制实现进程互斥.同步.前驱关系 目录 2.3.5 用信号量机制实现进程互斥.同步.前驱关系 2.3.5.1 用信号量机制实现进程互斥 2.3.5.2 用信号量机制实现进程同步 2 ...
- 二、操作系统——用信号量机制实现进程互斥、同步、前驱关系(详解)
一.什么是进程同步? 二.什么是进程互斥? 临界资源:一个时间段内只允许一个进程使用的资源 为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则: 空闲让进.临界区空闲时,可以允许一个 ...
- 8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系
文章目录 1 信号量机制 1.1 整形信号量 1.2 记录形信号量 1.3 信号量机制小结 2 用信号量机制实现进程互斥.同 步.前驱关系 2.1 信号量机制实现进程互斥 2.2 信号量机制实现进程同 ...
- 信号量机制实现进程互斥
目录 1.总览 2.信号量机制实现进程互斥 3.信号量机制实现进程同步 4.信号量机制实现前驱关系 5.小结 1.总览 2.信号量机制实现进程互斥 3.信号量机制实现进程同步 4.信号量机制实现前驱关 ...
- 信号量机制实现进程控制
一.信号量机制实现进程互斥 我们将一次仅允许一个进程访问的资源称为临界资源,而临界区是指访问临界资源的那段代码. 通常将互斥信号量设置为 mutex ,初始值为 1. 为什么初始值设置为 1 呢? 因 ...
- 2.3.5 用信号量实现 进程互斥 同步 前驱关系
目录 思维导图 实现进程互斥 实现进程同步 实现前驱关系 思维导图 实现进程互斥 实现进程同步 实现前驱关系
- 操作系统—用信号量机制实现进程互斥、进程同步和前驱关系
建议将思维导图保存下来观看,或者点击这里在线观看
最新文章
- 程序员编码时都戴耳机?到底在听什么?
- SAP ABAP实用技巧介绍系列之如何生成值为NULL的table row
- [转]C++的坑真的多吗?
- vs 设置起始页不见了_发朋友圈屏蔽爸妈,结果不小心设置成了仅家人可见...场面一发不可收拾哈哈哈哈!...
- 除了速度与激情 领克01带给我另一种有关生活方式的想象
- abp vnext中swagger使用小结
- IO多路复用(番外篇)、poll、epoll三者的区别
- Android之基于message的进程间通信Messenger
- java踩坑记-getResourceAsStream
- 部署ASDM图形化工具
- Latex 环境配置(TexLive + Texstudio)
- php用8好还是php7好,对比说明PHP7的优化提升
- hp 服务器 修复,Hp服务器 raid 磁盘故障数据库数据恢复过程
- 【AGC035F】Two Histograms
- 拼多多根据ID取商品详情-API
- 解决windows10右下脚工具栏图标显示不正常问题
- 科研人必看!全球优秀大数据可视化工具汇总!
- 龚昇:数学历史的启示
- html怎么设置联网,已连接(不可上网)怎么办?
- MySQL中如何删除有外键约束的表数据?
热门文章
- 数值分析及其matlab实现习题答案,数值分析练习题(含答案).doc
- Mat常用构造函数及IplImage 与Mat 之间的相互转换
- Kibana 操作 ES+搜索
- nodog+adbyby实现密码认证与视频广…
- jwplayer.v7.1.4视频播放器的使用
- html转换为pdf c#,HTML转PDF(C# itextsharp)
- 3.1.4_cardView原理解析
- C4D景深与运动模糊及hdr预设文件添加技巧
- csr驱动程序linux版,CSR8510蓝牙驱动下载
- 【自定义View】从零开始写一个PDF查看器