互斥和同步解决方法之三:
信号量方法
软件方法和硬件方法都存在忙等问题,浪费了处理机时间。
信号量方法能实现进程互斥与同步,而不必忙等。
用信号量实现互斥的基本原理
1、两个或多个进程可以通过传递信号进行合作,可以迫使进程在某个位置暂时停止执行(阻塞等待),知道它收到一个可以向前推进的信号(被唤醒)。
2、将实现信号灯作用的变量称为信号量,常定义为记录型变量S,其中一个域为整型,另一个域为队列,其元素为等待该信号量的阻塞进程(FIFO)。
定义对信号量的两个原子操作:wait(s)和signal(s)
wait(s):
s.count=s.count-1;
if s.count<0
then begin
进程阻塞;
进程进入s.queue队列;
end;
singal(s)
s.count=s.count+1;
if s.count<=0
then begin
唤醒队首进程;
将进程从s.queue阻塞队列中移除;
end;
Wait\Signal的应用:
1、进程进入临界区之前,首先执行wait(s)原语,若s.count<0,则进程调用阻塞原语,将自己阻塞,并插入到s.count队列排队。
2、阻塞进程不会占用处理机时间,不是忙等。直到某个从临界区退出的进程执行signal(s)原语唤醒它。
3、一旦其它某个进程执行了signal(s)原语中的s,count+1的操作后,发现s.count+1操作后,发现s.count<=0,即阻塞队列中还有阻塞进程,则调用唤醒原语,把阻塞队列中第一个进程改为就绪状态。
信号量的类型:互斥信号量、资源信号量。
互斥信号量初始化为1,用于申请或归还资源使用权。资源信号量用于申请或归还资源,可以初始化为大于1的正常数,表示系统中某类资源的可用个数。