荷兰著名的计算机科学家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.利用信号量实现同步
信号量机制能用于解决进程间的各...
无
登录后开始许愿
暂无评论,来抢沙发