两个进程之间的代码段共享

3
假设我们依次运行两个进程,例如:-
$ grep abc abc.txt ==> pid 100
$ grep def def.txt ==> pid 101

我在《Linux编程入门》第11章中读到,进程的代码段将被共享,因为它是只读的。真的吗?我认为如果grep只被编译成共享库,那么代码段才会被共享。
还有一个问题,在使用共享库时,操作系统如何知道该库是否已被加载?假设有2个进程同时调用共享库函数,那么两个进程的虚拟地址如何转换为指向RAM中相同位置的物理地址?
2个回答

5

操作系统不再加载文件到内存中,而是进行内存映射。这意味着磁盘上的文件inode和偏移量将与内存中的一个页面相关联。这使得查找文件的某个部分是否已经被加载变得非常简单。此外,您可以仅将文件的一部分保留在RAM中(设置后,您不再需要设置代码,因此可以“忘记”它并将那些页面用于更有用的事情)。


3

这些库和可执行文件并没有被加载,而是通过mmap(2)映射到内存中。简单来说,当你使用MAP_SHARED标志映射某个东西时,其他也映射同一文件的人将会得到相同的内存页。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接