Unix,Linux下的信号灯

信号灯分为两种:

一种是简单信号量,另一种是用于进程间通讯的信号量集;


一、简单信号量:

属于POSIX标准的信号量;

从信号量的命名来看,信号量又可分为命名信号量和匿名(未命名)信号量;

从信号量的值来看,信号量可分为二进制信号量和计数信号量;


1、匿名信号量和命名信号量:

  匿名信号量是在内存中分配内存、进行初始化并由系统API进行管理的,它可以在多个线程之间进行资源同步,也可以在多个进程之间进行资源同步,这主要是看在初始化的时候给pshared传递的参数值,为0,则在线程之间同步,非0,则在进程之间同步;

  命名信号量与匿名信号量不同,它一般只用于在进程之间进行资源同步,而且是使用文件全路径来对信号量进行命名的;命名信号量具有属主用户ID、组ID和保护模式等参数;命名信号量的名称是在文件系统的命名空间中定义的;

  匿名信号量的操作函数有:sem_init、sem_destroy、sem_wait、sem_trywait、sem_post、sem_getvalue;

  命名信号量的操作函数有:sem_open、sem_close、sem_wait、sem_trywait、sem_post、sem_getvalue、sem_unlink;

    

2、二进制信号量和计数信号量:

  二进制信号量的值只有两个:0和1;这个时候信号量就相当于一个互斥锁;它表示可用资源数量只有1个,当一个调用者拥有并访问它的时候(值为0),其它调用者就必须阻塞并等待.知道拥有者释放这个信号量(值为1).

  计数信号量,从概念上来讲,它的值是一个非负整数,表示可用资源的数量;用于协调对共享资源的访问:在线程中操作共享资源的时候,当一个访问者申请使用一个单位的资源时,信号量的值减1,表示剩余的可用资源的数量减少1;当这个访问者使用完这个共享资源并退还这个共享资源给系统的时候,信号量的值增1,表示可用的共享资源数量多1;而申请资源和释放资源的操作是原子操作,即:信号量的值减1和增1操作是原子操作;也就是说,有一个资源申请动作,就必须对应有一个资源释放动作,有一个信号量减1操作,就必须对应有一个信号量增1的动作;如果信号量的值为0,就表示没有资源可用,那么这个时候,如果有后续的调用者来申请可用的共享资源,那么这个调用者就会被阻塞在这个信号量上,直到有一个调用者释放一个共享资源为止;

  

3、当信号量作为互斥锁使用时:

  信号量:相当于是代码周围的卫兵,当卫兵发现共享代码段正在被执行,则卫兵不让后续调用者前去执行;当共享代码段为空闲时,卫兵允许后续调用者去执行;

  互斥量:相当于一把多人共用的钥匙,谁拥有这把钥匙,谁就可以访问受保护的代码段;

    

二、信号量集:

它属于System V信号量,是一个集合;

常用于进程间的通讯;System V的IPC要求用于进程间通讯的信号量必须是一个集合;它是系统内核定义的一个数据结构;

信号量集的初始化操作由shmget函数完成



发布了49 篇原创文章 · 获赞 28 · 访问量 11万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章