第五章
主要内容:虚拟内存管理技术
为什么要用虚拟内存
-
使用硬盘/磁盘使更多的程序在有限的内存中运行
-
理想的存储器,更快更大更便宜和非易失性的存储区
发展历史
覆盖技术
如果程序太大,超出了内存的容量,可以采用手动的覆盖技术,把需要的指令和数据保存在内存中,将暂时不要使用的数据放到磁盘中
目的:在较小的可用内存中运行较大的程序,常用于多道程序设计,与分区存储管理配合使用
原理
:把程序按照自身逻辑结构,划分成若干个功能上相互独立的程序模块,那些不会同时执行的模块共享一块内存区域,按时间先后来运行
-
必要部分的代码和数据常驻内存
-
可选部分在其他程序模块中实现,平时存放在外存中,在需要到的时候装入内存
缺点
:
-
需要程序员把一个程序划分成若干个小功能模块,并确定各个模块之间的覆盖关系,费时费力,增加编程难度
-
覆盖模块从外存装入内存,时间换空间
交换技术
如果程序太多,超过了内存的容量,可以采用自动的交换技术,把暂时不能执行程序放到外存中
目的:多道程序在内存中,让正在运行的程序或需要运行的程序获得程序执行所需要的内存资源
原理
:可将暂时不能运行的程序送到外存, 从而获得空闲内存空间. 操作系统把一个进程的整个地址空间的内容保存到外存中(换出 swap out), 而将外存中的某个进程的地址空间读入到内存中(换入 swap in). 换入换出内容的大小为整个程序的地址空间.
问题
:
-
交换时机的确定:何时发生交换?只当内存空间不够或者有不够的危险时换出
-
交换区的大小:必须足够大以存放所有用户进程的所有内存映像的拷贝,必须能够对这些内存映像进行直接存取
-
程序换入的重定位,最好采用动态地址映射的方法
覆盖技术和交换技术的对比
特点
:
-
覆盖只能发生在那些相互之间没有调用关系的程序模块之间, 因此程序员必须给出程序内的各个模块之间的逻辑覆盖结构.
-
交换技术是以在内存中的程序大小为单位进行的, 它不需要程序员给出各个模块之间的逻辑覆盖结构.
-
换言之, 交换发生在内存中程序与管理程序或操作系统之间, 而覆盖则发生在运行程序的内部.
在内存不够用的情形下, 可以采用覆盖技术和交换技术, 但是 :
-
覆盖技术 : 需要程序要自己把整个程序划分为若干个小的功能模块, 并确定各个模块之间的覆盖关系, 增加了程序员的负担.
-
交换技术 : 以进程作为交换的单位, 需要把进程的整个地址空间都换入换出, 增加了处理器的开销.
虚拟内存管理技术
如果想要在有限的容量的内存中,以更小的页粒度为单位装入更多更大的程序,可以采用自动的虚拟存储技术
-
目标:
像覆盖技术那样, 不是把程序的所有内容都放在内存中, 因而能够运行比当前的空闲内存空间还要大的程序. 但做的更好, 由操作系统自动来完成, 无需程序员的干涉.
像交换技术那样, 能够实现进程在内存与外存之间的交换, 因而获得更多的空闲内存空间. 但做的更好, 只对进程的部分内容在内存和外存之间进行交换.
-
程序局部性原理(虚拟内存能够实现的核心)
程序的局部性原理(principle of locality) : 指程序在执行过程中的一个较短时期, 所执行的指令地址和指令的操作数地址, 分别局限于一定的区域.
-
时间局部性
:一条指令的一次执行和下次执行, 一个数据的一次访问和下次访问都集中在一个较短时期内 -
空间局部性
:当前指令和邻近的几条指令, 当前访问的数据和邻近的几个数据都集中在一个较小区域内
-
-
基本概念
可以在页式或段式内存管理的基础上实现
-
在装入程序时, 不必将其全部装入内存, 而只需将当前需要执行的部分页面或段装入到内存中, 就可以让程序开始执行;
-
在程序执行过程中, 如果需执行的指令或访问的数据尚未在内存中(称为缺页或缺段), 则由处理器通知操作系统将相应的页面或段调入到内存, 然后继续执行程序;
-
另一方面, 操作系统将内存中暂时不使用的页面或段调出保存在外存上, 从而腾出更多空闲内存空间存放将要装入的程序以及将要调入的页面或段.
-
-
基本特征
-
大的用户空间 : 通过把物理内存和外存相结合, 提供给用户的虚拟内存空间通常大于实际的物理内存, 即实现了这两者的分离. 如32位的虚拟地址理论上可以访问4GB, 而可能计算机上仅有256M的物理内存, 但硬盘容量大于4GB.
-
部分交换 : 与交换技术相比较, 虚拟存储的调入和调出是对部分虚拟地址空间进行的;
-
不连续性 : 物理内存分配的不连续性, 虚拟地址空间使用的不连续性.
-
-
虚拟页式内存管理
-
大部分虚拟存储系统都采用虚拟页式存储管理技术,即在页式存储管理的基础上,怎加请求调页和页面置换功能
-
基本思路
-
当一个用户程序要调入内存运行时, 不是将该程序的所有页面都装入内存, 而是只装入部分的页面, 就可启动程序运行.
-
在运行的过程中, 如果发现要运行的程序或要访问的数据不再内存, 则向系统发出缺页的中断请求, 系统在处理这个中断时, 将外存中相应的页面调入内存, 使得该程序能够继续运行.
-
-
页表表项
-
逻辑页号 | 访问位 | 修改位 | 保护位 | 驻留位 | 物理页帧号
-
驻留位 : 表示该页是在内存中还是在外存.
-
保护位 : 表示允许对该页做何种类型的访问, 如只读, 可读写, 可执行等
-
修改位 : 表示此页在内存中是否被修改过. 当系统回收该物理页面时, 根据此位来决定是否把它的内容写回外存
-
访问位 : 如果该页被访问过(包括读写操作), 则设置此位. 用于页面置换算法.
-
-
缺页中断处理过程 :
-
如果在内存中有空闲的物理页面, 则分配一物理页帧f, 然后转第4步; 否则转到第2步;
-
采用某种页面置换算法, 选择一个将被替换的物理页帧f, 它所对应的逻辑页为q, 如果该页在内存期间被修改过, 则需要把它写回外存;
-
对q所对应的页表项修改, 把驻留位置为0;
-
将需要访问的页p装入到物理页面f当中;
-
修改p所对应的页表项的内容, 把驻留位置为1, 把物理页帧号置为f;
-
重新运行被中断是指令.
-
后备存储(二级存储)
-
一个虚拟地址空间的页面可以被映射到一个文件(在二级存储中)的某个位置
-
代码段 : 映射到可执行二进制文件
-
动态加载的共享库程序段 : 映射到动态调用的库文件
-
其他段 : 可能被映射到交换文件(swap file)
-