页式管理
学过计组的同学都了解一点页式管理,就是将内存划分成较小的、大小固定的、等大的块。现在OS引入了进程的概念,那么为了匹配内存的分块,同样把进程也划分成同样大小的块。
这里区分两个概念
- The chunks of a process are called pages→进程划分的块称为页
- The chunks of memory are called frames/ page frames→内存划分的块叫做页框(物理页面、页帧)
从语义去分析页和页框的区别和联系,我们可以记住下面这句话:
把进程加载到内存,相当于把页放到页框中
然后在组原的课程当中我们知道了有以下两个基本公式:
- 页号=逻辑地址/页面大小
- 偏移量=逻辑地址%页面大小
看一下这个例子
按照我们之前的分区和分页的概念,假设用户空间大小是2700B,我们的访问地址是十进制的1502。如果是按照分区的思想,就是如图a所示访问,按照分页思想如图b所示。
一般来说,我们的页面大小都是2的整数次幂,可以直接通过位运算得到想要的结果。比如,页大小是1K = 2^10,那么offset = 逻辑地址%页面大小,也就是逻辑地址后10位,前面的6位就是页号。
下标从0开始,所以page1是从上往下数第二个页面,即从1024开始到2047结束,然后offset=478是针对于1024的基地址的相对位移。
最后我们可以看到,在最下面有一段内部碎片,就是page2中不会使用到的区域,但是为了分页必须要分配。
分页的特点
- 没有外碎片,每个内碎片不超过页大小
- 一个程序不必连续存放(支持虚拟存储)
- 便于改变程序占用空间的大小
- 简单分页,程序全部装入内存
- 不易实现共享
- 不便于动态连接
为了便于管理进程,操作系统为每个进程维护一张页表,包含进程的每个页面所对应的页框位置(号),逻辑地址包括页号和页内偏移量。
如图所示,主存中给A、C、D进程分配了页框,其中A是连续的0-3,而C是连续的7-10,D比较特殊是4-6,11-12,空闲13-14。对于每一个进程的页表,D中存放页表就是不连续的,所以需要在页表中记录。
接下来说一下,地址映射关系
页表开始地址b放在页表始址寄存器,类似于基址寄存器
页表长度l放在页表长度寄存器,记录了页表内访问的边界值,防止地址越界。
根据图示,地址映射关系可以按以下步骤描述:
第一步:比较运算
- 将逻辑地址对应的页号p与
l
进行比较(比较条件为P >= l
),这决定了数据流向哪个分支,如果为真则地址越界抛出异常,反之进行下一步。
第二步:加法运算 - 页表始址
b
和页号p
通过b+p*页表项长度
查询页表,得到的结果p'
就是所在页框的物理起始地址。
第三步:输出映射 - 在右侧分支,
p'
和d
直接结合作为输出,得到真实的物理地址。
段式管理
类似进程的管理,我们的程序在逻辑上也可以分开,也就是我们常说的分段管理,比如代码段、数据段等,段式管理中一般段长可变,但是有最大段长。
段氏地址有两个部分构成,和页式管理类似
- a segment number 段号
- an offset 段内偏移量
回到我们之前看的这个例子,段式存储中由于每一个段长度不一,所以需要记录
接下来我们了解一下段式存储的内存划分和分配:
- 内存划分:内存空间被动态的划分为若干个长度不相同的区域,这些区域被称为物理段,每个物理段由起始地址和长度确定
- 内存分配:以段为单位分配内存,每一个段在内存中占据连续空间,但各段之间可以不连续存放
如图所示,每一个段都有对应的长度和基址,对应不同的内存空间,可以发现物理存储是不连续的。
分析:
- 没有内碎片,外碎片可以通过内存压缩来消除
- 一个程序不必连续存放(支持虚拟存储)
- 便于改变进程占用空间的大小
- 便于存储保护、共享
- 简单分段,进程全部装入内存
存储保护:在段式管理中,每个段都有其自己的保护属性,例如读/写权限和执行权限。这样的属性设置可以防止一个程序的错误操作影响到其他程序的段,从而提高了系统的稳定性和安全性。此外,由于每个段都是独立的,一个段中的错误,如数组越界,不会影响到其他段。这种隔离减少了单一错误导致的整体系统崩溃的风险。
共享:在多任务环境中,多个进程常常需要执行相同的代码,如操作系统的系统调用或标准库函数。通过段式管理,多个进程可以共享同一个代码段,而无需在每个进程的地址空间中复制这些代码,从而节省了大量的内存空间。此外,段式管理允许不同的进程共享特定的数据段。例如,多个进程可以共享对同一配置文件或数据库的访问。这不仅提高了内存的利用率,也方便了进程间的数据交流
与页式管理类似,段式管理也有段表
- 进程段表:描述组成进程地址空间的各段,可以是指向系统段表中表项的索引。每段有段基址(base address)和段长度
- 系统段表:系统内所有占用段,包含始值、段长等
- 空闲段表:内存中所有空闲段,可以结合到系统段表中
段式管理内存的分配算法:首次适配;下次适配、最佳适配等
具体流程如下:
- 输入逻辑地址:逻辑地址部分由段号
S
和段内地址d
组成。 - 地址越界检查:通过段号S和Cl的比较,判断地址越界同页式管理
- 查找段表:通过
Cb+S*段表项长度
查找段号找到对应的段基地址b
和段长l
。 - 地址越界检查:将
d
与l
比较,确保d
没有超出l
。 - 计算物理地址:如果
d
在范围内,计算物理地址b + d
。
注:由于段长是不固定的,所以在计算得到物理地址之前会进行第二次检查地址越界
页式管理和段式管理的比较
- 分页是出于系统管理的需要,分段是出于用户应用的需要。
一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处。 - 页大小是系统固定的,而段大小则通常不固定。
- 逻辑地址表示:
分页是一维的,各个模块在链接时必须组织成同一个地址空间;
分段是二维的,各个模块在链接时可以每个段组织成一个地址空间。
通常段比页大,因而段表比页表短,可以缩短查找时间,提高访问速度。