一文学懂信号量机制的各种大题,详细操作见下文~
1965年,荷兰学者Dijkstra提出的信号量(Semaphores)机制是一种卓有成效的进程同步工具。在长期且广泛的应用中,信号量机制又得到了很大的发展,它从整型信号量经记录型信号量,进而发展为“信号量集”机制。现在,信号量机制已经被广泛地应用于单处理机和多处理机系统以及计算机网络中。
PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断的发生。
- 信号量机制分 整型信号量机制、记录型信号量机制、and型信号量机制、信号量集。
- 整型信号量是一种最简单的信号量,主要用于解决并发程序互斥访问临界资源问题。
- 记号信号量在整型信号量的举出上进行了改进,让不能进入临界区的进程“让权等待”,即进程状态有运行转换为阻塞状态,进程进入阻塞队列中等待。
- AND型信号量集是将进程在运行中所需要的临界资源全部一次性分配给进程,等进程用完后再全部一次释放。
整型和记录型的信号量是考研学子学习的重点~
问题提出:
- 进入区的检查和上锁操作无法一气呵成,从而导致了两个进程有可能同时进入临界区的问题~
- 所有的解决方案都无法实现“让权等待”~
目录
一.信号量机制
1.整型
2.记录型信号量
二.互斥、同步、前驱
一.信号量机制
用户进程可以通过使用OS提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥和进程同步。
信号量本质上是一种变量,可以是一个整数亦或是更加复杂的记录型变量。用信号量来表示系统中某种资源的数量(比如未婚优质对象的个数为1,则可以设置一个初值为1的信号量~)
原语,之前也说过,是一种特殊的程序段,只能一气呵成——如果进入区、退出区的操作均由原语实现,就能避免检查和上锁无法一气呵成~
- wait(S)和signal(S)两个原语,被简称为P、V操作~
1.整型
wait原语(P操作)用来检验信号量是否足够以满足当前进程,如果不满足则卡死在循环等待;signal(V操作)当进程结束后,将此时富余的信号量归还~ (类别先检查后上锁~)
(进程会发生忙等,不满足让权等待~)
2.记录型信号量
(解决了让权等待~) ——来源于block的自我阻塞~
二.互斥、同步、前驱
临界区:系统中的某些资源必须通过互斥来访问,访问那段系统资源的代码叫做临界区~
即——同一个时刻只能有一个进程进入临界区~
步骤:
- 分析并发进程的关键活动,划定临界区
- 设置互斥信号量mutex,初值为1
- 在进入区P——申请资源
- 在退出区V——申请资源
(互斥信号量mutex本质上是一种进入临界区的名额~)
(semaphore定义的信号量为记录型信号量,本身不会产生“忙等”的现象~)
- 不同的临界资源需要设置不同的互斥信号量
- PV操作必定成对出现~
即,要让各个并发的进程按要求有序地推进~
V操作可以理解为唤醒P操作的前提~
只有前面进程完成其后面的V获得信号量后——P后面的后置进程才有进入临界区的资格~
王道的一个典例,仔细看!
牢记前V后P的口诀~
王道的思维导图,很到位: