linux虚拟内存附加/分离信号

Posted

技术标签:

【中文标题】linux虚拟内存附加/分离信号【英文标题】:linux virtual memory attach/detach signal 【发布时间】:2020-07-04 04:52:21 【问题描述】:

问:当当前进程中映射的一页虚拟内存的系统范围的虚拟内存映射数量发生变化时,是否可以从内核接收通知?

该用例用于共享内存 IPC 通道。我现在有一个问题,如果其中一个对等方崩溃并死亡,另一个对等方永远不会发现并挂起。

在与管道类似的情况下,如果另一端已经消失(因为它的所有文件描述符都将关闭),对等方将读取管道上的文件结尾,或者在写入管道时接收 SIGPIPE。

【问题讨论】:

你能在你的问题中提供一些minimal reproducible example吗?我不明白用例。您是在编写内核驱动程序,还是只是一些 Linux 用户级应用程序? 【参考方案1】:

当当前进程中映射的一页虚拟内存的系统范围的虚拟内存映射数量发生变化时,是否可以从内核接收通知?

一般来说很难或不可能,但最近的 Linux 内核添加了userfaultfd(2) 系统调用。我从未使用过它,甚至无法命名使用它的程序。也许systemd 确实使用了它。

该用例用于共享内存 IPC 通道。我现在有一个问题,如果其中一个同行崩溃并死亡

我建议使用一些其他进程间通信(在共享内存的添加中)用于同步目的。我想到的不仅是shm_overview(7),还有sem_overview(7)、unix(7)、fifo(7)、pthreads(7)。如果您使用管道或套接字进行进程间通信,则另一个会收到通知。您可能可以在两个进程之间设置一个套接字,当对等进程死亡时,另一个会注意到。

AFAIK,您将无法在/proc//sys/ 下的文件描述符上使用inotify(7) 工具(请参阅proc(5))。但是如果mmap(2) 用于真实 磁盘文件,inotify 就变得相关了。

如果您的问题是关于内核与进程通信的问题,请考虑netlink(7),另请参阅signal(7) 和signalfd(2)。

我会建议一些多线程的方法。阅读一些好的pthreads tutorial。

您可以考虑使用ptrace(2)。这棘手的。

【讨论】:

以上是关于linux虚拟内存附加/分离信号的主要内容,如果未能解决你的问题,请参考以下文章

再探进程间通信

再探进程间通信

Hyper-V 怎样拷贝文件至虚拟硬盘并附加到虚拟机上

linux 的虚拟内存是啥?怎么用?我可以把虚拟内存当内存用吗?

Linux下怎样增加虚拟内存

linux中物理内存和虚拟内存