0

我知道 execve 会丢弃任何退出的动态分配的内存。我的工作是有一个 C 程序调用二进制文件,然后使用共享缓冲区与其通信。这里的关键是效率,因为缓冲区的大小相对较小,所以我想尽可能避免使用 rpc/系统调用(如 shmat 等)。

以前,我一直在 C 程序中创建缓冲区,然后使用克隆(设置了 CLONE_VM 标志),然后是对二进制文件的 exec 调用。显然这不起作用,因为 exec 替换了图像。

我不担心设置的效率如何,我的目标是一旦设置好就拥有最有效的通信系统。

除非有人有办法在同一地址空间内执行二进制文件以便他们可以共享分配的内存区域,否则我将使用 shmget 和 shmat(从已执行的二进制文件中附加共享内存)。

有没有更有效的方法来实现共享内存?

4

1 回答 1

2

您问题中的问题陈述格式不正确。由于shmat每个 只会调用一次exec,因此它的成本将在整个过程的生命周期中摊销。由于在您的评论中您声明您必须exec使用不同的程序(目前尚不清楚为什么),因此线程已经结束。

您担心使用与shmat传递消息相关联的共享内存会比通过其他方式共享的某些内存产生更大的损失。这种恐惧在很大程度上是没有根据的。您可以像使用任何其他动态分配的内存一样使用共享内存,但需要注意的是,附加到它的每个进程的地址偏移量可能不同。

您没有明确说明您的要求或问题的参数,但在您的评论中您声明您希望在两个进程之间传递消息而不引起上下文切换。如果消息队列为空,这可以通过让消费者旋转等待来实现。但是,这只有在消费者和生产者在不同的处理器上运行时才有成效。

无论如何,我会考虑所有这些问题的后期优化。首先关注正确传递信息。如果性能不在可接受的水平,则找出瓶颈在哪里。

于 2012-08-03T00:10:18.383 回答