信号量
标签: 操作系统
学习人数: 6110

荷兰著名的计算机科学家Dijkstra于 1965年提出了一个同步机构,称为信号量,信号量机制是一种功能较强的机制,可用来解决互斥与同步问题,它只能被两个标准的原语wait(S)和 signal(S)访问,也可记为“P操作”和“V 操作”。

原语是指完成某种功能且不被分割、不被中断执行的操作序列,通常可由硬件来实现。原语之所以不能被中断执行,是因为原语对变量的操作过程若被打断,可能会去运行另一个对同一变量的操作过程,从而出现临界段问题。

1.整型信号量

最初由 Dijkstra 把整型信号量定义为一个用于表示资源数目的整型量S,它与一般整型量不同, 除初始化外,仅能通过两个标准的原子操作(Atomic Operation) wait(S)和 signal(S)来访问。很长时间以来,这两个操作一直被分别称为 P、V 操作。

wait(S)和 signal(S)是原子操作,执行时是不可中断的。另外,在 wait 操作中,对 S 的测试和做 S=S-1 操作时都不可中断,信号量只能通过原语操作来访问,不能被进程调度所打断。

缺点:信号量 S≤0 时“忙等”,未遵循“让权等待”

 

2.记录型信号量

在整型信号量机制中的 wait 操作,只要是信号量 S≤0,就会不断地测试。因此,该机制并未遵循“让权等待”的准则,而是使进程处于“忙等”的状态。

记录型信号量机制则是一种不存在“忙等”现象的进程同步机制。但在采取了“让权等待”的策略后,又会出现多个进程等待访问同一临界资源的情况。

为此,在信号量机制中,除了需要一个用于代表资源数目的整型变量 value 外,还应增加一个进程链表指针 list,用于链接上述的所有等待进程。

相应地,wait(S)和 signal(S)操作可描述为:

wait操作, S.value-表示进程请求一个该类资源,当 S.valuevO时,表示该类资源已分配完 毕,因此进程应调用block原语,进行自我阻塞,放弃处理机,并插入该类资源的等待队列S.L, 可见该机制遵循了 “让权等待”的准则。

signal操作,表示进程释放一个资源,使系统中可供分配的该类资源数增1,因此有S.value ++。 若加1后仍是S.value < 0 , 则表示在S.L中仍有等待该资源的进程被阻塞,因此还应调用wakeup 原语,将 S.L中的第一个等待进程唤醒。

 

3.利用信号量实现进程互斥

为使多个进程能互斥地访问某临界资源,只需为该资源设置一互斥信号量 mutex,并 设其初始值为 1,然后将各进程访问该资源的临界区CS置于 wait(mutex)和 signal(mutex)操作之间即可。

利用整型信号量机制实现进程互斥时应注意,wait(mutex)和 signal(mutex) 必须成对出现;缺少 wait(mutex)会导致系统混乱,不能保证对临界资源的互斥访问;缺少 signal(mutex)将会使临界资源永远不被释放,从而使因等待该资源而阻塞的进程不再被唤醒。

 

4.利用信号量实现同步

信号量机制能用于解决进程间的各种同步问题。设 S 为实现进程P1、P2同步的公共信号量, 初值为0。进程P2中的语句y 要使用进程P1中语句X的运行结果,所以只有当语句X执行完成之 后语句y 才可以执行。

 

5.利用信号量实现前趋关系

还可利用信号量来描述程序或语句之间的前趋关系。设有两个并发执行的进程 P1和 P2。P1 中有语句 S1;P2中有语句 S2。希望在S1执行后再执行 S2。为实现这种前趋关系,只需使进程P1和P2共享一个公用信号量S,并赋予其初值为 0,将 signal(S)操作放在 语句S1后面, 而在S2语句前面插入 wait(S)操作。

前趋图举例

 



课后作业


登录后发布评论

暂无评论,来抢沙发