操作系统导论——第21章 超越物理内存:机制

        到目前为止,一直假定地址空间非常小,能放入物理内存。事实上,假设每个正在运行的进程的地址空间都能放入内存。再放松这些假设,并假设需要支持许多同时运行的巨大地址空间

        为了达到目的,需要在内存层级再加上一层。目前为止,一直假设所有页都常驻在物理内存。但是,为了支持更大的地址空间,操作系统需要把当前没有在用的那部分地址空间找个地方存储起来。这个地方的特点:比内存有更大的容量。因此,一般来说也更慢。在现代系统中,硬盘(hard disk drive)通常能够满足这个需求。因此,在存储层级结构中,大而慢的硬盘位于底层,内存之上

                                                关键问题:如何超越物理内存

        操作系统如何利用大而慢的设备,透明地提供巨大虚拟地址空间的假象?

        为什么要为进程支持巨大的地址空间?方便和易用性。有了巨大的地址空间,不必担心程序的数据结构是否有足够空间存储,只需自然地编写程序,根据需要分配内存。这是操作系统提供的一个强大的假象。一个反面例子是,一些早期系统使用“ 内存覆盖(memory overlays)”,它需 要程序员根据需要手动移入或移出内存中的代码或数据。

        不仅是一个进程,增加交换空间让操作系统为多个并发运行的进程都提供巨大地址空间的假象。多道程序(能够“同时”运行多个程序,更好地利用机器资源)的出现,强烈要求能够换出一些页,因为早期的机器显然不能将所有进程需要的所有页同时放在内存中。 因此,多道程序和易用性都需要操作系统支持比物理内存更大的地址空间

 一、交换空间

        在硬盘开辟一部分空间用于物理页的移入和移出。在操作系统中,这样的空间称为交换空间,将内存的页交换到其中,并在需要的时候又交换回去。假设操作系统能够以页大小为单元读取或者写入交换空间。为了达到这个目的,操作系统需要记住给定页的硬盘地址。

        交换空间的大小是非常重要的,它决定了系统在某一时刻能够使用的最大内存页数。简单起见,现在假设它非常大。

         在小例子中(见图21.1),有一个 4 页的物理内存和一个 8 页的交换空间。在这个例子中,3个进程(进程0、进程1和进程2)主动共享物理内存。但这三个进程都只有一部分有效页在内存中,剩下的在硬盘的交换空间中。第4个进程(进程3)的所有页都被交换到硬盘上,因此它目前没有运行。有一块交换空间是空闲的。使用交换空间如何让系统假装内存比实际物理内存更大。

        交换空间不是唯一的硬盘交换目的地。例如,假设运行一个二进制程序(如 ls,或者你自己编译的 main 程序)。这个二进制程序的代码页最开始是在硬盘上,但程序运行的时候,它们被加载到内存中(要么在程序开始运行时全部加载,要么在现代操作系统中,按需要一页一页加载)。但是,如果系统需要在物理内存中腾出空间以满足其他需求,则可以安全地重新使用这些代码页的内存空间,因为稍后它又可以重新从硬盘上的二进制文件加载。

二、存在位

         现在硬盘上有一些空间,需要在系统中增加一些高级机制,来支持从硬盘交换页。简单起见,假设有一个硬件管理 TLB 的系统。

         内存引用发生:正在运行的进程生成虚拟内存引用(用于获取指令或访问数据),在这种情况下,硬件将其转换为物理地址,再从内存中获取所需数据

         ① 硬件首先从虚拟地址获得 VPN,检查 TLB 是否匹配(TLB命中),如果命中,则获得最终的物理地址并从内存中取回。这很快(不需要额外的内存访问)。

         ② 如果在 TLB 中找不到 VPN(即TLB未命中),则硬件在内存中查找页表(使用页表基址寄存器),并使用VPN查找该页的页表项(PTE)作为索引。如果页有效且存在于物理内存中,则硬件从PTE中获得PFN,将其插入TLB,并重试该指令,产生TLB命中。

         但是,如果允许页交换到硬盘,必须添加更多的机制。具体来说,当硬件在 PTE 中查找时,可能发现页不在物理内存中。硬件(或操作系统,在软件管理 TLB 时)判断是否在内存中的方法,是通过页表项中的一条新信息,即存在位(present bit)。如果存在位设置为1,则表示该页存在于物理内存中,并且所有内容都如上所述进行。如果存在位设置为零,则页不在内存中,而在硬盘上。访问不在物理内存中的页,这种行为通常被称为页错误(page fault)。

         在页错误时,操作系统被唤起来处理页错误。一段称为“页错误处理程序(page-fault handler)”的代码会执行,来处理页错误。

三、页错误

        在 TLB 未命中的情况下,有两种类型的系统:硬件管理的TLB硬件在页表中找到需要的转换映射)和软件管理的TLB操作系统执行查找过程)。不论在哪种系统中,如果页不存在,都由操作系统负责处理页错误。操作系统的页错误处理程序 (page-fault handler)确定要做什么。几乎所有的系统都在软件中处理页错误。即使是硬件管理的TLB,硬件也信任操作系统来管理这个重要的任务。

         如果一个页不存在,它已被交换到硬盘,在处理页错误的时候,操作系统需要将该页交换到内存中。那么,问题:操作系统如何知道所需的页在哪?在许多系统中,页表是存储这些信息最自然的地方。因此,操作系统可以用 PTE 中的某些位来存储硬盘地址,这些位通常用来存储像页的PFN 这样的数据。当操作系统接收到页错误时,它会在PTE中查找地址,并将请求发送到硬盘,将页读取到内存中。

        硬盘 I/O 完成时,操作系统会更新页表,将此页标记为存在,更新页表项(PTE)的 PFN 字段以记录新获取页的内存位置,并重试指令。下一次重新访问 TLB 还是未命中,然而这次因为页在内存中,因此会将页表中的地址更新到 TLB 中(也可以在处理页错误时更新 TLB 以避免此步骤)。最后的重试操作会在 TLB 中找到转换映射,从已转换的内存物理地址,获取所需的数据或指令。(硬盘--->内存----->TLB)

        请注意,当 I/O 在运行时,进程将处于阻塞(blocked)状态。因此,当页错误正常处理时,操作系统可以自由地运行其他可执行的进程。因为 I/O 操作是昂贵的,一个进程进行 I/O(页错误)时会执行另一个进程,这种交叠(overlap)是多道程序系统充分利用硬件的一种方式。

四、内存满了怎么办

        上述假设有足够的空闲内存来从存储交换空间换入(page in)的页。当然,情况可能并非如此。内存可能已满(或接近满了)。因此,操作系统希望先交换出(page out)一个或多个页,以便为操作系统即将交换入的新页留出空间选择哪些页被交换出或被替换(replace)的过程,被称为页交换策略(page-replacement policy)。

五、页错误处理流程

        “当程序从内存中读取数据会发生什么?”,应该对所有不同的可能性有了很好的概念。有关详细信息,请参见 图21.2 和 图21.3 中的控制流。图21.2 展示了硬件在地址转换过程中所做的工作,图21.3展示了操作系统在页错误时所做的工作

 

        从图 21.2 的硬件控制流图中,可以注意到当 TLB 未命中发生的时候有3种重要情景。 第一种情况,该页存在(present)且有效(valid)(第18~21行)。在这种情况下,TLB 未命中处理程序可以简单地从 PTE 中获取 PFN,然后重试指令(这次TLB会命中),并因此继续前面描述的流程。第二种情况(第 22~23 行),页不存在页错误处理程序需要运行。虽然是进程可以访问的合法页(毕竟是有效的),但它并不在物理内存中。第三种情况,访问的是一个无效页,可能由于程序中的错误(第13~14 行)。在这种情况下,PTE 中的其他位都不重要了。硬件捕获这个非法访问,操作系统陷阱处理程序运行,可能会杀死非法进程

         

        从图 21.3 的软件控制流中,处理页错误,操作系统做了什么。首先,操作系统必须为将要换入的页找到一个物理帧,如果没有这样的物理帧,我们将不得不等待交换算法运行,并从内存中踢出一些页,释放帧供这里使用。在获得物理帧后,处理程序发出 I/O 请求从交换空间读取页。最后,当这个慢操作完成时,操作系统更新页表并重试指令重试将导致TLB未命中,然后再一次重试时,TLB命中,此时硬件将能够访问所需的值

 六、交换何时发生

        为了保证有少量的空闲内存,操作系统会设置高水位线(High Watermark,HW)和低水位线(Low Watermark,LW),来帮助决定何时从内存中清除页。原理是这样:当操作系统发现有少于 LW 个页可用时,后台负责释放内存的线程会开始运行直到有 HW 个可用的物理页。这个后台线程有时称为交换守护进程(swap daemon)或页守护进程(page daemon),它然后会进入休眠状态。

         通过同时执行多个交换过程,可以进行一些性能优化。例如,许多系统会把多个要写入的页聚集(cluster)或分组(group)同时写入到交换区间,从而提高硬盘的效率。 稍后在讨论硬盘时将会看到,这种合并操作减少了硬盘的寻道和旋转开销,从而显著提高了性能。

         为了配合后台的分页线程,图21.3 中的控制流需要稍作修改。交换算法需要先简单检查是否有空闲页,而不是直接执行替换。如果没有空闲页,会通知后台分页线程按需要释放页。当线程释放一定数目的页时,它会重新唤醒原来的线程,然后就可以把需要的页交换进内存,继续它的工作

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值