如果“它们将被内核视为共享(SHR)”,为什么#3中的“程序映像和共享库”“被视为进程私有”?
“程序映像和共享库”在什么“私有”意义上“被视为进程私有”? “程序映像和共享库”是只读的吗?
在什么“共享”意义上,“程序映像和共享库”“被内核视为共享(SHR)”?
“交换文件仅包括 #1 到 #3。象限 #4 中的内存在修改后,将充当其自己的专用交换文件。” “程序映像和共享库”也充当它们自己的专用交换文件吗?
谢谢。
对于每个这样的进程,每个内存页都被限制在下表中的一个象限内。物理内存和虚拟
内存都可以包括这四种内存中的任何一种,而交换文件仅包括#1 到#3。象限 #4 中的内存在修改后将充当其自己的专用交换文件。Private | Shared 1 | 2 Anonymous . stack | . malloc() | . brk()/sbrk() | . POSIX shm* . mmap(PRIVATE, ANON) | . mmap(SHARED, ANON) -----------------------+---------------------- . mmap(PRIVATE, fd) | . mmap(SHARED, fd) File-backed . pgms/shared libs | 3 | 4
以下内容可能有助于解释显示为可扩展列的进程级内存值,并在主题“3a.字段描述”下讨论。
SHR - subset of RES (excludes 1, includes all 2 & 4, some 3)
笔记:尽管程序映像和共享库被视为进程私有,但它们仍将被内核视为共享 (SHR)。
答案1
该图从运行进程的角度区分了私有和共享。左侧表示的页面对于每个进程都是私有的,即使它们可以被内核共享(IE映射到内存或后备存储中的相同物理位置)。右侧表示的页面由潜在的多个进程共享,并且没有严格的隐私期望。
因此,程序映像和共享库是私有的,因为在内存中对它们所做的任何更改仅对进行更改的进程可见。从可执行文件和库映射的大多数页面确实是不可写的,但并非必须如此。
从内核的角度来看,它们是同时共享的,因为它们映射到共享的物理区域。 (使用写时复制,以便在必要时可以取消共享。)共享是内核级细节,对进程来说是不可见的。
交换是脏页的后备存储,IE自加载以来已更改的内存。非脏页不需要交换:它们的来源(通常是内存映射文件)是它们的后备存储,当内存压力要求将它们从物理内存中删除时,可以简单地丢弃它们。如果要从物理内存中删除脏页、非共享页,则需要某种后备存储。在大多数情况下,这是交换;但是文件支持的共享内存还有另一个自然的后备存储,即支持它的文件。需要从物理内存中删除的文件支持共享内存页面可以写入支持文件并丢弃,而不涉及交换。