共享内存段中映射数据的内存管理

Memory Management for Mapped Data in Shared Memory Segments

我正在用 C 开发一个项目,该项目在 Linux 系统上使用 IPC 共享内存。但是,我对这些段中的内存管理有点困惑。我正在为这个项目使用 POSIX API。

我了解如何创建共享段,并且如果您未能使用 shm_unlink() 正确删除它们,这些共享段将一直存在直到重新启动。此外,我了解如何分别使用 mmapmunmap 进行实际映射和取消映射。然而,这些操作的使用以及它如何影响这些共享段中存储的数据让我感到困惑。

以下是我试图正确理解的内容:

假设我使用带有 O_CREAT 标志的 shm_open() 创建了一个段。这为我提供了一个文件描述符,我在下面的示例中将其命名为 msfd。现在我有一个结构,我使用以下内容映射到该地址 space:

mystruct* ms = (mystruct*)mmap(NULL, sizeof(mystruct), PROT_READ | PROT_WRITE, MAP_SHARED, msfd, 0);
//set the elements of the struct here using ms->element = X as usual

第 1 部分 这是我困惑的地方。可以说这个进程现在已经完成访问该位置,因为它只是设置数据供另一个进程读取。我还叫munmap()吗?

我希望其他进程仍然可以访问当前进程设置的所有这些数据。通常,您不会在 malloc 指针上调用 free(),直到不再需要永久使用它为止。但是,我知道当这个过程退出时,取消映射无论如何都会自动发生。数据是否保留在段内,或者该段是否只是根据分配的大小和名称保留?

第 2 部分) 我们现在正在处理另一个需要访问该共享段并从中读取的应用程序。我知道我们现在用 shm_open() 打开那个段,然后用 mmap() 执行相同的映射操作。现在我们可以访问该段中的结构。当我们从这个进程(不是创建数据的进程)调用 munmap() 时,它 "unlinks" 我们从那个指针调用,但是数据仍然可以访问。这是否假设进程 1(创建者)有 NOT 称为 munmap()

Is the data persisted inside the segment,

是的。

does that segment just get reserved with it's allotted size and name?

也是。

Does this assume that process 1 (the creator) has NOT called munmap()?

没有

共享内存是通过 shm_create() 创建的(从可用的 OS 内存中获取),从这一刻起,它会承载已写入的任何内容,直到将其返回给 OS 通过 shm_unlink().

shm_create()shm_open() 以系统为导向,(共享)内存是系统(而非进程)特定资源。

mmap()unmap() 面向进程,即映射和取消映射系统资源共享内存 into/out-of 进程地址 space。