我读了一本关于分页(内存管理方案)的书。
据我了解,每个虚拟内存都转换为物理内存。
但我不明白两个非常基本的事情:
如果我们有进程 A 和进程 B,我们如何确定它不会将它们的线性地址转换为相同的物理地址?
我们如何确定现在在物理内存中的页面不属于两个进程?
我读了一本关于分页(内存管理方案)的书。
据我了解,每个虚拟内存都转换为物理内存。
但我不明白两个非常基本的事情:
如果我们有进程 A 和进程 B,我们如何确定它不会将它们的线性地址转换为相同的物理地址?
我们如何确定现在在物理内存中的页面不属于两个进程?
当一个进程想要访问一个地址时,它正在使用一个虚拟地址。该地址由处理器转换为物理地址。这样做的方法是使用页表。每个进程都有一个关联的页表,将其虚拟地址转换为物理地址。由于每个进程都有不同的页表,操作系统可以强制来自不同进程的两个虚拟地址(即使可能相等)不会映射到相同的物理地址。
此外,大多数当前的处理器都包含一个名为Translation Lookaside Buffer (TLB)的结构。该结构是前面提到的页表的缓存。访问页表是一项代价高昂的操作,而 TLB 使该操作更快。
关于问题 1 和 2,有时需要将多个虚拟地址映射到同一个物理页面,尤其是对于代码段。例如,一个共享库可能被许多独立的进程使用。操作系统可以只加载一次库并将相同的物理页面映射到每个进程的虚拟地址空间,而不是同一库的冗余副本占用 RAM。对于读/写数据页,一些进程间通信方法使用共享物理内存。