linux中支持很多标准,关于信号量(semaphore )有二种标准给予支持,有posix sem和system V sem ,你要问这是什么东东,那你就去自己baidu一下了,要多活动一下自己的筋骨晓得不 ^_^
首先,我们来说说这二种sem的区别:
posix
1、不能在多个(无关系的)进程间使用
2、只是一个信号量
system V
1、可在多个无关的进程间使用
2、是一个信号量集
还有就是 posix sem操作简单 而system V相对要复杂得多。OK,我们这里主要要说的是posix sem下的二值信号量的处理问题:
信号量机制
1965年,荷兰学者提出了利用信号量机制解决进程同步问题,信号量正式成为有效的进程同步工具,现在信号量机制被广泛的用于单处理机和多处理机系统以及计算机网络中。
信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用临界区的进程数。
Dijkstra同时提出了对信号量操作的PV原语。(这里为什么是PV二字母喃 ,原来是这个荷兰学者英语学得和我一样差 ???还是和我一样爱国???以至于只能用本国的意思和 wait post这二单词意思差不多的二个以p v 开头的单词 )呵呵
P原语操作的动作是:
(1)S减1;
(2)若S减1后仍大于或等于零,则进程继续执行;
(3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。
V原语操作的动作是:
(1)S加1;
(2)若相加结果大于零,则进程继续执行;
(3)若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断的发生。
二值信号量:是指 只有0 和 1 这二个值的信号量 也就是说初始值是1或0 我们这里假定 初始值是1 那么 当对其进行wait操作的时候,此值就减一为0了 那么就会阻塞所有的当前进程中的其它的信号 和 信号量;等待post 的到来 ,当post到来后,就释放掉了阻塞,其它的操作就可以运行了。这种方法常常用来实现一个临界区的原子执行,有关原子 执行的概念请看我前面的文章,把想要进行原子操作的代码放到 wait和 post之间,就不会受到其它信号或其它进程或线程对其所作的影响了,这也相当于互斥操作。