我知道execve会丢弃任何现有的动态分配内存。我的工作是拥有一个调用二进制文件的C程序,然后使用共享缓冲区与之通信。这里的关键是效率,因为缓冲区的大小相对较小,所以我想尽可能避免rpc /使用系统调用(如shmat等)。
以前,我一直在C程序中创建缓冲区,然后使用clone(设置了CLONE_VM标志),然后执行对二进制文件的exec调用。显然这不起作用,因为exec取代了图像。
我并不担心设置的效率如何,我的目标是在设置完成后拥有最有效的通信系统。
除非有人能够在同一地址空间内执行二进制文件以便它们可以共享内存区域,我将使用shmget和shmat(从执行的二进制文件中附加共享内存)。
是否有更有效的方法来实现共享内存?
答案 0 :(得分:2)
您问题中的问题陈述不完善。由于shmat
只会按exec
调用一次,因此费用会在整个过程的生命周期内摊销。因为在你的评论中你声明你必须exec
一个不同的程序(目前还不清楚为什么),线程已经结束了。
您担心使用与shmat
关联的共享内存传递消息会比通过其他方式共享的某些内存产生更大的惩罚。这种担心基本上没有根据。您可以像使用任何其他动态分配的内存一样使用共享内存,但需要注意的是,附加到它的每个进程的地址偏移量可能不同。
您没有明确说明您的要求或问题的参数,但在您的评论中,您声明要在两个进程之间传递消息而不会产生上下文切换。如果消息队列为空,则允许消费者等待,这是可能的。但是,如果消费者和生产者在不同的处理器上运行,这只会很有成效。
无论如何,我会考虑所有这些问题的后期优化。首先关注正确传递消息。然后找出性能未达到可接受水平的瓶颈所在。