文章目录
1. 页的共享和保护
1. 页的共享
当若干进程运行相同的程序时(例如多个用户同时运行一个编辑器程序),共享代码变得非常重要。
- 实现方法 :一种有效的方法是使相关进程在逻辑空间中的页面,通过各自的页表指向相同的内存物理页面。这样可以避免在内存中出现同一页面的两个副本,大大节省了内存空间。
- 共享原则 :通常,只有只读页面(如纯代码段)可以共享,而数据页面往往是进程私有的,不能共享。
2. 存储保护
在分页管理机制下,存储保护通过两种方式实现:
-
地址越界保护
- 与分区管理中使用上、下界寄存器不同,分页管理中的越界保护是由地址变换机构自动完成的。
- 在地址转换时,硬件会根据页表长度寄存器 (PTLR) 的值,来判断逻辑地址中的页号是否超出了页表长度。如果页号大于或等于页表长度,则产生越界中断。
-
存取控制保护
- 可以在页表项 中增加相应的保护位来实现,例如设置"只读"、"可读写"等权限。每次访问时,硬件会检查操作类型是否与保护位设定的权限相符。
静态分页式存储管理的优缺点
优点:
- 作业不必作为整体装入内存连续区域:实现了离散分配,解决了外部碎片问题。
- 便于多道程序设计,提高资源利用率:内存管理更灵活,可以容纳更多进程并发执行。
- 页面大小和块的大小相等,便于主存管理:管理和分配都以固定大小的块为单位,非常规整和简单。
缺点:
- 地址转换增加系统开销:每次访存都需要查表,增加了时间开销(虽可通过快表缓解)。
- 仍存在内存碎片(内部碎片):一个进程的最后一页往往不能被充分使用,造成空间浪费。
- 页表占用存储空间:对于地址空间大的进程,页表本身可能会非常庞大,占用可观的内存。
- 内存的扩充问题:作业的地址空间受内存容量限制,无法运行超过物理内存大小的程序。
- 共享困难:页由系统划分,对用户透明,用户很难根据逻辑意义(如函数、变量)实现共享。
2. 页式虚拟存储管理
为了解决静态分页中作业大小受物理内存限制的问题,在分页管理的基础上引入了虚拟存储技术。
- 基本思想 :在程序运行时,仅将部分页面装入内存 。在执行过程中,若所需页面不在内存,则发生缺页中断 (Page Fault),系统根据一定的算法,将所需页面调入内存。
与基本分页管理相比,需要重点解决以下新问题:
- 如何发现缺页情况,发现后如何处理?
- 调入时若内存中无空闲页,如何淘汰(置换)内存中的页面?
请求页式动态方法
- 核心思想 :
- 在作业或进程开始执行之前,都不把作业的程序段和数据段一次性全部转入内存,而只装入被认为是经常反复执行和调用的工作区部分。
- 其他部分则在执行过程中动态装入。
程序的局部性原理
请求页式之所以高效,其理论基础是程序的局部性原理。
- 定义:指程序在执行过程中的一个较短时间内,所执行的指令地址或数据地址分别局限于一定的存储区域中。
- 分类 :
- 时间局部性:如果一个存储项被访问,那么在不久的将来它很可能被再次访问(例如:循环中的指令和数据)。
- 空间局部性:如果一个存储项被访问,那么与它地址相邻的项也很可能在不久的将来被访问(例如:顺序执行的代码、数组的遍历)。
请求页式的具体方法
- 划分:划分内存和进程的逻辑空间为大小相等的页面和页(同基本分页)。
- 部分加载:只把部分页加载入内存。
- 执行与中断 :执行时,检查需要的页面在不在内存内?
- 如果在,则正常执行。
- 如果不在 (发生缺页),则执行缺页中断处理程序 :
- 把所缺页面调入内存。
- (调入前需检查是否有足够的空闲内存空间;如果没有,需要调出某个页面到外存,直至空闲空间足够。)
- 回收:进程结束后回收其占用的内存。
1. 数据结构的扩充:页表的扩充
为了支持虚拟存储,页表项中需要增加几个关键的标志位。
| 页号 | 页面号 | 中断位 (P ) | 外存地址 | 修改位 (M) |
|---|
-
中断位 :也称"状态位"或"有效位"。
1: 表示该页在内存中,地址转换有效。
0: 表示该页在外存中,访问该页会产生缺页中断。
-
修改位 :
- 用于标记该页面调入内存后是否被修改过。
- 当需要淘汰该页时,如果修改位为
1,表示需要将其内容写回外存 ;如果为0,则无需写回,直接丢弃即可。
-
外存地址:指出该页在外存(如磁盘)上的存放位置。
2. 地址重定位(地址转换过程)
- 硬件访问页表时,首先检查页表项中的中断位。
- 若中断位为 1 :表明该页在内存中,则使用页表中对应的页面号,正常完成地址转换。
- 若中断位为 0 :表明该页不在内存中,则产生硬件中断(缺页中断) 。CPU执行操作系统的中断处理程序,根据页表中给出的外存地址将该页调入内存,并修改页表。