【问题标题】:Memory Management for Mapped Data in Shared Memory Segments共享内存段中映射数据的内存管理
【发布时间】:2015-06-01 22:15:48
【问题描述】:

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

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

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

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

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'ed 指针上调用 free(),直到不再需要永久使用它。但是,我知道当这个过程退出时,取消映射无论如何都会自动发生。数据是保留在段内,还是只是保留了分配的大小和名称?

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

【问题讨论】:

    标签: c linux posix shared-memory mmap


    【解决方案1】:

    数据是否持久化在段内,

    是的。

    该段是否只保留分配的大小和名称?

    也是。

    这是否假定进程 1(创建者)没有调用 munmap()?

    没有。

    共享内存是通过shm_create()(从可用的操作系统内存中获取)创建的,从此时起,它会承载已写入的任何内容,直到通过shm_unlink() 将其返回给操作系统。

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

    mmap()unmap() 面向进程,即将系统资源共享内存映射到进程地址空间或从进程地址空间中取出。

    【讨论】:

    • 感谢您的澄清!
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    相关资源
    最近更新 更多