目录
一、信号量机制
1.1 背景
1965年,荷兰学者Dijkstra、计算机先驱之一提出的信号量机制(semaphores)机制是一种卓有成效的进程同步工具。在长期且广泛的应用中,信号量机制又得到了很大的发展,它从整型信号量经记录型信号量,进而发展为“信号量集”机制。
1.2 整型信号量
一个用于表示资源数目的整型量S,它与一般整型量不同,除初始化外,仅能通过两个标准的原子操作(atomic operation)wait(S)和signal(S)来访问,这就是著名的P/V操作:
1.3 记录型信号量
在采取“让权等待”的策略后,又会出现多个进程等待访问同一临界资源的情况。需求决定结构设计,为此,在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表指针,用于链接上述的所有的等待进程。
记录型信号量是由于它采用了记录型的数据结构而得名。
相应地,wait(S)和signal(S)操作可描述如下:
说明:该机制遵循了“让权等待”的原则。当S->value < 0时,其绝对值表示在该信号量链表中已阻塞进程的数目。V操作若加1后仍有S->value <= 0,则表示在该信号量链表中仍有等待该资源的进程被阻塞,故还应该调用wakeup原语,将链表中第一个等待进程唤醒。
1.4 AND型信号量
应用场合:一个进程往往需要获得两个或更多的共享资源才能执行其任务。当进程要求的共享资源愈多时,发生进程死锁的可能性也就愈大。
将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。操作方式具有原子性atom的含义,对若干个临界资源的分配,要么把它所请求的资源全部分配到进程,要么一个也不分配。
1.5 信号量集
如果每次只能对某类临界资源进行一个单位的申请或释放,当一次需要N个单位,便需要进行N次wait(S)操作,不仅低效甚至会增加死锁的概率。同时,为了确保系统的安全性,当所申请的资源数量低于某一下限时,还必须进行管制,不予以分配。
由此形成一般化的“信号量集”机制: