我是靠谱客的博主 风中蜜粉,最近开发中收集的这篇文章主要介绍操作系统内存管理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 分页储存
      • 基本概念
      • 重要数据结构--页表
        • 1、每个页表项占用多少字节?
        • 1.1、如何根据页号找到(在内存中)对应的页表项(的地址)
        • 2、如何实现从逻辑地址到物理地址的转换
        • 2.1 二进制的逻辑结构的地址划分
        • 3、总结
      • 两级页表
        • 1、单级别页表存在的问题
        • 1.2、二级页面表定义
        • 1.3、二级页表的地址转换
        • 2.1、几个需要注意的细节
        • 3、总结
      • 课后例题

分页储存

基本概念

在这里插入图片描述

重要数据结构–页表

在这里插入图片描述

1、每个页表项占用多少字节?

Eg:假设某系统物理内存大小为 4 G B 4GB 4GB,页面大小为 4 K B 4KB 4KB,则每个页表项至少应该为多少字节?

由题目可知, 内 存 块 大 小 = 页 面 大 小 = 4 K B = 2 12 B 内存块大小 = 页面大小 = 4KB = 2^{12}B ==4KB=212B

又因为 4 G B = 2 32 B 4GB = 2^{32}B 4GB=232B

所以 4 G B 4GB 4GB的内存总共会被分为 2 32 / 2 12 = 2 20 2^{32}/2^{12}=2^{20} 232/212=220个内存块

所以内存块号的范围应该是 0 0 0 ~ 2 20 − 1 2^{20}-1 2201

又因为一位二进制可以表示的状态有 2 1 2^1 21

所以全部的内存块号至少要用 l o g 2 2 20 = 20 ( 位 ) b i t log_2{2^{20}}=20(位)bit log2220=20()bit来表示

又由于计算机分配内存是以字节(B)为单位分配,因此需要将位(bit)转化位字节 1 B = 8 b i t 1B = 8bit 1B=8bit

所以至少需要 3 B 3B 3B来表示块号 ( 3 ∗ 8 = 24 b i t ) (3*8=24bit) (38=24bit)

又由于页表项另外一个组成:页号不占用存储空间(见下面解释),

因此一条页表项的大小只有块号做贡献,即 3 B 3B 3B ,而上例中整个页表有 ( n + 1 ) (n+1) (n+1)个页表项,故存储整个页表至少需要 3 ∗ ( n + 1 ) B 3*(n+1)B 3(n+1)B

另外

重要考点:由计算机中内存块的数量推算出页表项中块号至少占用多少字节

由于页表中的页表项是连续存放的,因此页号可以是隐含的,不需要占用空间。可以类比数组,数组在内存中只存放数据,并不会单独的存放多一个下标号。

1.1、如何根据页号找到(在内存中)对应的页表项(的地址)

在这里插入图片描述

这里需要注意的一点是,页表中的块号所记录的只是内存块号,而非内存块的起始地址。

J号内存块的起始地址为: J * 内存块大小

但是当我们将页表项按照上个例题所给的条件存放在内存时:一个页面为 4 K B 4KB 4KB,一个页表项大小为 3 B 3B 3B,则每个页框可以存放 ( 4 K B ) 4096 B / 3 B = 1365 (4KB)4096B/3B =1365 (4KB)4096B/3B=1365(序号从0开始,即存放0~1364号页表项)个页表项,但是这个页表框会剩余 4096 % 3 = 1 B 4096%3=1B 4096%3=1B页内碎片,又由于一个页表项是连续存放的,不能分开存放在不同的页框中,所以下一个页表项第1365只能存放在下一个页框中,而不能填补上一个页框的1B页内碎片。

因此,1365号页表项存放的地址为:X+3*1365 +1。此时可以看出,由于页表项之间并没有连续存放,所以上面的公式X+3*I失效。

但是如果我们将页表项的占用大小改成4B的话,则每个页框刚好可以存放1024个页表项,1024号页表项虽然是存放在下一个页框中的,但是它的地址依然可以用 X + 4 ∗ 1024 X+4*1024 X+41024 得出,因为每个页框都刚好可以被填满,不存在页内碎片,即页表项之间连续存放。

在这里插入图片描述

**结论:**理论上,页表长度为 3 B 3B 3B即可表示内存块号的范围,但是,为了方便页表的查询,常常会让一个页表项占用更多的字节,使得每个页面恰好可以装得下整数个页表项

2、如何实现从逻辑地址到物理地址的转换

由分页的特点:用于存放进程的页框是离散存储的,但是页框内部是连续存放的。所以我们可以先找到该页框的起始地址,然后再加上框内的偏移量即可求得具体的物理地址,具体的:

假如要访问逻辑地址A,则

  1. 确定逻辑地址对应的“页号” P
  2. 找到P号页面在内存中的起始地址(需要查页表,起始地址为: 内存块号 * 内存块大小”)
  3. 确定逻辑地址A的“页内偏移量”W
  4. 最后逻辑地址A所对应的物理地址 = P号页面在内存中的起始地址 + 页内偏移量W

举例说明:

如何将 将逻辑地址拆分成页号与页内偏移量。

在某计算机系统中,页面大小是 50 B 50B 50B。某进程逻辑地址空间大小为 200 B 200B 200B,则逻辑地址 110 110 110对应的页号、页内偏移量是多少?

由题目所给,可以将进程逻辑地址空间分成下图:
在这里插入图片描述

由上图不能看出:

页号 = 逻辑地址 / 页面长度 (取除法的整数部分)

页内偏移量 = 逻辑地址 % 页面长度(取除法的余数部分)

因此例子中所给的逻辑地址110

页号P = 100 / 50 = 2

页内偏移量W = 100 %50 = 10

因此物理地址为 = ( 页 表 中 P 所 对 应 的 物 理 块 号 ) ∗ 物 理 块 大 小 + W (页表中P所对应的物理块号) * 物理块大小 + W (P)+W

2.1 二进制的逻辑结构的地址划分

在计算机内部,地址是用二进制表示的,如果页面大小刚好是2的整数幂,则计算机硬件可以很快速的把逻辑地址拆分成(页号,页内偏移量)

逻辑地址结构(假设操作系统用32个二进制来表示逻辑地址):

31 … 1211 … 0
页号P页内偏移量W

地址结构包含两部分:前一部分为页号P,后一部分位页内偏移量W。如果每个页面大小位 2 k B 2^kB 2kB,用二进制表示逻辑地址,则末尾k位即为页内偏移量,其余部分就是页号

  • 如果由K位表示“页内偏移量“,则说明系统中一个页面的大小是2K个内存单元”
  • 如果由M位表示“页号“,则说明系统中,一个进程最多允许有2M个页面,即,页号范围为 :0 ~ 2M-1

如上表中,地址长度为32位, 0 0 0 ~ 11 11 11位为“页内偏移量”,或称“页内地址” ,可知页面大小为: 2 12 B 2^{12}B 212B 12 12 12~ 32 32 32为页号。

因此,可以将十进制的页号与页内偏移量单独的转换成二进制的表示形式,然后将将其拼接: 页 号 + 页 内 偏 移 量 页号+页内偏移量 +

举例说明:

假设某计算机用32个二进制表示逻辑地址,页面大小为 4 K B = 2 12 B = 4096 B 4KB = 2^{12}B = 4096B 4KB=212B=4096B (结构划分与上表单一致)

在这里插入图片描述

如,逻辑地址 4097 4097 4097 转化:

页号 = 4097 / 4096 = 1 4097 / 4096 = 1 4097/4096=1 转化为长度占20位的二进制形式为:00000000000000000001

页内偏移量 = 4097 % 4096 = 1 4097 % 4096 = 1 4097%4096=1 转化为长度占12位的二进制形式位:000000000001

然后将将其拼接得到二进制形式的逻辑地址: 页 号 + 页 内 偏 移 量 页号+页内偏移量 + = 00000000000000000001000000000001

同理,如果内存块的大小刚好也是2的整数次幂的话,该方法也适用。

在这里插入图片描述

3、总结

在这里插入图片描述

两级页表

1、单级别页表存在的问题

由上面的如何根据页号找到对应的页表项中可以得知,该方法适用于条件为,所有页表项必须为连续存放在内存中。

现在考虑这么一个问题:

某计算机系统按字节寻址,支持32位的逻辑地址,采用分页储存管理,页面大小为 4 K B 4KB 4KB,页表长度为 4 B 4B 4B,则将全部页表项连续储存需要多少连续的页框?

4 K B = 2 12 B 4KB=2^{12}B 4KB=212B,然后 2 12 B % 4 B = 0 2^{12}B %4B=0 212B%4B=0,可以看出,页框大小刚好是页表项的整数倍,所以页表项在内存中的存放可以是连续的。另外,页内地址要用12位表示,剩余20位表示页号,因此,该系统中一个进程最多有 2 20 2^{20} 220页,这也是页表项的数量。而一个页表项大小位 4 B 4B 4B,故一个页表所占的总大小(即全部页表项的大小总和)为: 2 20 ∗ 4 B = 2 22 B 2^{20}*4B = 2^{22}B 2204B=222B ,将这些页表项连续分框装进内存块时,所需的页框数量为: 2 22 / 2 12 = 2 10 2^{22}/ 2^{12} = 2^{10} 222/212=210 ,因此当页表很大时,需要占用很多个连续的页框。

在这里插入图片描述

1.2、二级页面表定义

这时我们可以尝试对页面进行分页:
在这里插入图片描述

单独的对页表的分页生成一个页表进行进行映射:页目录表
在这里插入图片描述

1.3、二级页表的地址转换

在这里插入图片描述

2.1、几个需要注意的细节

  1. 若采用多级页表机制,则各级页表的大小不能超过一个页面
    在这里插入图片描述

  2. 两级页表的访存次数分析(假设没有快表机构)

    • 第一次访存:访问内存中的页表目录表
    • 第二次访存:访问内存中的二级页表
    • 第三次访存:访问目标内存单元

    总结:N级页表的访存次数为: N + 1 N+1 N+1

3、总结

在这里插入图片描述

课后例题

  1. 某计算机主存按字节编址,采用二级分页储存管理,地址结构如下:

    页目录号(10位)页号(10位)页内偏移量(12位)

    则 虚拟地址 2050 2050 2050 1225 H 1225H 1225H 对应的 页目录号、页号分别是()()

     题目给出的逻辑地址是十六进制的,我们需要将其转化为二进制高位补零,然后将其与地址结构进行对比划分
     前10位、11~20位、21~32位分别对应:页目录号,页号,页内偏移量
     						<-高位 低位->
      2        0        5        0        1        2        2        5
    /       /       /       /       /       /       /       /  
    0010     0000	  0101     0000	    0001    0010	  0010     0101
    |------页目录号-----|---------页号-------|
    0010    0000  01     01    0000	   0001
    对两个二进制重新从低位开始编排(四个一组):
    00 1000 0001	  01 0000 0001
    高位补零:
    0000 1000 0001	  0001 0000 0001
    页目录号 = 0000 1000 0001
    页号     = 0001 0000 0001
    
  2. 某计算机主存按字节编址,逻辑地址和物理地址都是32位,页表项大小为4B。

如果其使用的分页存储管理方式,且其地址结构位:

页号(20位)页内偏移量(12位)

问:一个代码段的起始逻辑地址为 0000 0000 0000 8000 H 8000H 8000H ,其长度为 8 K B 8KB 8KB ,被装载到物理地址从 0090 0090 0090 0000 H 0000H 0000H 开始的连续主存空间中。页表从主存中物理地址 0020 0020 0020 0000 H 0000H 0000H 开始处处连续存放,如下图(地址大小自下向上递增)。请计算出该代码段对应的两个页表项的物理地址这两个页表项中的页框号,以及代码页面2的起始物理地址

image-20220125200045944

【解】

由逻辑结构可知,前20位为页号,将代码段起始逻辑地址转化为二进制,其前二十位下划线的为页号:

0000 0000 0000 8000 H 8000H 8000H = 0000 0000 0000 0000 1000 0000 0000 0000

=> 页号 = 0000 0000 0000 0000 1000 = 8

因此可得知逻辑代码段的起始对应页表的八号页表 ,于是根据公式I号页表项的物理地址=页表始址+I*每个页表项大小

=> 物 理 地 址 1 = 八 号 页 表 项 物 理 地 址 物理地址1 = 八号页表项物理地址 1= = 0020 0020 0020 0000 H 0000H 0000H + 8 ∗ 4 8*4 84 = 0020 0020 0020 0020 H 0020H 0020H

由于两个相邻的页表项地址之间只相差一个页表项的大小,

=> 物 理 地 址 2 = 物 理 地 址 1 + 页 表 项 大 小 物理地址2 = 物理地址1 + 页表项大小 2=1+ = 0020 0020 0020 0020 H 0020H 0020H + 4 +4 +4 = 0020 0020 0020 0024 H 0024H 0024H

由于页框号对应的是物理块号,因此我们可以借助用物理块的物理地址求得的物理块号从而逆推页框号。

代码页面1所对应的物理块号为 00900 H 0090 0H 00900H ,同时也是页框号1

要求页框号2,得先求得代码页面2的物理地址。

由于两个相邻的物理块地址之间只相差一个页框大小 ( 2 12 B 2^{12}B 212B),

=> 物 理 地 址 3 = 代 码 页 面 1 的 物 理 地 址 + 2 12 物理地址3 = 代码页面1的物理地址 + 2^{12} 3=1+212 = $ 0090 0090 0090 1000 H 1000H 1000H

与处理页框号1步骤相同,可求得页框号2 = 00901 H 0090 1H 00901H

image-20220125205951164

参考:1、22考研·操作系统全程班;2、2021年操作系统考研复习指导

最后

以上就是风中蜜粉为你收集整理的操作系统内存管理的全部内容,希望文章能够帮你解决操作系统内存管理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部