文章目录
- 教程
- 1. 信号量机制
- 1.1 概念
- 1.2 信号量机制——整型信号量
- 1.3 信号量机制——记录型信号量(important)
- 1.4 总结
- 2. 用信号量机制实现进程互斥、同步、前驱关系
- 2.1 信号量机制实现进程互斥(important)
- 2.2 信号量机制实现进程同步
- 2.3 信号量机制实现前驱关系
- 2.4 总结
教程
1.信号量机制 https://www.bilibili.com/video/BV1YE411D7nH/?p=21&share_source=copy_web&vd_source=d228985826b563972268952905224139
2. 用信号量机制实现进程互斥、同步、前驱关系 https://www.bilibili.com/video/BV1YE411D7nH/?p=22&share_source=copy_web&vd_source=d228985826b563972268952905224139
1. 信号量机制
复习回顾+思考:之前学习的这些进程互斥的解决方案分别存在哪些问题?
进程互斥的四种软件实现方式(单标志法、双标志先检查、双标志后检查、Peterson算法)
进程互斥的三种硬件实现方式(中断屏蔽方法、TS/TSL指令、Swap/XCHG指令)
-
在双标志先检查法中,
进入区的“检查”、“上锁” 操作无法一气呵成
,从而导致了两个进程有可能同时进入临界区的问题; -
所有的解决方案都
无法实现“让权等待”
1965年,荷兰学者Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法——信号量机制
1.1 概念
用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。
信号量其实就是一个变量
(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量
,比如:系统中只有一台打印机,就可以设置一个初值为 1 的信号量。
原语
是一种特殊的程序段,其执行只能一气呵成,不可被中断
。原语是由关中断/开中断
指令实现的。软件解决方案的主要问题是由“进入区的各种操作无法一气呵成”,因此如果能把进入区、退出区的操作都用“原语”实现,使这些操作能“一气呵成”就能避免问题。
一对原语
:wait(S)
原语和 signal(S)
原语,可以把原语理解为我们自己写的函数,函数名分别为 wait和 signal,括号里的信号量 S
其实就是函数调用时传入的一个参数。
wait、signal 原语常简称为 P、V操作
(来自荷兰语 proberen 和 verhogen)。因此,做题的时候常把wait(S)、signal(S) 两个操作分别写为 P(S)、V(S)
。
1.2 信号量机制——整型信号量
1.3 信号量机制——记录型信号量(important)
整型信号量的缺陷是存在“忙等”问题
,因此人们又提出了“记录型信号量”,即用记录型数据结构表示的信号量。
1.4 总结
2. 用信号量机制实现进程互斥、同步、前驱关系
Tips:不要一头钻到代码里,要注意理解信号量背后的含义,一个信号量对应一种资源
信号量的值 = 这种资源的剩余数量(信号量的值如果小于0,说明此时有进程在等待这种资源)
P( S ) —— 申请一个资源S,如果资源不够就阻塞等待
V( S ) —— 释放一个资源S,如果有进程在等待该资源,则唤醒一个进程