1、相关概念
信号量:本质是一种数据操作锁,本身不具有数据交换的功能,而是通过其他的通信资源(文件,外部设备)实现进程间通信,本身是一种外部资源的标识。相当于计数器,记录临界资源内资源可用数,保证进入临界区时有资源可用。负责数据操作的同步、互斥等功能。
临界资源:不同进程访问的同一公共资源,另外要是多个进程访问同一公共资源,则此公共资源不属于它们之中任何一个
临界区:访问同一公共资源的代码(例如,send和recv就是临界区,因为其访问同一公共资源)
同步:不引起数据资源二义性的条件下,保证临界资源可用
互斥:进程独占某种资源
二元信号量:相当于互斥锁,保证多进程、多线程的同步互斥问题
2、信号量的性质
信号量本身就是一种临界资源,会被不同进程看到,但却有与其他临界资源不同的性质:
(1)以信号量集的形式申请信号量,进入状态:申请资源使用P操作,并使P减1;退出状态:释放资源使用V操作,并使V+1
(2)P、V都是原子的,不用保护,没有二义性。
3、信号量操作函数中的SEM_UNDO标志
每一个独立的信号灯操作可能都需要维护一个调整动作。 Linux 至少为每一个进程的每一个信号灯数组都维护一个 sem_undo 的数据结构。如果请求的进程没有,就在需要的时候为它创建一个。这个新的 sem_undo 数据结构同时在进程的 task_struct 数据结构和信号灯队列的 semid_ds 数据结构的队列中排队。对信号灯队列中的信号灯执行操作的时候,和这个操作值相抵消的值加到这个进程的 sem_undo 数据结构的调整队列(这个信号灯的条目上)。例如,如果操作值为 2 ,那么这个就在这个信号灯的调整条目上增加 -2 。
当进程被删除,比如退出的时候, Linux 遍历它的 sem_undo 数据结构组,并实施对于信号灯数组的调整。如果删除信号灯,它的 sem_undo 数据结构仍旧停留在进程的 task_struct 队列中,但是相应的信号灯数组标识符标记为无效。这种情况下,清除信号灯的代码只是简单地废弃这个sem_undo数据结构。
原文地址:http://frankenstein.blog.51cto.com/10918184/1812240