1

mmap()进程必须从父进程继承映射以共享内存。有没有办法在不共享父进程的进程之间共享内存?shmat()似乎是最好的解决方案,但如果进程没有在退出/死亡时分离内存,则需要清理。

域套接字接近共享内存......

4

1 回答 1

2

使用mmap,如果您使用匿名内存,进程必须从父级继承映射。但是,如果映射由文件支持,则没有这样的要求。shmat,也就是 System V 共享内存,也不是没有问题 - 传统上它曾经是一种有限的资源,需要使用 sysctl 和 root 来提高限制。

mmap这两个进程可以打开和映射同一个文件,然后取消链接该文件。现在,当所有进程退出时,文件也将被自动删除。或者它可以在开始时取消链接 - 然后服务器进程可以通过 unix 套接字将打开的文件描述符共享给客户端。

当然,使用带有文件备份的 mmap 意味着您将需要实际的磁盘空间来备份映射,并且映射将被刷新到磁盘。

如果您想要一个不受磁盘文件支持的映射,您可以使用POSIX 共享内存对象

System V 共享内存(shmget(2)、shmop(2) 等)是较旧的共享内存 API。POSIX 共享内存提供了一个更简单、设计更好的接口;另一方面,与 System V 共享内存相比,POSIX 共享内存的可用性稍差(尤其是在旧系统上)。

在 Linux 上,这些本质上只是文件,/dev/shm但使用它们的可移植方式是使用shm_open. 同样,即使共享内存对象未shm_unlink与进程空间。

因此类似于:

fd = shm_open("/my_shared_mem", O_RDWR|O_CREAT, 0700);
ftruncate(fd, 64 * 4096);
shared_mem = mmap(NULL, 64 * 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)

在第一个过程中,第二个可以打开O_RDWR并且不需要截断。要删除共享内存对象,请使用shm_unlink

shm_unlink("/my_shared_mem");

这将立即取消链接/dev/shm;那些打开它的进程可以继续使用它;仅当每个进程停止使用该对象时,该对象才被实际删除。

于 2017-03-01T05:24:42.767 回答