小土刀

【计算机系统导论】6.3 内存与虚拟内存

虚拟内存的机制和动态内存分配的算法,虚拟内存(抽象3)也是一种抽象。
以五种抽象作为展开的脉络


  • 虚拟内存(分页、调页、工作集模型、页大小和碎片、分段)
  • 存储器管理(交换、分区、分页、虚拟存储器、快表、分段)
  • 虚拟存储器详细介绍(页的存放和查找、缺页、写、TLB,处理 TLB 缺失与缺页)
  • Pentium 存储器管理(地址空间、分段、分页)
  • ARM 存储器管理(存储器系统组织、虚拟存储器地址转换、存储器管理格式、存取控制)

虚拟内存

虚拟内存是一个内存抽象,假装有一大片的连续内存(通常远大于实际的物理内存)

尽管虚拟存储器能使一个小容量的存储器看起来像大容量的存储器,但磁盘和主存之间的性能差异意味着,如果一个程序经常访问比它拥有的物理存储器多的虚拟存储器,程序运行速度就会很慢。这样的程序会不断地在主存和磁盘之间交换页面,称为抖动 thrashing。抖动的发生将会是灾难,但很少见。如果你的程序产生抖动,那么最简单的解决方式就是在一个有着更大主存的计算机上运行,或者为你的计算机增加主存。一个复杂的办法是重新检查所使用的算法和数据结构,看看能否改变它的局部性,从而减少程序程序同时使用的页数。这一组页通常被称为工作集 working set

为了使操作系统能保护虚拟存储系统,硬件至少提供下面三种基本能力:1)支持至少两种模式,并指出当前运行的进程是用户进程还是操作系统进程,操作系统进程也称为超级用户管理进程、核心进程或主管进程。2)提供一部分处理器的状态,这部分内容是用户进程可读而不可写的。这包括指示处理器是处于用户态还是管理态的用户/管理模式位、页表指针以及 TLB。操作系统用只能在管理态下可用的特殊指令对它们操作。3)提供能让处理器在用户态和管理态下相互切换的机制。从用户态到管理态的转换通常是由系统调用异常处理完成的,它用特殊指令将控制权传到管理代码空间的指定位置。和其他异常处理一样,系统调用处的程序计数器中的值被保存在异常程序计数器中(EPC),处理器被置于管理态。从异常中返回至用户模式,使用异常返回 return from exception 指令,将重置用户模式,并且跳转到 EPC 中的地址处。

角色 1:缓存

角色 2:内存管理

角色 3:内存保护

内存分页

内存分页的实现

在虚拟存储系统中,写回机制有另一个主要的优点。因为相对磁盘访问时间,其传输时间要少得多,因此,把整页复制会磁盘比把单个字写回要高效得多。尽管写回操作比传输单个字更高效,但是开销很大。因此,当某一页被替换时,我们希望知道该页是否需要被复制写回。为了追踪读入主存中的页是否被写过,可以在页表中增加一个重写位 dirty bit。当页中任何字被写时就将这一位置位。如果操作系统选择替换某一页,重写位指明了在把该页所占用的主存让给另一页之前,是否需要将该页写回磁盘。因此,一个修改过的页也通常被称为脏页 dirty page

页置换策略

调度

要完全准确地执行 LRU 算法的代价太高了,因为每次存储器访问时都需要更新数据结构。作为替代,大多数操作系统通过追踪哪些页最近被使用,哪些页最近没有用到来近似地实现 LRU 算法。为了帮助操作系统估算最近最少使用的页,一些计算机提供了一个引用位或者称为使用位,当一页被访问时该位被置位。操作系统定期将引用位清零,然后再重新记录,这样就可以判定在这段时间内哪些页被访问过。有了这些使用信息,操作系统就可以从那些最近最少访问的页中选择一页(通过检查其引用位是否关闭)。如果硬件没有提供这一位,操作系统就要通过其他的方法来估计哪些页被访问过。

页大小和碎片

地址翻译

采用虚拟内存的系统中,DMA 是应该采用虚拟地址还是物理地址?采用虚拟地址最明显的问题是 DMA 部件需要将虚拟地址转换成物理地址。使用物理地址在 DMA 传输中的主要问题是传输不容易跨越一个存储页的边界。一个 I/O 请求如果跨越了存储页的边界,它传输的内存位置在虚拟内存中就不一定连续。因此,如果使用物理地址,DMA 传输必须被限制在一个页面之内。使 DMA 工作在虚拟地址上的一种方法是允许系统能启动跨越边界的 DMA 传输。在这样一个系统中,DMA 部件有少量的映射项用于保存传输中的虚拟地址到物理地址的映射。当 I/O 启动时,由操作系统来提供这些映射。使用这种映射,DMA 部件不需要关注被传输的虚拟页面的位置。另外一种方法是将 DMA 传输切断为由操作系统执行的一系列的传输,它们中的每一个操作都限制在单一的物理页面中,最后将这些传输链接起来,交给 I/O 处理器活着只能 DMA 部件处理,由它们执行整个序列的传输;或者由操作系统逐一请求这些传输。无论采用以上提及的哪一种方法,当包含某个页面的 DMA 传输正在进行时,操作系统都不能对该页进行重映射。

页表

TLB

TLB 具体实例

动态内存分配

malloc 的实现

性能指标

垃圾回收

垃圾收集是一种管理程序使用的内存区域的方法。使用具有垃圾收集功能的编程语言或处理程序的话,程序中不需要编写内存管理的代码,也就是说不用编写代码来释放使用过的内存区域。

垃圾回收的性能可以由以下两个指标来测定:吞吐量和暂停时间

吞吐量(throughput)是垃圾回收在程序全部执行时间中所占的比例,该比例越小越好。

暂停时间(pause time)是一次垃圾回收所中断的时间。暂停时间过长的话,程序反应就会变慢。

常见垃圾回收方法:引用计数、标记和扫除、标记和紧缩、复制方式、分代垃圾收集、保守垃圾收集、增量垃圾收集、并行垃圾收集、位图标志,这些技术的组合也是有可能的

内存陷阱

捧个钱场?

热评文章