操作系统-内存管理
1 KB = 2^10 B ;1 MB = 2^20 B ; 1 GB = 2^30 B
3.1 进程运行的基本原理
编辑 -> 编译 -> 链接 -> 装入内存
装入的三种方式
-
-
静态重定位:编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。装入时对地址进行“重定位”,将逻辑地址变换为物理地址;特点是必须分配其要求的全部内存空间
-
动态重定位(现常用):编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行,需要重定位寄存器的支持;采用该方法允许程序在内存中发生移动
链接的三种方式
-
静态链接:程序运行之前将编译后的目标模块及库函数连接成装入模块
-
装入时动态链接:边装入边链接
-
运行时动态链接:程序执行时需要该目标模块时,才对它进行连接
内存管理的相关概念
-
内存空间的分配和回收
-
需要提供某种技术从逻辑上对内存空间进行扩充
-
需要提供地址转换功能,负责程序的逻辑地址与物理地址的转换
-
提供内存保护
-
方法一:在CPU中设置上、下限寄存器
-
方法二:在CPU中设置重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器)
-
3.2 覆盖与交换
覆盖技术:内存中分为一个“固定区”和若干个“覆盖区”,常用的模块的常驻固定区,不常用的模块放覆盖区需要时调入,不可能同时调用的模块可放入同一个覆盖区

缺点:必须由程序员声明覆盖结构,对用户不透明
交换(对换)技术:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存

PCB会常驻内存
3.3 分配与回收
3.3.1 连续分配管理方式
内部碎片:分配给某进程的内存区域中,有些部分没有用上
外部碎片:内存中某些空闲分区由于太小而难以利用
1、单一连续分配:内存被分为系统区和用户区,系统区通常位于内存的低地址部分,用于存放操作系统相关数据;用户区用于存放用户进程相关数据
-
内存中只能有一道用户程序占用整个用户区空间
优点:实现简单;无外部碎片;可以采用覆盖技术扩充内存;不一定需要采取内存保护
缺点:只能用于单用户、单任务的操作系统中,有内部碎片;存储器利用率极低
2、固定分区分配:将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业

-
分区大小相等很适合用于一台计算机控制多个相同对象的场合
-
操作系统需要建立分区说明表/链

优点:实现简单,无外部碎片
缺点:无外部碎片,有内部碎片,内存利用率不高;当用户程序太大时,可能所有的分区都不能满足需求
3、动态分区分配:不预先划分内存分区,而是在进程装入内存时,根据进程的大小动态建立分区,系统的分区大小和数目可变
-
系统用于记录内存使用情况的数据结构

-
分区的分配与回收:回收之后有相邻的分区则合并,没有则在分区表或者分区链中添加一行数据
-
分区分配算法
特点:无内部碎片,有外部碎片,外部碎片可以通过“紧凑”技术来解决
动态分区分配算法
-
首次适应算法:分区说明表/链按地址从低到高排列,每次都从低地址开始查找,找到第一个能满足大小的空闲分区
-
最佳适应算法:分区说明表/链按容量从小到大排列,优先使用更小的空闲分区
缺点:每次都选最小的分区,会留出很多小的难以利用的碎片
-
最大适应算法:分区说明表/链按容量递减排列,找到大小能满足要求的第一个空闲分区
缺点:大分区来的时候可能无法分配
-
邻近适应算法:分区说明表/链按地址从低到高排列,每次都从上次查找结束的位置开始查找,找到第一个能满足大小的空闲分区
优点:避免了首次适应算法遗留下的许多小的分区而每次都需要检索
缺点:高地址部分的大分区更可能被使用,划分为小分区,最后将导致无大分区可用

3.3.2 非连续分配管理方式
3.3.2.1 基本分页式存储管理
把内存分为一个个相等的小分区,每个分区称为“页框”或者“页帧”、“内存块”、“物理块”,每个页框有一个编号
再按照分区大小把进程拆分成一个个与页框相等的区域,称为“页”或“页面”,每个页也有一个编号;注意进程的最后一个页面可能没有一个页框那么大,因此页框不能太大
然后将页面放进页框中,具有一一对应的关系

地址转换

-
页号的手动计算方法
页号 = 逻辑地址(原) / 页面长度 (取除法的整数部分)
页面偏移量 = 逻辑地址 % 页面长度 (取除法的余数部分)
-
常用页面大小为2的整数幂


页表

每个页表项的长度是相同的,页号按递增顺序排放,则页号可以隐含;进程页表通常是装在连续的内存块中的,为了使页面查询更加方便,通常设置页表项长度为页框长度的因子
基本地址变换机构


页号、页内偏移量 -> 页表 -> 页框号 -> 物理地址
$$
在分页存储管理(页式管理)的系统中,只要给出一个逻辑地址,系统就可以自动地算出页号、页内偏移量两个部分,并不需要显式地告诉系统这个逻辑地址中,页内偏移量占多少位,因而页式管理中地址是一维的
具有快表的基本地址变换机构
局部性原理

快表(联想寄存器TLB):一种访问速度比内存快很多的高速缓冲存储器;以此对应,内存中的页表常称为慢表


两级页表
单级页表的缺点:
-
当页表很大时,需要占用很多个连续的页框(多级页表)
-
没有必要让页表常驻内存,进程在一段时间内可能只需要访问某几个特定的页面(虚拟存储技术)

-
若采用多级页表机制,则各级页表的大小不能超过一个页面

-
两级页表的访存次数
n级页表需要访存n+1次
3.3.2.2 基本分段式存储管理
分段:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名,每段从0开始编址;段的大小不固定

分段的逻辑地址

段号的位数决定了每个进程最多可以分为几个段;段内地址位数决定了每个段的最大长度是多少
段表

地址转换

分段、分页管理的对比
-
页是信息的物理单位,仅仅是系统管理上的需要,完全是系统行为,对用户是不可见的;段是信息的逻辑单位,分段对于用户是可见的,用户编程时需要显式地给出段名
-
分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址;分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要给出段内地址
-
分段比分页更容易实现信息的共享和保护;只需让各进程的段表指向同一个段即可实现共享,保护只让该进程访问,不让其他进程访问即可
3.3.2.3 段页式管理方式
段页式的逻辑地址结构

段号的位数决定了每个进程最多可以分为几个段;页号位数决定了每个段最大有多少页;页内偏移量决定了页面大小、内存块大小是多少
程序员需要给出段号和页内偏移量,而页号对于用户是不可见的,因而段页式管理的地址空间是二维的
段表

一个段表可能对应多个页表
地址变换

3.3.2.4 虚拟内存
传统存储管理方式的缺点
-
一次性:作业必须一次性全部装入内存后才能开始运行
-
驻留性:一旦作业被装入内存,就会一直驻留在内存中
虚拟内存的定义:在程序装入时,将很快会用到的部分装入内存,暂时用不到的部分留在外存;在程序执行过程中,当所访问的信息不存在时,由操作系统负责将所需信息从外存调入内存;当内存空间不够时,由操作系统负责将内存中暂时不用的信息换出到外存
易混淆的知识点
虚拟内存的最大容量 = 2^ 计算机地址结构的位数
虚拟内存的实际容量 = min {内存与外存之和,最大容量}
虚拟内存的特征
-
多次性
-
对换性
-
虚拟性
虚拟内存的实现
请求分页存储管理
-
与基本分页管理相比,请求分页管理中,为了实现“请求调页”,操作系统需要知道每个页面是否已经调入内存;如果还没调入,那么也需要知道该页面在外存中存放的位置
-
当内存空间不足时,要实现“页面置换”,操作系统需要通过某些指标来决定到底换出哪个页面;若页面没有修改过,不需要重新写回内存,若页面修改过,就需要将外存中的旧数据覆盖

缺页中断机构
在请求分页系统中,每当要访问的页面不存在时,便产生一个缺页中断,此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列;
如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项;若没有空闲块,则有页面置换算法选择一个页面淘汰,若该页面在内存期间被修改过,则要将其写回外存,未修改过则不用
-
缺页中断属于故障中断
地址变换


页面置换算法
1.最佳置换算法(OPT,Optimal):每次选择淘汰的页面将是永久不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率(理想算法)
2.先进先出置换算法(FIFO):每次选择淘汰的页面是最早进入内存的页面
实现方法:把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择对头页面即可
Belady异常——当为进程分配的物理块数增大时,缺页次数不减少反增的异常现象
只有FIFO算法会产生Belady异常,该算法的性能较差
3.最近最久未使用置换算法(LRU):每次淘汰的页面是最近最久未使用的页面
实现方法:赋予每个页面对应的页表项,用访问字段记录该页面自上次被访问依赖所经历的时间t,选择现有t值最大的,即最近最久未使用的淘汰
4.时钟置换算法(CLOCK)
简单的CLOCK算法:为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列;当某页被访问时,其访问位置为1,当需要淘汰一个页面时,只需检查页的访问位,如果是0,就选择该页换出,如果是1,则将它置为0,暂不换出,继续检查下一个页面,若第一轮扫描的所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描

改进的CLOCK算法:同时考虑优先置换没有修改过的页面

页面分配策略
驻留集:指请求分页存储管理中给进程分配的物理块的集合
固定分配:驻留集大小不变;
可变分配:驻留集大小可变
局部置换:发生缺页时只能选进程自己的物理块进行置换
全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程;全局置换意味着一定是可变分配

何时调入页面
-
预调页策略:根据局部性原理,预测不久之后可能访问到的页面,将它们预先调入内存,但目前预测成功率只有50%左右,故这种策略主要用于进程的首次调入
-
请求调页策略:进程再运行期间发现缺页时才将所缺页面调入内存,这种策略I/O开销大
何处调入页面
-
系统拥有足够对换区空间时,为保证调入、调出速度

-
系统缺少足够的对换区空间时

-
UNIX策略:未使用过的页面都可从文件区调入,若被使用过的页面需要换出,则写回对换区,下次需要时从对换区调入

抖动(颠簸)现象
刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存
工作集:再某段时间间隔内,进程实际访问页面的集合


浙公网安备 33010602011771号