Linux内核如何在不同进程之间实现共享内存机制?
进一步来说,每个进程都有自己的地址空间。例如,对于进程A中的地址0x1000和进程B中的地址0x1000而言,它们所代表的位置是不同的。
那么,内核如何确保一个内存块可以在具有不同地址空间的不同进程之间共享呢?
谢谢。
进一步来说,每个进程都有自己的地址空间。例如,对于进程A中的地址0x1000和进程B中的地址0x1000而言,它们所代表的位置是不同的。
那么,内核如何确保一个内存块可以在具有不同地址空间的不同进程之间共享呢?
谢谢。
进程间通信机制
进程之间以及与内核进行通信以协调它们的活动。Linux支持多种进程间通信(IPC)机制。其中信号和管道是其中两种,但Linux还支持System V IPC机制,这些机制是以它们首次出现的Unix TM版本命名的。
信号
信号是Unix TM系统使用的最古老的进程间通信方法之一。它们用于向一个或多个进程发出异步事件信号。信号可以由键盘中断或错误条件(例如进程尝试访问其虚拟内存中不存在的位置)生成。Shell也使用信号向其子进程发送作业控制命令。内核可以生成一组定义好的信号,或者其他进程在系统中生成它们,前提是它们具有正确的权限。您可以使用kill命令(kill -l)列出系统的信号集。
管道
常见的Linux shell都允许重定向。例如:
将ls命令列出目录文件的输出管道传输到分页pr命令的标准输入,最后将pr命令的标准输出管道传输到打印机lpr命令的标准输入,以在默认打印机上打印结果。管道是单向字节流,将一个进程的标准输出连接到另一个进程的标准输入。两个进程都不知道这种重定向,并像平常一样运行。这是shell在进程之间设置这些临时管道。 在Linux中,管道使用两个文件数据结构实现,它们都指向同一个临时VFS inode,该inode本身指向内存中的物理页面。如图所示,每个文件数据结构都包含指向不同文件操作例程向量的指针;一个用于向管道写入,另一个用于从管道读取。 套接字$ ls | pr | lpr
摘自 tldp.org。
如果A和B是父进程和子进程,它们各自使用自己的pte来访问共享内存。共享内存由fork机制共享。所以一切都很好,对吧?(更多细节,请查看内核函数copy_one_pte()及相关函数。)
如果A和B不是父子关系,它们使用公共密钥来访问共享内存。