操作系统笔记——基本分页式内存管理

最近在复习操作系统,被这个分页管理弄得迷迷糊糊的,现在把笔记(目前所知道的有限的内容)整理一下。

基本分页存储管理方式

1、分页管理的提出

我们都知道连续式分配管理最主要的缺陷就是容易出现碎片(内部or外部),这些碎片严重影响了系统的性能和内存利用率,因此提出了非连续式分配管理,分页管理就是其中一种。操作系统把内存划分为大小一样的若干(其实多得多)个,每个块相对较,作为内存的基本单位,进程在申请内存时,也是以块为单位逐个申请空间。


2、分页管理的特点

① 分页管理不会出现外部碎片。
② 由于进程仅仅可能在为最后一个块申请空间的时候,产生内部碎片(除了最后一个块可能会有剩余空间,其他的块一定都是满的),因此尽管会出现内部碎片,但是这种影响是相对来说很小的。
③ 分页的作业地址空间是维一的,即单一的线性空间。
④ 页面的大小固定。


3、分页管理的几个概念(一些比较绕口的术语)

(1) 页(页面)—— Page

在分页管理中,由于进程在申请内存空间时,是逐个按照来申请空间的,故进程被分成若干个逻辑块,这些逻辑块被称为页(或页面)。


(2) 页框(页帧)—— Page frame

进程中的页必然要映射到内存中的物理块,即一个页(页面)对应唯一的物理块,这些内存中的(物理块)称为页框(或页帧)。


(3) 页面大小

每个,也就是进程中的每一块,都有相同的大小,这个大小叫做页面大小,也有叫页的大小的,都是一个意思。为了方便地址转换,一般取2的整数次幂(二进制思想),常见的页面大小是4KB(32位系统)。


(4) 页表

每生成一个进程,操作系统就要为这个进程生成一张页表,用来记录进程每一页在内存中对应的物理块号(即页框),虽然叫做“表”,但页表通常放在内存中而不是外存,页表的大小有可能超过一页。页表由页表项构成,下面介绍页表项


(5) 页表项

页表项是页表的基本构成单元,一个页表项相当于页表的一条记录。页表项由页号内存的物理块号(就是页框号)构成。比如页号为“4”,页框号为“7”,就表明该进程的第5(从0编号的话)个页面对应于内存的第8个物理块。

下面给出页表的结构:
操作系统笔记——基本分页式内存管理_第1张图片


(6) 逻辑地址

在分页管理方式中,逻辑地址结构由页号页内偏移量(也叫页内地址)构成。
在32位系统中,页号占20位(12 ~ 31),页内偏移量占12位(0 ~ 11)。这里页号就不多说了,与页表中的页号是一样的。我们主要看下页内偏移量,页内偏移量是指逻辑地址在其所在页的偏移单位数。举个例子,逻辑地址为642,每个页的大小为200字节,那么逻辑地址占了整整3个页,落到了第4页,即第4页即为所在页。既然第4页没占满,那落到了第4页的哪个位置呢?642 - 3 × 200 = 42,也就是说,页内偏移量为42,如果以0为起始地址(偏移量为0就表示落在某一页0号字节的位置),那就是落到了第4页的42字节的位置。为了更简洁,可以使用取余运算,即:

页内偏移量 = 逻辑地址 % 页面大小 (取余)

操作系统笔记——基本分页式内存管理_第2张图片

同理,页号和逻辑地址之间即为取整的关系,即:

页号 = 逻辑地址 / 页面大小 (下取整)

那么,页内偏移量还能起到什么用途呢?页内偏移最小为0这个不用多说,最大呢?试想,如果超过这个最大值,会发生什么?那不就偏移到下一个页面了吗?因此页内偏移量必须要覆盖整整一个页的大小,即:

页面大小(页的大小) = 2页内偏移量所占位数

假设页内偏移量占用了12位,那它能表达的最大值是多少?212-1. 最小值是0. 如果计算机以字节为内存单位,那就可以表示212 Bytes = 4KB,也就说,一个页的大小就是4KB.

同理,由于每次分配给进程的页面是随机的,因此页号也必须能够表示全部的页面,即页号的位数决定了内存最多能表示多少页,若每一页大小确定了,内存的大小也能确定。

内存最多页面数 = 2页号所占位数

系统内存 = 内存最多页面数 × 页面大小

对于32位系统,系统最多有220个页面,每个页面4KB,则内存大小就等于220 × 4KB,合4GB.

换句话说,一个页表也要必须能够索引到全部页面,因此页表中的页表项个数就是最多页面数。

页面中页表项个数 = 内存最多页面数 = 2页号所占位数

页表大小 = 页面中页表项个数 × 页表项大小

用来表示页号占去了20位,那么一个页表就能表示220页表项,假设每个页表项占用4Bytes空间,那么页表大小是多少呢?220×4Bytes = 4MB,一个页表大小就占了4MB这么大的内存空间。


(7) 物理地址

物理地址就是某个实际的存储单元在物理内存中的地址
物理地址的计算公式为:

物理地址 = 物理块号 × 页面大小 + 页内偏移量

那么物理块号怎么求呢?当然是根据页表去查了,知道了页号,也就唯一地对应了一个物理块号

因此,将逻辑地址转换为物理地址就变得非常简单了。


4、基本分页管理的地址变换机制

计算机中,整个地址变换的过程由硬件完成,基本流程如下:

i. 根据逻辑地址确定页号(通常已知页面大小)和页内偏移量;
ii. 查页表,确定对应的物理块号;
iii. 根据公式⑧,计算物理地址。


5、举例

假设某计算机按照字节编址(1Byte = 8bits,1K = 2^10),内存管理采用基本分页方式,页号从0计算。已知页面大小为1KB,页表中页号11对应的物理块号是17号,页号12对应的物理块号是0号,页号13对应的物理块号是6号。求逻辑地址13046对应的物理地址。

解: 已知逻辑地址和页面大小,就能计算出页号和页内偏移(这里注意编号从0开始)。

页号 = 13046 / 1K = 13046 / 2^10= 13046 / 1024 = 12
13046 % 1K = 13046 % 2^10 = 13046 % 1024 = 758

查页表可知,12的页号对应的物理块号为0,那么

物理地址 = 0 × 1K + 758 = 758


6、访问内存的步骤

我们知道,页表是存于内存中的,操作系统首先要根据逻辑地址找到对应页号和页内偏移,之后就去页表中查找对应的物理块号,这样就访问了一次内存。随后,计算出物理地址后,再去根据该地址向内存中存取数据或指令,又访问了一次。因此,存取一条数据或指令需要访问2次内存


7、带有快表的基本分页管理

为了减少访存次数,在地址变换机构中增设了一个高速缓冲存储器,称相关联存储器(TLB),常叫做快表,快表不是内存的一部分,访问快表的速度远超过访存速度,快表中的结构与页表类似。增加快表后,地址变换的机制如下:

i. 根据逻辑地址确定页号(通常已知页面大小)和页内偏移量;
ii. 将页号与快表中的记录匹配,如果匹配到了,直接从快表中获得对应的块号,即只需访存1次;如果没有匹配到,再去页表中找相应的块号,即需要访存两次;
iii. 根据公式⑧,计算物理地址。

那既然加了快表也不能完全保证只访存1次,那如何高效率呢?一般来说,快表中存放的记录并不是随机的,而是最常使用的那些页面。一般来说,快表的命中率非常高,甚至能达到90%以上,因此相对于没有快表的地址转换机构来说,访存的效率还是大大提升了的。

下面给个简单的例题说明情况:
对某一基本分页管理的系统,其页表位于主存中,则
i. 忽略地址转换的时间,假设没有缺页出现,若一次访存需要15μs,求一次存取数据需要的时间;
ii. 在i的基础上增加快表,命中率为85%,一次访问快表需要5μs,求一次存取数据需要的平均时间:

解答:
i. 一次存取需要两次访存,故需要的时间 = 2 * 15μs = 30μs;
ii. 快表命中率为0.85,说明总体来说系统有0.85的概率可以直接从快表中找到对应的块号,有0.15的概率需要两次访存,因此需要的平均时间 = 0.85 * (5 + 15) + 0.15 * (15 + 15) = 21.5μs,要小于30μs.


8、二级页表

(1) 提出

假设我们将一个进程比作一本书,进程有一个页表,就相当于这本书的目录,而进程的每一页就相当于这本书的每一页。我们都知道新华字典吧,很厚的一本,新华字典的目录由全部的汉字构成,仅仅这个目录就有一小摞纸那么厚,那这样用户去找某个字还是很麻烦,因此我们在新华字典中,设置了A~Z这26个字母索引,用户根据索引可以很快地找到某个字,然后根据目录找到改字所在的页,这就是我们所说的二级页表,即“目录的目录”。
下面用实际的例子来进一步解释。
假使我们有个进程大小为40MB,并且页面大小为4KB,那我们需要40MB / 4KB = 10K个页面来表示这个进程,因此要求页表中有10K个页表项去一一对应这些页面。我们知道,一个页表项通常为4B,10K个页表项就需要占用10K × 4B = 40KB = 10 × 4KB,即需要10个页面去存放这些页表项(不要忘了页表也是要占用内存的)。在实际运行一个程序时,通常一次只需要几十个页面大小的内存块,而单独这些页表项就额外需要10个内存块,显然利用率非常低,因此提出二级页表,将这存放10K个页表项的10个页表再压缩到一个顶级页表中,就自然提高了内存利用率。


(2) 格式

由于二级页表方式创建了一个顶级页表规定这个页表最多只占用1个页面的空间,也就是说,如果页面大小为4KB,那么这个顶级页表只能占用4KB的空间,一个页表项有4B大小,那么一个顶级页表就可以存放1K = 1024个页表项。每个页表项对应一个二级页表,此处的二级页表就相当于之前说的普通分页,二级页表的每个页表项对应一个物理块。

操作系统笔记——基本分页式内存管理_第3张图片

这里要注意一点,顶级页表中的“物理块号”是指二级页表在内存中的存储地方。以上图为例,假设要访问在一级页号为1、二级页号为3、偏移量为5的数据:

首先,去顶级页表中找到“页号”为1对应的物理块号,即13号,则去内存中13号物理块取出相应的1号二级页表,再从1号二级页表中找到“页号”为3的物理块号,即45号物理块,最后去内存45号物理块中存取相应的数据。


(3) 逻辑地址格式

操作系统笔记——基本分页式内存管理_第4张图片

(4) 地址变换机制

分别由逻辑地址最高10位(二进制编码,如果不是先转换)得到一级页号,中间10位得到二级页号,最低12位得到页内偏移。之后根据一级页号对应的物理块找到对应的二级页表在物理内存中的位置,然后在二级页表中查找二级页号对应的物理块在内存中的位置,之后的步骤与“基本分页管理方式”一致。

比如:将逻辑地址(0000000101000000001100000000111)转换为物理地址(十进制),假设页面大小为4KB,编号从0开始。
首先,找到最高10位,0000000101,表示一级页号,转换成十进制是5,去顶级页表中查找一级页号为5的页表项,发现对应的内存块号是6,说明5号二级页表存放于内存中的6号块。再看逻辑地址的中间10位,0000000011,表示二级页号,转换成十进制是3,之后去查5号二级页表二级页号为3的页表项,发现对应的物理块号为4。最后看逻辑地址最低12位,00000000111,表示7,也就是说页内偏移为7,因此最终的物理地址 = 物理块号 × 页面大小 + 页内偏移量 = 4 × 4KB + 7 = 4 × 4 × 1024 + 7 = 16391.


9、直接在二进制或十六进制的逻辑地址上进行地址转换

由于逻辑地址的形式一般都是二进制,即页号占多少多少位,偏移占多少多少位,但是我们大多数在做题的时候喜欢将二进制转换为十进制,再通过取整、取余运算得到相应的物理地址。但实际上,有时候直接使用二进制或十六进制的逻辑地址做题更为简单一些,下面,举两个具有说明性的例题:

(1) 某个单道系统采用基本页式存储管理,其允许的最大逻辑地址空间为32个页面,每页1KB,且其允许的最大主存空间为16KB. 有一程序大小为10页,且其有效页表如下图所示,若地址转换机构分别遇到以下三个逻辑地址:0AC5H、1AC5H、3AC5H,说明其分别应该如何处理?
操作系统笔记——基本分页式内存管理_第5张图片

分析:首先题目给出单道系统,也就是说,此时只有这一个程序在运转。其次,我们可以根据其给出的条件写出逻辑地址和物理地址的格式:

逻辑地址最大可表示32个页面,32=25,故知其页号占用5位二进制数;每页1KB,合1024字节=210,知页内偏移占用10位二进制数,即其逻辑地址结构如下:
操作系统笔记——基本分页式内存管理_第6张图片

同理,主存空间16KB,即16=24个页面,故其物理地址块号占用4位二进制数,页内偏移仍然占用10位二进制数,即其物理地址结构如下:
操作系统笔记——基本分页式内存管理_第7张图片

解答:
基于以上地址格式规则,对于0AC5H这个逻辑地址,对应二进制为000 1010 1100 0101,取低10位作为固定的偏移量,即10 1100 0101,高5位为页号,即000 10,表示2号页面,对应块号为4。可知该逻辑地址转换到的物理地址为01 0010 1100 0101,对应十六进制为12C5H,则地址转换机构根据物理地址12C5H去访存就行了;

同理,对于1AC5H这个逻辑地址,对应二进制为001 1010 1100 0101,偏移量仍为10 1100 0101,而页号成了001 10,表示6号页面,但发现6号页面不在页表中,而6号页面为第7个页面,7小于最大页面数32,属于合法页面,也小于该程序最大页面数10,属于有效页面,因此产生缺页中断,进行缺页处理;

同理,对于3AC5H这个逻辑地址,对应二进制为011 1010 1100 0101,偏移量仍为10 1100 0101,但页号是011 10,表示14号页面,但14号页面也不在页表中,14号页面是第18个页面,小于32,属于合法页面,但大于进程最大页面数10,属于无效页面,系统产生越界中断。


(2) 在某页式管理系统中,主存为64KB,分成16块。设某进程有4页,其页号为0、1、2、3,分别被装进内存9、0、1、14号块。
i. 求该进程的总长度;
ii. 若给出逻辑地址 [页号 页偏移] = [0 0]、[2 1023],计算相应的物理地址(十六进制)。

分析:进程的总长度等于其占用页数乘上页面大小;这里的物理地址虽然没给出具体格式,但是可以根据主存大小和偏移量得到。主存为16块,合24,即块号占用6位,每一块大小位64KB/16 = 4KB,合212,即页偏移占用12位,物理地址格式如下:
操作系统笔记——基本分页式内存管理_第8张图片

解答:
i. 每一页大小为64KB/16 = 4KB,进程占用4个页面,因此进程大小为4*4KB = 16KB.

ii.
对于[0 0],首先找页号为0的块号,即9号,对应4位二进制为1001;页偏移为0,对应12位二进制为0000 0000 0000,因此整个物理地址为1001 0000 0000 0000,合十六进制9000H;
对于[2 1023],首先找到页号为2的块号,即1号,对应4位二进制为0001;页偏移为1023,对应12位二进制为0011 1111 1111,因此整个物理地址为0001 0011 1111 1111,合十六进制13FFH.

你可能感兴趣的:(操作系统学习笔记,操作系统,内存管理)