目录
离散分配的基本概念
4.4.1 分页存储管理基本思想
1、分页存储管理的基本方法
2、页面与物理块
3、实现分页存储管理的数据结构
4、实现分页存储管理的地址结构
5、分页存储管理的逻辑地址表示
4.4.2 地址变换机构
1、基本的地址变换机构
2、具有快表的地址变换机构
4.4.3 访问内存的有效时间 EAT
离散分配方式的引入
连续分配方式会产生内零头和外零头,为解决零头问题又要进行紧凑等高开销活动。
离散分配是指程序在内存中不一定连续存放。
根据离散时的基本单位不同,可分为三种:
- 分页存储管理
- 分段存储管理
- 段页式存储管理
离散分配的基本概念
1、离散的基础
- 分页(Pages):将程序地址空间分页。
- 分块(Frames):将内存空间分块。
2、离散分配的体现
程序的一页装入到内存的一块,但连续的多个页不一定装入到连续的多个块中。
注:系统中分页和分块的大小是不变的。
3、离散分配的优点
- 没有外零头
- 不受连续空间限制,每块都能分配出去
- 仅有小于一个页面的内零头
因为程序大小一般不是分页大小的整数倍,所以最后一个分页里会有内零头,但对于一个程序来说,也只会有这一个内零头,而且显然该内零头大小 < 分页大小。这种由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为 “页内碎片” 或称为 “内零头”。
4.4.1 分页存储管理基本思想
1、分页存储管理的基本方法
解决两个基本问题:
- 如何建立程序空间与主存空间的映射
- 如何进行地址变换:从程序逻辑地址到内存物理地址
2、页面与物理块
① 页面或页(Page):把每个进程的逻辑地址空间分成一些大小相等的片。
② 页框或物理块(Page Frame):把内存空间分成与页面相同大小的若干存储块。
在为进程分配存储空间时,总是以页框为单位。页面大小由机器的地址结构决定。某一机器只能采用一种大小的页面。页面的大小通常在 1KB~8KB 之间。
例如:一个作业的地址空间有 4 页。那么,只要分配给它 4 个页框,每一页分别装入一个页框内即可,并不要求这些页框是连续的。
说明:在程序空间中从 0 开始编制页号,页内地址也是相对于 0 进行编址的。
在进程调度时,必须把它的所有页一次性装入到主存的页框内;如果当前页框数不足,则该进程必须等待,系统再调度另外的进程 -- 纯分页方式。
3、实现分页存储管理的数据结构
① 页表:每个进程对应 1 个页表,描述该进程的各页面在内存中对应的物理块号。包括页面号、物理块号和存取控制字段,从而对存储块中的内容进行保护。
注意:全部页表集中存放在主存的系统专用区中,只有系统有权访问页表,保证安全。
② 作业表:整个系统 1 张,记录作业的页表情况,包含进程号、页表长度、页表始址等信息。
③ 空闲块表:整个系统 1 张,记录主存当前的空闲块。
4、实现分页存储管理的地址结构
地址空间为程序限定的空间,物理空间为内存限定空间。在分页存储管理系统中,将地址空间分成大小相同页面,将内存空间分成与页面相同大小的物理块。
在分页存储管理方式中,任何一个逻辑地址都可转变为:页号 + 页内位移量。
页号和页内位移量的划分是由系统自动完成的,对用户是透明的。
如:有一个 32 位的逻辑地址,可转化为如下方式:
5、分页存储管理的逻辑地址表示
对于其它进制,可以先将逻辑地址转换为二进制,再通过位数(地址结构)来看页号和页内偏移量。
在逻辑地址转换为物理地址时,页号会被页表指定的块号所取代,但是页内偏移量在转换过程中是保持不变的。
4.4.2 地址变换机构
地址变换机构的功能:将用户的逻辑地址转变为内存中的物理地址。
- 逻辑地址由页号和页内位移量组成
- 程序空间页面的大小和内存物理块的大小相同
- 因此页内位移量等于物理块块内位移量
因此地址变换的关键仅在于:页号到物理块号的转换,这个转换由页表完成。
1、基本的地址变换机构
核心:使用寄存器存放页表。
① 最初的想法
一个页表项使用一个寄存器。
- 优点:寄存器访问速度快,有利于提高地址变换的速度
- 缺点:寄存器成本高;页表很长,页表项很多,不可能都用寄存器实现
② 实际的做法
- 将页表存储在内存中
- 设置一个页表寄存器 PTR
PTR 用于存放 当前运行的进程的页表 在内存中的始址和页表的长度。当进程未被执行时,页表的始址和页表的长度存放在该进程的 PCB 中;当进程被执行时,才将这个两个数据装入到 PTR 中。
分页系统中的地址变换过程
逻辑地址 => 物理地址
- 根据逻辑地址,计算出页号和页内偏移量;
- 从 PTR 中得到页表首址,然后检索页表,查找指定页面对应的页框号;
- 用页框号乘以块大小获得其对应的起始地址,将其送入物理地址的高端;
- 将页内偏移量送入物理地址低端,形成完整的物理地址。
对于二进制,分别送入高端和低端才行得通;对于其它进制,直接把起始地址和页内偏移量加在一起就好啦。
作业的大小是被程序空间(逻辑地址)限制的,而不是被内存空间(物理地址)限制的!
也可以直接把十六进制转成十进制来做,我这个写的兜兜转转的。
地址结构长度和作业地址空间大小似乎都是冗余的信息(?)
我们还要画出地址变换图。
2、具有快表的地址变换机构
采用基本的地址变换机构至少需要访问两次内存:由于页表存放在内存中,因此第一次是去访问内存中的页表,第二次才是根据得到的物理地址去访问内存中的数据。存取速度几乎降低了一倍,代价太高。
为了提高地址变换的速度,为进程页表设置一个专用的高速缓冲存储器,称为 快表 TLB 或联想存储器。快表的工作原理类似于系统中的数据高速缓存(Cache),其中专门保存当前进程最近访问过的一组页表项。
根据程序的局部性,进程最近访问过的页面在不久的将来还可能被访问。
地址变换过程
根据逻辑地址中的页号,查找快表中是否存在对应的页表项。
① 若快表中存在该页表项,则称之为命中(hit),从快表中取出相应的页框号,再加上页内偏移量,计算出物理地址。
② 若快表中不存在该页表项,则称之为命中失败。需要再查找页表,从页表中取出相应的页框号,再加上页内偏移量,计算出物理地址。同时更新快表,将该页表项插入快表中。
我们企图利用快表少访问一次内存,但如果命中失败的话,还是会访问内存中的页表的。
之前的越界中断好像也得这样画,但是我懒得改了。
4.4.3 访问内存的有效时间 EAT
定义:从进程发出指定逻辑地址的访问请求开始,经过地址变换,再到内存中找到对应的物理单元并取出数据,所花费的总时间。
假设检索快表的时间为 20ns,访问内存的时间为 100ns 。
- 若能在快表中检索到 CPU 给出的页号,则 CPU 存取一个数据仅需要 120ns 。
- 否则,CPU 存取一个数据需要 20+100+100=220ns 的时间。
选用 8~12 个页表项组成的联想存储器,并采用适当的替换策略,则其命中率可达 80%~90% 。可见,增设联想存储器使得访问内存的有效时间减少。