小编Ben*_*Ben的帖子

共享内存IPC同步(无锁)

请考虑以下情形:

要求:

  • Intel x64 Server(多个CPU插槽=> NUMA)
  • Ubuntu 12,GCC 4.6
  • 两个进程在(命名)共享内存上共享大量数据
  • 古典生产者 - 消费者情景
  • 内存安排在循环缓冲区(带M个元素)

程序序列(伪代码):

流程A(生产者):

int bufferPos = 0;
while( true )
{
    if( isBufferEmpty( bufferPos ) )
    {
        writeData( bufferPos );
        setBufferFull( bufferPos );

        bufferPos = ( bufferPos + 1 ) % M;
    }
}
Run Code Online (Sandbox Code Playgroud)

流程B(消费者):

int bufferPos = 0;
while( true )
{
    if( isBufferFull( bufferPos ) )
    {
        readData( bufferPos );
        setBufferEmpty( bufferPos );

        bufferPos = ( bufferPos + 1 ) % M;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在这个古老的问题:如何有效地同步它们!? …

c++ synchronization ipc shared-memory lock-free

12
推荐指数
1
解决办法
1万
查看次数

支持NUMA的Linux命名共享内存

Windows API提供CreateFileMappingNuma函数(http://msdn.microsoft.com/en-us/library/windows/desktop/aa366539(v=vs.85).aspx)以在特定NUMA上创建命名共享内存空间节点.

到目前为止,我还没有找到Linux的等效功能.

我目前的方法如下:

  1. 分配命名的共享内存(使用shm_open(...))
  2. 确定当前的NUMA节点(使用numa_move_pages(...))
  3. 将页面移动到目标节点(再次使用numa_move_pages(...))

有谁知道更好的方法?

编辑:为了记录:我提出的实施确实按预期工作!

linux memory shared numa

5
推荐指数
1
解决办法
901
查看次数

标签 统计

c++ ×1

ipc ×1

linux ×1

lock-free ×1

memory ×1

numa ×1

shared ×1

shared-memory ×1

synchronization ×1