王道操作系统笔记——— 非连续分配管理方式
Posted Xiu Yan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了王道操作系统笔记——— 非连续分配管理方式相关的知识,希望对你有一定的参考价值。
前言
非连续分配允许一个程序 分散地装入不相邻的内存空间。非连续分配管理方式根据分区的大小是否固定,分为 分页存储管理方式 和 分段存储管理方式,又将分页与分段存储管理方式的优点相结合形成了 段页式存储管理方式。
文章目录
一、基本分页存储管理
将内存空间分为一个个大小相等的分区,如:每个分区4KB。每个分区就是一个 页框 (页框=页帧=内存块=物理块=物理页面)。每个页框有一个编号,即 页框号,页框号 从 0 开始。
将进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分称为一个 页 或 页面。每个页面也有一个编号,即 页号,页号也是 从 0 开始。操作系统以 页框为单位 为各个进程分配内存空间。进程的每个页面分别放入一个页框中,即 进程的页面与内存的页框有一一对应的关系。
注:
① 页框、页帧、内存块、物理块与物理页面是针对内存; 页、页面是针对进程。
② 进程的最后一个页面可能没有一个页框那么大,即分页存储有可能产生内部碎片,因此页框不能太大,否则可能产生过大的内部碎片造成浪费。
1.1 逻辑地址结构
分页存储管理的 逻辑地址结构 如下所示:
地址结构包含两个部分:前一部分为页号,后一部分为页内偏移量 W。在上图所示的例子中,地址长度为 32 位,其中 0 ~ 11位 为页内偏移量(或称页内地址),即每页大小为 4KB;12~31 位为页号,进程地址空间最多允许 20 页。
重要考点:页面大小 ⇔ 页内偏移量位数 ⇒ 逻辑地址结构
结论:
① 如果有 K K K 位 表示 页内偏移量,则说明该系统中 一个页面的大小是 2 K 2^K 2K 个内存单元,内存中的物理块大小也是 2 K 2^K 2K 个内存单元。
② 如果有 M M M 位 表示 页号,则说明在该系统中,一个进程最多允许有 2 M 2^M 2M 个页面。
1.2 页表的定义
为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张 页表。页表通常存在 PCB (进程控制块,在操作系统的内核地址空间)中。页表记录进程 页面 和实际存放的 内存块 之间的 映射关系。
① 一个进程对应一张页表。
② 进程的每个页面对应一个页表项。
③ 每个 页表项 由 页号和块号 组成。
④ 每个页表项的长度是相同的。
重要考点:内存块数量 ⇒ 页表中块号占多少字节
例:假设某系统物理内存大小为 4 4 4 GB,页面大小为 4 4 4 KB,则每个页表项至少应该为多少字节?
内存块大小 = 页面大小 =
4
4
4 KB =
2
12
2^12
212 B
⇒
4
4
4 GB 的内存总共会被分为
2
32
2^32
232 /
2
12
2^12
212 =
2
20
2^20
220 个内存块
⇒ 内存块号的范围应该是
0
0
0 ~
2
20
2^20
220-
1
1
1
⇒ 内存块号至少要用
20
20
20 bit 来表示
⇒ 至少要用
3
3
3B 来表示 块号(
3
3
3 *
8
8
8 =
24
24
24 bit )
页表项在内存中是连续存放,因此页号是可以隐藏的,不占内存空间,页表项占 3 个字节。
结论:
存储整个页表至少需要 3 ∗ ( n + 1 ) 3*(n+1) 3∗(n+1)B, n n n 是页号的最大值,因为页号是从0开始。
i i i 号页表项的存放地址 = X + 3 ∗ i X+3*i X+3∗i, X X X 是页表的起始地址
j j j 号内存块的起始地址 = j j j ∗ * ∗ 内存块大小
注:如果未特别强调,默认计算机按字节编址。
1.3 地址转换
分页存储特点: 虽然进程的各个页面是离散存放的,但是页面内部是连续存放的。
如果要访问逻辑地址 A 的物理块,则
① 确定逻辑地址 A 对应的页号 P
② 找到 P 号页面在内存中的起始地址(需要查页表)
③ 确定逻辑地址 A 的页内偏移量 W
页号 = 逻辑地址 / 页面长度
页内偏移量 = 逻辑地址 % 页面长度
例1: 在某计算机系统中,页面大小是 50 B。某进程逻辑地址空间大小为 200 B,则逻辑地址 110 对应的页号、页内偏移量是多少?
计算机内部的地址是用二进制表示的,如果页面大小刚好是 2 的整数幂,则计算机硬件可以很快速的把逻辑地址拆分成 (页号, 页内偏移量)。
结论1: 与上文结论相同,如果每个页面大小为 2 K 2^K 2K B,用二进制数表示逻辑地址,则末尾 K K K 位即为页内偏移量,其余部分就是页号。
例2: 假设某计算机用 32 个二进制位表示逻辑地址,页面大小为 4 4 4 KB,1 号页面存放的 内存块号。将逻辑地址 4097 转换为物理地址。
逻辑地址 4097,用二进制表示应该是 00000000000000000001000000000001。
由于页面大小
4
4
4 KB =
2
12
2^12
212 B =
4096
4096
4096 B,所以页内偏移量占
12
12
12 位,即二进制表示的逻辑地址,后
12
12
12 位是页内偏移量,前
20
20
20 位是页号。
页号 = 4097/4096 = 1 = 00000000000000000001
页内偏移量 = 4097%4096 = 1 = 000000000001
现假设通过查询页表得知 是 9(1001),则
9号内存块的起始地址 = 9*内存块大小 = 9*4096 = 00000000000000001001000000000000
逻辑地址4097对应的物理地址 = 页面在内存中存放的起始地址 + 页内偏移量
= 9
∗
*
∗ 4096 + 1= 36865 =(00000000000000001001000000000001)
结论2: 如果页面大小刚好是 2 的整数幂,则只需把页表中记录的物理块号拼接上页内偏移量,就可以得到对应的物理地址。
1.4 基本地址变换机构
基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址。
通常会在系统中设置一个 页表寄存器(PTR),存放 页表在内存中的起始地址 F 和页表长度 M。
进程未执行时,页表的始址 和 页表长度 放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。
设页面大小为
L
L
L,逻辑地址
A
A
A 到物理地址
E
E
E 的变换过程如下:
① 根据逻辑地址计算页号
P
P
P(
P
=
A
/
L
P=A/L
P=A/L)和页内偏移量
W
W
W(
W
=
A
%
L
W=A\\%L
W=A%L)
② 比较页号
P
P
P 和 页表长度
M
M
M。若
P
≥
M
P≥M
P≥M,则产生越界中断,否则继续执行。(注:页号是从 0 开始的,而页表长度至少是 1,因此
P
=
M
P=M
P=M 时也会越界)
③ 页表中页号
P
P
P 对应的页表项地址 = 页表起始地址
F
F
F + 页号
P
P
P * 页表项长度,取出该页表项内容
b
b
b,即为内存块号。
④ 计算
E
=
b
∗
L
+
W
E = b * L + W
E=b∗L+W,用得到的物理地址
E
E
E 去访存。(如果内存块号、页面偏移量是用二进制表示的,那么把二者拼接起来就是最终的物理地址了)
⑤ 访问目标内存单元。
注意区分页表项长度、页表长度、页面大小的区别:
页表项长度指的是每个页表项占多大的存储空间;
页表长度指的是这个页表中总共有几个页表项,即总共有几个页;
页面大小指的是一个页面占多大的存储空间
在分页存储管理(页式管理)的系统中,页是信息的物理单位,分页完全是系统行为,因此 页的大小由系统决定,逻辑地址在计算机的视角很好确定。所以,页式管理中地址是一维的。即,只要给出一个逻辑地址,系统就可以自动地算出页号、页内偏移量 两个部分,并不需要显式地告诉系统这个逻辑地址中,页内偏移量占多少位。
1.5 具有快表的地址变换机构
快表,又称联想寄存器(TLB),是一种 访问速度比内存快很多的高速缓存器,用来存放最近访问的页表项的副本,可以加速地址变换的速度。与此对应,内存中的页表常称为慢表。
注:TLB 不是内存;快表与 Cache(高速缓冲器) 的区别在于,块表中只有页表项的副本,而普通 Cache 中可能有其他各种数据的副本,可以把快表理解为一种特殊的 Cache。
设某进程执行过程中要访问 (0,4) 这个逻辑地址,访问过程如下:
① CPU 给出逻辑地址,由硬件进行地址转换,将页号与快表中的所有页号进行比较。
② 如果找到匹配的页号,说明要访问的页表项在快表中有副本,则直接从中取出该页对应的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后再访存。因此,若快表命中,存取数据仅一次访存。
③ 如果没有找到匹配的页号,则需要访问内存中的页表。找到对应页表项,得到页面存放的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后再访存。因此,若快表未命中,存取数据需两次访存。
注:在找到页表项后,应同时将其存入快表,以便后面可能的再次访问。但若快表已满,则必须按照一定算法对旧的页表项进行替换(局部性原理)。
- 时间局部性: 如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
- 空间局部性: 一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的)
例:某系统使用基本分页存储管理,并采用了具有快表的地址变换机构。访问一次快表耗时 1us,访问一次内存耗时 100us。若快表的命中率为 90%,那么访问一个逻辑地址的平均耗时是多少?
解:
有的系统不支持快表和慢表同时查找。,平均耗时(1+100) * 0.9 + (1+100+100) * 0.1 = 111 us
有的系统支持快表和慢表同时查找。,平均耗时= (1+100) * 0.9 + (100+100) * 0.1 = 110.9 us
补充:对页表项大小的进一步探讨(了解)
2.1.1 例题: 假设某系统物理内存大小为 4 4 4 GB,页面大小为 4 4 4 KB,内存总共会被分为 2 32 2^32 232 / 2 12 2^12 212 = 2 20 2^20 220 个内存块,因此内存块号的范围应该是 0 0 0 ~ 2 20 2^20 220- 1 1 1。 内存块号至少要用 20 20 20 bit 来表示吗,因此块号至少要用 3 3 3B 才够。各页表项会 按顺序连续地存放 在内存中如果该页表在内存中存放的起始地址为 X X X,则 M M M 号页对应的页表项是存放在内存地址为 X + 3 ∗ M X + 3*M X+3∗M。
思考:一个页面为
4
4
4 KB,则每个物理块可以存放 4096/3 = 1365 个页表项,但是这个页框会剩余
2
32
2^32
232 % 3 = 1 B 页内碎片。因此,1365 号页表项存放的地址为
X
+
3
∗
1365
+
1
X+3*1365+1
X+3∗1365+1 (页表项从0开始编号)。
如果每个页表项占 4 字节,则每个页框刚好可存放 1024个页表项
1024 号页表项虽然是存放在下一个页框中的,但是它的地址依然可以用 X + 4*1024 得出。
结论: 理论上,页表项长度为 3B 即可表示内存块号的范围,但是,为了方便页表的查询,常常会让一个页表项占更多的字节,使得每个页面恰好可以装得下整数个页表项。
二、两级页表
两级页表的分配管理方式属于基本分页存储管理范畴,其用于解决页表项占据连续页框的问题。
2.1 单级页表存在的问题
问题: 页表项在内存中是连续存放的,当进程很大时,记录进程页面的页表项需要占据很多连续的页框,这个问题如何解决?
解决方案: 可建立两级页表,一级页表为页目录表,二级页表离散存储。
2.2 两级页表的引入
例: 某系统按字节寻址,支持 30 位的逻辑地址,采用分页存储管理,页面大小为 4KB,页表项长度为 4B,试问逻辑地址的结构。
页面大小为
4
4
4 KB =
2
12
2^12
212 B,则页内偏移量要用
12
12
12 位表示。 以上是关于王道操作系统笔记——— 非连续分配管理方式的主要内容,如果未能解决你的问题,请参考以下文章 (王道408考研操作系统)第三章内存管理-第一节7:非连续分配管理方式之基本分段管理方式 (王道408考研操作系统)第三章内存管理-第一节7:非连续分配管理方式之基本分段管理方式 (王道408考研操作系统)第三章内存管理-第一节6-1:非连续分配管理方式之基本分页存储管理 (王道408考研操作系统)第三章内存管理-第一节8:非连续分配管理方式之段页式管理方式
30
30
30 -
12
12
12 =
18
18
18,则页号用 18 位表示,即进程最多有
2
18
2^18
218 个页面,一共需要
2
18
2^18
218 个页表项来记录这些页面与物理块的映射关系,且页号范围是:
0
0
0 ~
2
18
2^18
218-
1
1
1。
页表项长度是
4
4
4 B,一个内存块(页框)最多存储
4
4
4K/
4
4
4 =
2
12
2^12
212/
4
4
4 =
2
10
2^10
2<