前面了解了软件方式与硬件方式实现互斥的优缺点,再两种方式中,最让人满意的是硬件方式中的机器指令,但是也有不尽人意的地方,如忙等,饥饿,死锁;
所以接下来就有了 信号量的方式来实现互斥;
定义
- 信号量是一种让进程之间交换信息的特殊的变量;
- 如果一个进程在等待一个信号量的话,那么他就会阻塞自己直到这个信号出现的时候;
- Wait 和 Signal 操作是原语,是作用于信号量的两种操作,是不能被中断的;
- 其次,还需要一个队列来让阻塞的进程等待信号量;
- 信号量中有一个整形量 integer value:
1、可能会被初始化为一个非负整数;
2、Wait 和 Signal 都是原语,是一段具有原子性的代码,不能被中断 - Wait 操作递减信号量值:
1、wait(s): s - 1;
2、wait操作:申请使用资源且拿不到资源则阻塞自己(s<0); - Signal操作递增信号量值;
1、signal(s): s + 1; - signal操作:释放资源并唤醒阻塞进程(s<=0);
信号量的种类
- 通用信号量(General Semaphore)
是一种记录型,其中一个域为整型,另一个域为队列,其元素为等待该信号量的阻塞进程(FIFO); - 二进制信号量(Binary Semaphore)
通用信号量
type semaphore = record;
count: integer;
queue: list of process;
end;
var s: semaphore;