Articles of 共享内存

关心使用共享内存与CreateFileMapping和MapViewofFile

我有2个关于使用共享内存的问题。 我正在使用CreateFileMapping在两个进程之间创build共享内存区域。 1)我知道我需要调用CreateFileMapping或OpenFileMapping调用返回的每个句柄的CloseHandle来释放内存。 我的问题是,如果使用共享内存的程序在不调用CloseHandle的情况下退出,那么所有的句柄都会被适当的closures,而mem被Windows XP / 7解除分配? IE浏览器 – 所有使用内存的进程closures后,是否有可能发生内存泄漏? 2)我使用MapViewofFile获取指向mem的指针。 在一个实例中,我假设共享内存将始终存在于方法的上下文中。 所以我将MapViewOfFile的返回值保存为一个指针,并closures了mem的句柄,并使用指向共享mem的指针(但仍然locking对它的访问)。 这是安全的,还是我应该每次访问共享内存调用MapViewOfFile? 谢谢, 伊恩

用于由MPI创build的进程的共享内存访问控制机制

我有一个由多个进程使用的共享内存,这些进程是使用MPI创build的。 现在我需要一个机制来控制这个共享内存的访问。 我知道named semaphore和flock机制可以用来做这个,但只是想知道MPI是否提供了共享内存使用的任何特殊的locking机制? 我在Linux下工作。

64位Linux机器中最大可能的共享内存大小

我有64位Linux机器(Intel Xeon L5410 @ 2.33GHz)。 **meminfo:** MemTotal: 24672736 kB MemFree: 145372 kB Buffers: 181896 kB Cached: 22004648 kB SwapCached: 195072 kB Active: 9761028 kB Inactive: 13964532 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 24672736 kB LowFree: 145372 kB SwapTotal: 17414452 kB SwapFree: 15618852 kB Dirty: 2125148 kB Writeback: 0 kB AnonPages: 1358396 kB Mapped: […]

将一个数组结构初始化为共享内存

我正在创build4个程序,创build一个POSIX共享内存对象,这是一个结构数组,将由其他3个进程共享。 基本上这个项目模拟文件。 程序#1创build该对象。 程序#2将文件名和string作为参数,然后将文件名和string(文件内容)作为一个结构保存到共享内存中,该结构放入数组的可用元素中。 程序#3将列出文件名。 程序#4将search给定的文件并显示其内容。 我遇到的麻烦是初始化一个结构数组到共享内存。 我不断收到以下错误,告诉我我正在使用不正确的方法初始化指针: myformat.c:36: warning: initialization from incompatible pointer type 我已经search了这个主题,发现了一些类似的问题,但没有真正相关的问题。 那么,如何正确地将一个结构数组初始化为共享内存呢? 基于我的研究,我编码如下。 谢谢! PROGRAM#1(myformat.c): #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <sys/shm.h> #include <sys/stat.h> struct MyFiles { char *fileName; char *fileContents; }; int main() { /* the size of shared memory object */ int size = sizeof(struct […]

在Linux中共享可执行的内存页面?

为了保存空间,是否可以在Linux上共享可执行页面? 我知道有共享的内存API可以用来在不同的进程之间共享内存,但我不认为这是用来做这件事的。 基本上,我想有一个共享内存区域,可以加载一些常用的共享库。 我想让dynamic连接器链接到预加载的(只读)图像,而不是必须将所有的共享库图像加载到每一个进程(这看起来像是浪费)。 这是可能的Linux内核? Darwin内核使用Mach VM的特性(称为commpages) (dyld共享高速caching存储在那里)来实现这一function。 交易是可以访问和分享每个进程之间的。 为了澄清,我知道共享对象(库)是什么。 目前,dynamic连接器在Linux上的作用是将所有必需的库加载到程序的地址空间中,这意味着每个与libc链接的应用程序在其地址空间中都会有一个libc映像。 在Darwin上,可以通过在一组共享内存页面上具有 libc的可执行文件(和其他只读文件)来消除这个问题。 共享图像的可写部分仍然是分开的。 编辑:我知道ELF格式不支持分离共享库的数据和文本段。 我没有使用ELF, 我使用了不同的二进制格式(使用我自己的binfmt内核模块和我自己的dynamic链接器) 。 如果Linux内核支持类似commpage的function,我很感兴趣。 编辑2:我能想到这样做的唯一方法是在内核中分配一大块内存,并将其映射到每个执行的二进制文件中。 第一次执行任何二进制文件时,dynamic连接器可以解除保护,填充所需的数据并保护它。 然后不知何故,内核将不得不确保内存段没有被其他任何东西修改,因为它会打开一个巨大的安全漏洞。 另一个

如何附加到现有的共享内存段

我遇到了共享内存的问题。 我有一个创build和写入共享内存段的过程就好了。 但是我无法获得第二个过程来附加相同的现有细分。 我的第二个进程可以创build一个新的共享段,如果我使用IPC_CREATE标志,但我需要附加到由第一个进程创build的现有共享段。 这是我在第二个过程中的代码: int nSharedMemoryID = 10; key_t tKey = ftok("/dev/null", nSharedMemoryID); if (tKey == -1) { std::cerr << "ERROR: ftok(id: " << nSharedMemoryID << ") failed, " << strerror(errno) << std::endl; exit(3); } std::cout << "ftok() successful " << std::endl; size_t nSharedMemorySize = 10000; int id = shmget(tKey, nSharedMemorySize, S_IRUSR | S_IWUSR […]

mmap是否与所有进程共享内存?

当我这样做: myProgram.h myProgram.c struct PipeShm { // all my fields // more // … }; struct PipeShm myPipe = { /* initialization for all fields */ }; struct PipeShm * sharedPipe = &myPipe; void func() { sharedPipe = mmap (NULL, sizeof * sharedPipe, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0); } 当我mmap指针sharedPipe ,如果我从main()从myProgram代码调用任何方法,所有进程将共享共享与myPipe结构共享的内存? 或者每个新创build的孩子都会拥有一个新的myPipe ? […]

我如何与shm_open共享现有的内存?

在Linux中,我想与其他进程共享我的进程的一些内存内容。 其中一种方法是使用shm_open和mmap。 如下所示。 /* Create a new memory object */ fd = shm_open( "/bolts", O_RDWR | O_CREAT, 0777 ); if( fd == -1 ) { fprintf( stderr, "Open failed:%s\n", strerror( errno ) ); return EXIT_FAILURE; } /* Set the memory object's size */ if( ftruncate( fd, sizeof( *addr ) ) == -1 ) { fprintf( […]

ftok()碰撞

我正在使用ftok()为C应用程序使用的共享内存段生成标识符。 我遇到了问题,在一个盒子里,我碰到了root使用的标识符。 我可以在这个例子中通过黑客代码修复它,但我想要一个更强大的解决scheme。 应用程序被安装到自己的逻辑卷中,并且提供给ftok的path是应用程序的二进制目录(在该lv内)。 所提供的ID从1开始,通常是六打左右。 我已经追踪到,ftok会做这样的事情: (id & 0xff) << 24 | (st.st_dev & 0xff) << 16 | (st.st_ino & 0xffff) st.st_dev / st.st_ino的组合应该是非常独特的。 但是我已经看到了一些盒子,st_dev的最低位通常是0(即st_dev数字通常是256的倍数)。 而且由于二进制目录是在一个逻辑卷中,所以不能保证inode号码与root用途不同。 有没有一个很好的解决方法 – 一个更好的替代ftok,或者设置机器的方式,使st_dev数字将更有用的ftok?

一对多的IPC

我正在寻找一个ipc机制,这将允许从一个进程的数据更新的高吞吐量到许多(数千)。 “服务器”进程将负责高频更新数据结构。 更新后,我想通知“客户”进程的更新,并允许这些进程读取新的数据。 在Linux或FreeBSD环境下,这将是一个好方法吗?