用于 64 位/32 位 IPC 的 POSIX 信号量的替代方案?

Alternatives to POSIX semaphores for 64-bit/32-bit IPC?

本文关键字:方案 信号量 POSIX IPC 用于      更新时间:2023-10-16

我需要为需要在 64 位和 32 位进程之间同步的项目实现某种阻塞等待。 忙于等待共享内存变量会带来性能/调度问题,并且 POSIX 信号量似乎不支持 32 位和 64 位进程之间的 IPC。 Linux 上是否有其他低开销的流程间同步替代方案?

Linux 有 futexes,它是一个内核原语,它为一个进程进入睡眠状态和另一个进程唤醒它提供了一种方式。它们具有非常好的快速路径(在这些情况下避免内核调用),如果您将它们用作互斥锁,这很重要,但如果将它们用作信号量,则就不那么重要了。

你只需要它的两个最原始的函数。FUTEX_WAIT,当且仅当共享内存中的特定条目具有特定值时,才会使内核进入睡眠状态。另一个,FUTEX_WAKE,唤醒一个已经进入睡眠状态的进程FUTEX_WAIT。

您的"等待"代码将以原子方式检查共享变量以查看它是否需要休眠,然后在且仅当共享变量未更改时调用FUTEX_WAIT进入睡眠状态。您的"唤醒"代码将更改原子共享变量的值,然后调用FUTEX_WAKE唤醒任何处于休眠状态的线程。

如果您使用 64 位共享变量,但只在前 32 位中放置有意义的数据,则 32 位/64 位问题根本不重要,因此无论作为 64 位变量还是 32 位变量寻址,它的工作原理都相同。

对于使用阻塞等待的进程间同步,简单的解决方案包括命名管道 (fd) 或系统 V 信号量。

命名管道具有与其关联的文件路径,以便两个进程可以独立打开文件(一个用于读取,另一个用于写入)。 对于纯同步,只需putc()发出信号,getc()等待,一次一个字符(值无关紧要)。 这将创建一个单向("半双工")通道;对于双向信号/等待,您将创建两个文件。 您甚至可以通过连续执行许多putc()调用来排队多个信号,有点像永不饱和的信号量。

系统 V 信号量还具有与其关联的文件路径。 它们的行为类似于Dijkstra信号量。

有关其他选项,请查看

https://en.wikipedia.org/wiki/Inter-process_communication