gpt4 book ai didi

shared-memory - 在 Linux 中使用 ipcrm 删除共享内存

转载 作者:行者123 更新时间:2023-12-03 12:10:11 28 4
gpt4 key购买 nike

我正在使用共享内存应用程序,并使用以下命令删除段:

 ipcrm -M 0x0000162e (this is the key)

但我不知道我做的是否正确,因为当我运行 ipcs 时我看到相同的段,但 key 为 0x0000000。那么内存段真的被删除了吗?当我多次运行我的应用程序时,我会看到带有 key 0x000000 的不同内存段,如下所示:
 key        shmid      owner      perms      bytes      nattch     status
0x00000000 65538 me 666 27 2 dest
0x00000000 98307 me 666 5 2 dest
0x00000000 131076 me 666 5 1 dest
0x00000000 163845 me 666 5 0

实际发生了什么?内存段真的被删除了吗?

编辑:问题是 - 正如下面接受的答案中所说 - 有两个进程使用共享内存,直到所有进程都关闭,内存段不会消失。

最佳答案

我隐约记得在我的 UNIX(AIX 和 HPUX,我承认我从未在 Linux 中使用过共享内存)的日子里,删除只是将 block 标记为新客户端不再可附加。

只有在没有更多进程附加到它之后,它才会在某个时候被物理删除。

这与删除的常规文件相同,它们的目录信息被删除,但文件的内容仅在最后一个进程关闭后才会消失。这有时会导致日志文件在文件系统上占用越来越多的空间,即使它们被删除,因为进程仍在写入它们,这是文件指针之间“分离”的结果(零个或多个目录条目指向到 inode)和文件内容(inode 本身)。

您可以从您的 ipcs 中看到输出 4 个中的 3 个仍然有附加进程,因此在这些进程与共享内存块分离之前,它们不会去任何地方。另一个可能正在等待一些“扫描”功能来清理它,但这当然取决于共享内存的实现。

编写良好的共享内存客户端(或相关的日志文件)应定期重新附加(或翻转)以确保这种情况是暂时的并且不会影响软件的操作。

关于shared-memory - 在 Linux 中使用 ipcrm 删除共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/398886/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com