本文介绍操作系统进程管理的两个核心概念:
- 信号量
- PV操作
一、信号量介绍
1.1 信号量引入
信号量(Semaphore)1965年由Dijkstra引入的。信号量一般由一个值是一个变量,其值有可能是0,或者一个正数,或者是负数:
- 0表示没有资源可以使用
- 大于0,标识可用资源的数量
- 小于0,其绝对值表示等待这个资源的进程的个数
针对信号量,Dijkstra提出了两个操作:
- P操作
- V操作
信号量的值只有通过PV操作来完成。
1.2 PV原语操作(atomic action)
PV操作里面会有一些列步骤,这些步骤是一个原语操作(atomic action),类似于数据库的事务,要么同时成功,要么同时失败。
二、P操作
P操作流程
P操作核心:如果有资源(信号量大于0),则继续执行,否则阻塞自己(处于睡眠等待信号量的状态)
三、V操作
V操作流程
四、关键点
- P/V操作必须成对出现,这样就不会出现死循环
- 信号量大于0的确表示有临界资源可供使用,而且这个时候没有进程被阻塞在这个资源上,也就是说没有进程因为得不到这类资源而阻塞,所以没有被阻塞的进程,自然不需要唤醒。
- 原语操作的本质在于:一个进程使用完临界资源后,释放临界资源,使信号量加1,以通知其它的进程,这个时候如果信号量<=0,表明有进程阻塞在该类资源上,因此要从阻塞队列里唤醒一个进程来“转手”该类资源。比如,有2个某类资源,三个进程A、B、C、D要用该类资源,最开始信号量=2,当A进入,信号量=1,当B进入信号量=0,表明该类资源刚好用完,当C进入时信号量=-1,表明有一个进程被阻塞了(C会被阻塞),D进入,信号量=-2(D继续阻塞)。当A用完该类资源时,进行V操作,信号量=-1,释放该类资源,而这时信号量<0,表明有进程阻塞在该类资源上,于是唤醒一个。
- 当一个进程阻塞了的时候,它已经执行过了P操作,并卡在临界区那个地方。当唤醒它时就立即进入它自己的临界区,并不需要执行P操作了,当执行完了临界区的程序后,就执行V操作。
- 当信号量信号量小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目。S大于0时表示可用的临界资源数。注意在不同情况下所表达的含义不一样。当等于0时,表示刚好用完。
时间: 2024-10-09 22:49:13