信号量

信号量英语:)又称为,是一个同步对象,用于保持在0至指定最大值之间的一个计数值。当线程完成一次对该对象的等待()时,该计数值减一;当线程完成一次对对象的释放()时,计数值加一。当计数值为0,则线程等待该对象不再能成功直至该对象变成状态。对象的计数值大于0,为状态;计数值等于0,为状态。

信号量的概念是由荷兰计算机科学家艾兹赫尔·戴克斯特拉()发明的[1],广泛的应用于不同的操作系统中。在系统中,给予每一个行程一个信号量,代表每个行程目前的状态,未得到控制权的行程会在特定地方被强迫停下来,等待可以继续进行的信号到来。如果信号量是一个任意的整数,通常被称为计数信号量(),或一般信号量();如果信号量只有二进位的0或1,称为二进位信号量()。

语法

计数信号量具备两种操作动作,称为V(signal())与P(wait())(即部分参考书常称的“PV操作”)。V操作会增加信号标S的数值,P操作会减少它。

运作方式:

  1. 初始化,给与它一个非负数的整数值。
  2. 运行P(wait()),信号标S的值将被减少。企图进入临界区段的行程,需要先运行P(wait())。当信号标S减为负值时,行程会被挡住,不能继续;当信号标S不为负值时,行程可以获准进入临界区段。
  3. 运行V(signal()),信号标S的值会被增加。结束离开临界区段的行程,将会运行V(signal())。当信号标S不为负值时,先前被挡住的其他行程,将可获准进入临界区段

提供的

线程使用或函数创建一个对象[2]。此时可以指定的当前计数值与计数值上限;也可指定对象的名字。其他进程中的线程可以指出已存在的对象的名字通过调用函数打开它。

如果多个线程在等待一个对象,不保证按照先进先出()顺序调度这些等待线程。外部事件,如内核模式的异步过程调用可改变等待顺序。

在对象为状态时,等待函数返回会把该对象计数值减1。函数把对象的计数值增加指定的值。任何线程,哪怕它没有等待完成过该对象,也可以使用来增加对象的计数。如果导致对象计数值超过上限,则该函数调用失败,返回298号错误:“”。

一个线程多次等待同一个对象,每次等待操作完成都会降低对象计数值(直至计数值为0时该线程阻塞)。然而,通过等待函数使用一个数组包含着同一个对象的多个句柄,不能实现对这个对象计数值的多次下降。

用完对象后,调用函数关闭它。对象的最后一个句柄被关闭后,操作系统会摧毁它。关闭并不影响它的计数值。因此,关闭前或者进程终止前,要确保已经正确调用过。否则,挂起等待该对象的线程会永久阻塞或超时返回。

参见

参考资料

  1. 戴克斯特拉, 艾兹赫尔. (PDF). E·W·戴克斯特拉档案馆. 得克萨斯大学奥斯汀分校美国历史中心. (文本版本)
  2. . [2016-09-05]. (原始内容存档于2016-09-16).

外部链接

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.