当前位置:嗨网首页>书籍在线阅读

13-总结

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

47.12 总结

System V信号量允许进程同步它们的动作。这在当一个进程必须要获取对某些共享资源(如一块共享内存区域)的互斥性访问时是比较有用的。

信号量的创建和操作是以集合为单位的,一个集合包含一个或多个信号量。集合中的每个信号量都是一个整数,其值永远大于或等于0。semop()系统调用允许调用者在一个信号量上加上一个整数、从一个信号量中减去一个整数、或等待一个信号量等于0。后两个操作可能会导致调用者阻塞。

信号量实现无需对一个新信号量集中的成员进行初始化,因此应用程序就必须要在创建完之后对它们进行初始化。当一些地位平等的进程中任意一个进程试图创建和初始化信号量时就需要特别小心以防止因这两个步骤是通过单独的系统调用来完成的而可能出现的竞争条件。

如果多个进程对该信号量减去的值是一样的,那么当条件允许时到底哪个进程会首先被允许执行操作是不确定的。但如果多个进程对信号量减去的值是不同的,那么会按照先满足条件先服务的顺序来进行并且需要小心避免出现一个进程因信号量永远无法达到允许进程操作继续往前执行的值而饿死的情况。

SEM_UNDO标记允许一个进程的信号量操作在进程终止时自动撤销。这对于防止出现进程意外终止而引起的信号量处于一个会导致其他进程因等待已终止的进程修改信号量值而永远阻塞情况来讲是比较有用的。

System V信号量的分配和操作是以集合为单位的,并且对其增加和减小的数量可以是任意的。它们提供的功能要多于大多数应用程序所需的功能。对信号量常见的要求是单个二元信号量,它的取值只能是0和1。本章介绍了如何以System V信号量为基础实现一个二元信号量。

更多信息

[Bovet & Cesati, 2005]和[Maxwell, 1999]提供了一些有关Linux上信号量实现的背景信息。[Dijkstra, 1968]是早期有关信号量理论的一片经典论文。