【问题标题】:System V IPC vs POSIX IPCSystem V IPC 与 POSIX IPC
【发布时间】:2011-06-02 17:59:05
【问题描述】:
  1. System V IPCPOSIX IPC 有什么区别?
  2. 为什么我们有两个标准?
  3. 如何决定使用哪些 IPC 功能?

【问题讨论】:

  • 有一个原因导致我选择 sysv 消息队列而不是 posix。 posix 消息队列不支持通过 mtype 传递消息的可能性。我有关于它的blogged..
  • Kurt Wall 题为 Linux Programming Unleashed 2nd Edition 的书第 382 页中,它说:System V IPC is well known and commonly used, but the Linux implementation of it is badly broken. 我不知道 Linux 是否有改进为了解决这个问题,如果有人知道请告诉。今天,我也面临着与 Posix IPCSystem V IPC 类似的选择,我的方法是仔细了解将使用哪种类型的 IPC 原语,因为有一个方面的优势。例如,一个进程可能会突然死亡,然后呢?

标签: posix ipc sysv


【解决方案1】:
  • Systen V 和 POSIX IPC 是两个不同但相关的同一事物的实现。

“Unix System V,通常缩写为 SysV(通常发音为 - 尽管很少写成 - “System Five”),是 Unix 操作系统的第一个商业版本之一。它最初由美国电话电报公司 (American Telephone & Telegraph) 开发( AT&T),并于 1983 年首次发布。”

-维基百科

“POSIX 或“Portable Operating System Interface [for Unix]”是 IEEE 指定的一系列相关标准的名称,用于定义应用程序编程接口 (API)”

-维基百科

  • Systm V 较早。 POSIX 是从 IEEE 的标准化倡议演变而来的。

  • GNU/Linux partially 与 POSIX 兼容。使用哪一个取决于您使用此 IPC 的操作系统。大多数供应商正在转向POSIX

Unix Network Programming: Interprocess Communications v. 2 by Richard Stevens 可以很好地了解这两者。

【讨论】:

  • 您没有讨论问题中提到的有关进程间通信的任何内容。
【解决方案2】:

System V IPC 较旧,而 POSIX IPC 较新。但是,在某些方面存在一些差异。 Posix 并不总是优于 System V。

  1. Posix 的信号量、队列和共享内存具有 Ascii 字符串名称,而在 System V 下,这些以整数形式给出。

  2. System V 信号量允许在进程终止时自动释放(semop SEM_UNDO 标志)。 Posix 没有这样的东西。

  3. 在 Linux 和 FreeBSD 上,posix 队列有很大的优势,因为 mq_open 给出的处理程序基本上是可以轮询/epolled/selected/kqueued 的文件描述符。

【讨论】:

  • 看来,因此,选择取决于将要使用的 IPC 原语 的类型。 Posix 有一些很棒,但也有一些 System V 很棒。如果一个进程突然死亡,并且世界上没有 API 可以拦截这样的事件,那么 IPC 原语 将悬空或被检测到。有不同的用例,其中 Posix 是最好的,然后还有其他用例,其中 System V 可以很好地处理问题。
【解决方案3】:
  1. 我认为主要区别在于所有 POSIX IPC 都是线程安全的,而大多数 SysV IPC 不是 [1]。
  2. 因为 Unix 战争 [2]。 单一 UNIX 规范 (SUS) [3],又名 POSIX,旨在标准化基于 Unix 的系统上的接口。
  3. 您可能需要 POSIX。完全取决于您的要求。

【讨论】:

    【解决方案4】:

    两者都有相同的基本工具——信号量、共享内存和消息队列。它们为这些工具提供了稍微不同的界面,但基本概念是相同的。一个显着的区别是 POSIX 为消息队列提供了一些 Sys V 没有的通知功能。 (见mq_notify()。)

    Sys V IPC 已经存在了更长的时间,这具有一些实际意义 --

    首先,POSIX IPC 的实施不太广泛。我为 POSIX IPC 和 its documentation lists what I know about POSIX IPC implementations on various platforms 编写了一个 Python 包装器。

    在该文档中列出的所有平台上,Sys V IPC 完全实现了 AFAIK,而您可以看到 POSIX IPC 不是。

    他们相对年龄的第二个含义是 POSIX IPC 是在 Sys V IPC 使用了一段时间之后设计的。因此,POSIX API 的设计者能够从 Sys V API 的优点和缺点中学习。因此,POSIX API 更简单 并且更易于使用 IMO,我推荐它通过 Sys V API。

    我应该注意,我从未运行过任何性能测试来比较这两者。我认为旧的 API(Sys V)会有更多的时间 进行性能调整,但这只是推测,当然不能替代实际测试。

    至于为什么有两个标准——POSIX 创建他们的标准是因为他们认为这是对 Sys V 标准的改进。但是,如果每个人都同意 POSIX IPC 更好,那么许多程序仍然使用 Sys V IPC,并且将它们全部移植到 POSIX IPC 需要数年时间。在实践中,这不值得付出努力,因此即使从明天起所有新代码都使用 POSIX IPC,Sys V IPC 也会存在很多年。

    如果您不知道更多关于您打算做什么,我们无法告诉您应该使用哪个,但您在此处获得的答案应该为您提供足够的信息来自行决定。

    【讨论】:

    • man-pages 和其他文章没有强调一个重要的区别,即 sysv 消息队列有一个通过 mtype 传递消息的概念(posix msgq 没有这个)。在某些情况下,这可能是一个重要的设计元素,并且引用我的经验,结果证明它是一个阻碍。我有关于它的blogged
    • 在 OpenGroup 的文档之后,SysV IPC 从第 2 期开始成为 SUS 的一部分,并且从第 7 期开始成为新接口。确实,一个已经存在很久了,但两者都是 SUS 的一部分,所以两者都是一部分POSIX 的。
    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多