1

这篇文章是关于在 Windows 上计算 Linux 中共享内存的性能。
我是 Linux 开发的新手。
我编写了客户端服务器应用程序,它计算在 1 秒内从客户端(进程 1)传输到服务器(进程 2)的共享内存中有多少数据包(大小为 2048 字节)。

在 Windows 中,我使用
CreateFileMapping
OpenFileMapping
MapViewOfFile
函数和共享内存同步我在客户端和服务器中使用命名事件(createevent),以便一次可以在共享内存块中执行读取或写入操作。
我也在结构内部使用循环缓冲区作为共享内存块,因此它将变成大小为 4096 的 512 个共享块

    struct block{
     BYTE Data[4096];
      long amount;
    }
    struct MemBuffer{
      block m_Blocks[512];
       ...
       ...
    }

实现了某种逻辑,以便它以 FIFO 方式工作。

现在在 linux 的情况下,我使用 posix 共享内存 api
shm_open
ftruncate
mmap

共享内存块是相同的(如上面提到的 windows)用于同步信号量

现在的表现

windows 计数是每秒 700000 个数据包
linux 计数是每秒 500000 个数据包,使用命名信号量
linux 计数是每秒 600000 个数据包使用未命名信号量

根据我在整个应用程序中的观察开销是同步所以任何人都可以建议我更好的同步方法或如何提高 Linux 中共享内存的整体性能?

提前致谢

更新:

我正在使用带有 Windows 2003 服务器和 Red Hat Enterprise Linux 6.0 的双引导机器。机器配置如下 Intel Quad Core with 2.4 Ghz , 4GB RAM

4

1 回答 1

0

这两种方法都应该在硬件级别产生相同的内存映射(除非你真的很不幸并且遇到了缓存冲突)。所以是的,你看到的区别在于信号量的实现。但是不要相信我的话,在你生产和消费缓冲区的地方做实验,只是你从来没有真正读过或写过它们。看看你是否得到相同的行为。

有很多库具有高性能信号量。尝试其中之一,例如boost

于 2012-05-30T04:21:58.657 回答