问题导入:
1)信号量是什么?
2)为什么需要信号量?
1、信号量
一个整值对象,可以表示不同的状态,比如资源的数量,等待获取资源的进程的个数(此时的信号量为负数)。通常用sem来表示。
2、通过信号量以及P/V操作来实现临界区的互斥
互斥:进程不在同一时刻持有资源
系统调用通过两个原子操作来修改信号量
P操作:将sem减去1,如果sem此时小于0,则进程进入阻塞等待,否则继续。
(理解:相当于进程申请使用一个资源,所以资源的数量减去一,如果小于0相当于操作系统还欠着其一个资源)
V操作:将sem 加上一,如果此时sem小于等于0,就唤醒一个等待中的进程。
(理解:相当于进程归还一个资源,所以将资源的数量加上一,若没有等待的进程,sem的值最少为1,若小于1,则说明还有其他的进程在等待,应该唤醒一个进程。
P操作在进入临界区的时候操作(相当于申请登记使用资源,如果没有资源就休眠进入等待)
V操作在出去临界区的时候操作(相当于归还申请使用的资源,并顺带好心的唤醒需要资源的小伙伴)
3、通过信号量以及P/V来实现进程的同步
此时信号量为条件变量:两个进程都会修改信号量,当信号量符合某个特殊的条件的时候,一个特定的进程运行。
(我的理解:让进程A在进程B之后运行。此时的信号量表示状态,只有在某个特定的状态的时候,进程A才开始运行。)
1)例子
初始化:
将初始信号量设置为0
进程A开始运行的时候将信号量减去1
进程B开始运行的时候将信号量加上1
2)过程模拟:
倘若进程A开始运行,先将信号量减去一。
若为-1,则进入阻塞,等待进程B运行后加上1;
若为1,则运行(说明B在A之前已经运行过了)。
倘若进程B开始运行,先将信号量加上1。
若为0,说明此时A还没有运行,直接加上一。
若为-1,说明此时A已经陷入阻塞,加上一后变为0后就可以开始运行。