虚拟内存漫游
虚拟内存的意义?
为了更加有效地管理内存并且少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟内存(VM)。
虚拟内存的重要能力有哪些?
虚拟内存提供了三个重要的能力:
- 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。
- 它为每个进程提供了一致的地址空间,从而简化了内存管理。
- 它保护了每个进程的地址空间不被其他进程破坏。
主存是磁盘上的地址空间的高速缓存。
也就是说,比如我们程序内的一些数据,malloc出来的空间,都是磁盘空间,当cpu调动这些资源时,会把这些资源先放在内存中,以便高效处理数据。注意“高速缓存”四字的意义。
cpu怎么访问主存的?
CPU通过生成一个虚拟地址(Virtual Address,VA)来访问主存,这个虚拟地址在被送到内存之前先转换成适当的物理地址。将一个虚拟地址转换为物理地址的任务叫做地址翻译( address translation)。
内存管理单元:动态翻译虚拟地址
就像异常处理一样,地址翻译需要CPU硬件和操作系统之间的紧密合作。CPU芯片上叫做内存管理单元(Memory Management Unit,MMU)的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容由操作系统管理。
虚拟地址空间:
一个32位操作系统的虚拟地址空间为2^32次方。
虚拟内存作为缓存的工具
概念上而言,虚拟内存被组织为一个由存放在磁盘上的N个连续的字节大小的单元
组成的数组。
磁盘(低层)被分隔成块,这些块作为是内存(高层)和磁盘之间的传输单元。
简单名词的概念:
虚拟页VP:虚拟内存的分割页
物理页:页帧,物理内存的分割页。
虚拟页的状态:
1):未分配的:还未分配的页。
2):缓存的:当前已缓存在物理内存中的已分配页。
3):未缓存的:未缓存在物理内存中的已分配页。
如何判定虚拟页是否缓存在DRAM的某个地方
页表:将虚拟页映射到物理页。
页表就是PTE组成的数组,PTE简单理解为由有效位和地址字段构成。
页命中和缺页:
页命中:
考虑一下当CPU想要读包含在VP2中的虚拟内存的一个字时会发生什么?VP2被缓存在DRAM中。使用我们将在9.6节中详细描述的一种技术,地址翻译硬件将虚拟地址作为一个索引来定位PTE2,并从内存中读取它。因为设置了有效位,那么地址翻译硬件就知道VP2是缓存在内存中的了。所以它使用PTE中的物理内存地址(该地址指向PP1中缓存页的起始位置),构造出这个字的物理地址。
CPU想要读虚拟内存时,通过页表,将虚拟地址作为索引找到对应的PTE(页表条目),通过PTE找到对应的物理地址。
缺页:DRAM缓存不命中:
在虚拟内存的习惯说法中,DRAM缓存不命中称为缺页( page fault)。下图展示了在缺页之前我们的示例页表的状态。CPU引用了VP 3中的一个字,VP 3并未缓存在DRAM中。地址翻译硬件从内存中读取PTE3,从有效位推断出VP3未被缓存,并且触发一个缺页异常。缺页异常调用内核中的缺页异常处理程序,该程序会选择一个牺牲页,在此例中就是存放在PP3中的 VP4。如果VP4已经被修改了,那么内核就会将它复制回磁盘。无论哪种情况,内核都会修改VP4的页表条目,反映出VP4不再缓存在主存中这一事实。
接下来,内核从磁盘复制VP3到内存中的PP 3,更新PTE3,随后返回。当异常处理程序返回时,它会重新启动导致缺页的指令,该指令会把导致缺页的虚拟地址重发送到地址翻译硬件。但是现在,VP 3已经缓存在主存中了,那么页命中也能由地址翻译硬件正常处理了。图9-7展示了在缺页之后我们的示例页表的状态。
malloc :分配页面时:
此时虚拟页被创建,并更新PTE(pte5),使其指向新创建的页面。
良好的局部性让我们的程序不会像爬一样
时间局部性在一个具有良好时间局部性的程序中,被引用过一次的内存位置很可能在不远的将来再被多次引用。
空间局部性:在一个具有良好空间局部性的程序中,如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用附近的一个内存位置。
.尽管在整个运行过程中程序引用的不同页面的总数可能超出物理内存总的大小,但是局部性原则保证了在任意时刻,程序将趋向于在一个较小的活动页面(active page)集合上工作,这个集合叫做工作集(working set)或者常驻集合(resident set)。在初始开销,也就是将工作集页面调度到内存中之后,接下来对这个工作集的引用将导致命中,而不会产生额外的磁盘流量。
只要我们的程序有好的时间局部性,虚拟内存系统就能工作得相当好。但是,当然不是所有的程序都能展现良好的时间局部性。如果工作集的大小超出了物理内存的大小,那么程序将产生一种不幸的状态,叫做抖动(thrashing),这时页面将不断地换进换出。虽然虚拟内存通常是有效的,但是如果一个程序性能慢得像爬一样,那么聪明的程序员会考虑是不是发生了抖动。
虚拟内存作为内存管理的工具
重点:VM为进程提供独立的地址空间。操作系统为系统中的每个进程都维护一个独立的页表。!!!!
1.简化连接
2.简化加载
3.简化共享
独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制。一般而言,每个进程都有自己私有的代码、数据、堆以及栈区域,是不和其他进程共享的。在这种情况中,操作系统创建页表,将相应的虚拟页映射到不连续的物理页面。
然而,在一些情况中,还是需要进程来共享代码和数据。例如,每个进程必须调用相同的操作系统内核代码,而每个C程序都会调用C标准库中的程序,比如printf。操作系统通过将不同进程中适当的虚拟页面映射到相同的物理页面,从而安排多个进程共享这部分代码的一个副本,而不是在每个进程中都包括单独的内核和C标准库的副本,如下图所示。
4.简化内存分配
不用分配连续的物理空间,页面分散在物理内存中。
虚拟内存作为内存保护的工具
在PTE上添加一些额外的许可控制来控制对一个虚拟页的内容 的访问。