使用System V和Posix信号量之间有什么平衡?
答案 0 :(得分:51)
来自O'Reilly:
- System V和POSIX信号量之间的一个显着差异 实现是在System V中实现的 你可以控制信号量 计数可以增加或减少; 而在POSIX中,信号量计数 增加和减少1。
- POSIX信号量不允许操纵信号量权限, 而System V信号量允许你 更改权限 信号量到原始的子集 权限。
- 信号量的初始化和创建是原子的(来自用户的 透视)在POSIX信号量。
- 从使用角度来看,System V信号量是笨拙的,而POSIX 信号量是直截了当的
- POSIX信号量的可扩展性(使用未命名的信号量)很多 高于System V信号量。在一个 用户/客户端场景,每个用户 创建自己的服务器实例, 最好使用POSIX 信号量。
- System V信号量,在创建信号量对象时,创建一个数组 信号量而POSIX信号量 只创一个。因为这 功能,信号量创建(记忆 足迹方面)在系统中更昂贵 与POSIX相比,V信号量 信号量。
- 据说POSIX信号量表现优于 基于System V的信号量。
- POSIX信号量为过程范围的信号量提供了一种机制 比系统范围的信号量。所以,如果一个 开发人员忘了关闭 信号量,在进程退出时 信号量被清理干净了。简单来说 术语,POSIX信号量提供了一个 非持久性机制 信号量。
答案 1 :(得分:23)
在单独的进程(而不是线程)中使用POSIX共享/命名信号量的两个主要问题: 当一个不同的进程在保持信号量锁定时死亡时,POSIX信号量不提供唤醒等待进程的机制。缺少清理可能导致僵尸信号量,这将导致任何其他或后续进程尝试使用它们进行死锁。也没有POSIX方法列出操作系统中的信号量以尝试识别和清理它们。 SysV IPC上的POSIX部分确实指定了ipcs和ipcrm工具来列出和操作全局SysV IPC资源。没有为POSIX IPC指定此类工具甚至机制,但在Linux上,这些资源通常可以在/ shm下找到。这意味着在错误的时间向错误的进程发出KILL信号可能会导致整个交互过程系统死锁,直到重新启动。
另一个缺点是对POSIX信号量使用文件语义。这意味着可以有多个具有相同名称但在不同状态的共享信号量。例如,一个进程调用sem_open,然后在sem_close之前调用sem_unlink。此过程仍然可以使用信号量,就像在关闭它之前取消链接打开文件一样。进程2在进程1的sem_unlink和sem_close调用之间的同一个信号量上调用sem_open,并且(根据文档)获得一个具有相同名称的全新信号量,但处于与进程1不同的状态。两个具有相同名称的共享信号量独立运作会破坏共享信号量的目的。
上述限制使得POSIX共享信号量在实际系统中无法使用,而无法保证永远不会发送无法捕获的信号。通过仔细编码可以减轻限制二,假设控制将使用给定信号量的所有代码。坦率地说,它们有点令人惊讶,因为它们已经成为标准。
答案 2 :(得分:10)
我知道这已经过时了,但是为了那些仍在阅读Google礼貌的人们的利益,我发现在POSIX(系统级)信号量上使用System V信号量的首要原因是获取信号量资源的能力一种由内核自动返回的方式,无论过程是如何排除的。
我同意很少使用多个(原子)信号量操作(尽管它们在分段期间很有用),并且System V接口很奇怪,但是根本无法可靠地实现相同的清理语义POSIX信号量。
答案 3 :(得分:0)
我想知道是什么让人design bad API's like System V Semaphores!无用的你有很强的理由去使用System V信号量(例如在一步中多次递增递减的原子操作),你应该坚持使用POSIX命名的信号量。
链接的文章讨论了System V信号量的错误和不直观。