30

使用 System V 和 Posix 信号量之间的权衡是什么?

4

3 回答 3

56

来自奥莱利

  • System V 和 POSIX 信号量实现之间的一个显着区别是,在 System V 中,您可以控制可以增加或减少多少信号量。而在 POSIX 中,信号量计数增加和减少 1。
  • POSIX 信号量不允许操纵信号量权限,而 System V 信号量允许您将信号量的权限更改为原始权限的子集。
  • 信号量的初始化和创建在 POSIX 信号量中是原子的(从用户的角度来看)。
  • 从使用的角度来看,System V 信号量是笨拙的,而 POSIX 信号量是直截了当的
  • POSIX 信号量(使用未命名的信号量)的可扩展性远高于 System V 信号量。在用户/客户端场景中,每个用户都创建自己的服务器实例,最好使用 POSIX 信号量。
  • System V 信号量在创建信号量对象时创建一个信号量数组,而 POSIX 信号量只创建一个。由于这个特性,与 POSIX 信号量相比,System V 信号量的信号量创建(内存占用)成本更高。
  • 据说 POSIX 信号量的性能优于基于 System V 的信号量。
  • POSIX 信号量为进程范围的信号量而不是系统范围的信号量提供了一种机制。因此,如果开发人员忘记关闭信号量,则在进程退出时清除信号量。简单来说,POSIX 信号量为非持久信号量提供了一种机制。
于 2008-12-15T13:36:44.220 回答
26

在单独的进程(不是线程)中使用 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 共享信号量在现实系统中无法使用,但不能保证永远无法发送无法捕获的信号。限制二可以通过仔细编码来减轻,假设控制所有将使用给定信号量的代码。坦率地说,他们把它变成了标准,这有点令人惊讶。

于 2013-02-24T07:41:50.297 回答
10

我知道这已经过时了,但是为了那些仍在阅读 Google 的礼貌的人的利益,我发现使用 System V 信号量而不是 POSIX(系统级)信号量的第一原因是能够以某种方式获取信号量资源无论进程如何退出,内核都会自动返回。

我同意很少使用多个(原子)信号量操作(尽管它们在暂存期间很有用),并且 System V 接口很奇怪,但是根本没有办法可靠地实现与 POSIX 信号量相同的清理语义。

于 2012-10-11T22:34:52.303 回答