虚拟内存是什么?
逻辑地址(Logical Address)是指由程序产生的与段相关的偏移地址部分。例如,你在进行 C 语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前线程数据段的地址,与绝对物理地址无关。应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。
线程地址(Linear Address)是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址,或者说段中的偏移地址,加上相应段的基地址就生成了一个线性地址。若没有启用分页机制,那么线性地址直接就是物理地址。
物理地址(Physical Address)是指出现在 CPU 外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么线性地址就直接成为物理地址了。
虚拟内存(Vritual Memory)是指计算机呈现出要比实际拥有的内存大得多的内存量。因此它允许程序员编制并运行比实际系统拥有的内存大得多的程序。这使得许多大型项目也能够具有有限内存资源的系统上实现。
虚拟地址到物理地址的转化方法是与体系结构相关的。一般来说有分段、分页两种方式。以现在的 x86CPU 为例,分段和分页都是支持的。Memory Mangement Unit(MMU)负责从虚拟地址到物理地址的转化。逻辑地址是段标识+段内偏移的形式。MMU 通过查询段表,可以把逻辑地址转化为线性地址。如果 CPU 没有开启分页功能,那么线性地址就是物理地址;如果 CPU 开启了分页功能,MMU 还需要查询页表来将线性地址转化为物理地址,具体过程如下。
逻辑地址→(段表)→线性地址→(页表)→物理地址
不同的逻辑地址可以映射到同一个线性地址上;不同的线性地址也可以映射到同一个物理地址上;所以它们之间是多对一的关系。另外,同一个线性地址,在发生换页以后,也可能被重新装载到另一个物理地址上。所以这种多对一的映射关系也会随着时间发生变化。
在进程运行过程中,如果它访问的页面不在内存而需要将他们调入内存,但内存没有空闲空间时,就从内存中调用一页程序或者数据放到磁盘的对换区中。应该调用哪个根据换算页算法决定。页面的更换频率越低越好。
FIFO,最直观性能最差,总是淘汰最先进入的内存的页面(选择在内存中驻留时间最久的页面予以淘汰)。
LRU,最近最久未使用,给每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当淘汰一个页面时,选择现有页面中其 t 值最大的予以淘汰。其页面访问图与 LFU 最少使用完全相同。
OPT,最佳置换,性能最好,所选择的被淘汰页,在以后永不使用,或许在最长(未来--往后看)时间内不再被访问。
搜索微信公众号:TestingStudio 霍格沃兹的干货都很硬核
评论