目录
概念
操作系统对内存的划分和动态分配就是内存管理的概念。
功能
内存空间的分配和回收
由操作系统完成对主存的分配和回收
地址转换
使逻辑地址转换为真实的物理地址
逻辑地址(相对地址)
编译后,每个目标模块都从0号单元开始编址,这称为该目标模块的相对地址(或逻辑地址)。
物理地址(绝对地址)
物理地址空问是指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。
内存空间的扩充
利用虛拟存储技术或自动覆盖技术,从逻辑上扩充内存
内存共享
允许多个进程访问内存的同一部分
存储保护
保证各道作业在各自的存储空间内运行,互不干扰
方式
- 设置上下限寄存器
- 利用重定位寄存器、界地址寄存器
源程序变为可执行程序步骤
- 编译:由编译程序将用户源代码编译成若千目标模块。
- 链接:由链接程序将编译后形成的一组目标模块及所需的库函数链接在一起,形成一个完整的装入模块。
- 装入:由装入程序将装入模块装入内存运行。
链接方式
- 静态链接:装入前链接成一个完整装入模块
- 装入时动态链接:运行前边装入边链接
- 运行时动态链接:运行时需要目标模块才装入并链接
装入方式
- 绝对装入:编译时产生绝对地址(单道程序阶段,无OS)
- 可重定位装入:装入时将逻辑地址转换为物理地址(早期多道批处理阶段)
- 动态运行时装入/动态重定位:运行时将逻辑地址转换为物理地址,需设置重定位奇存器(现代OS)
覆盖
基本思想:将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存。
具体操作:把内存划分为一个固定区和若干个覆盖区,固定区存放用户程序经常活跃的部分,调入后就不再调出(除非运行结束);將即将访问的段放在覆盖区,在需要调用前,系统将其调入覆盖区,替换原有的段。必须由程序员声明覆盖结构,操作系统完成自动覆盖。
适用情况:同一个程序/进程内
缺点:对用户不透明,增加了用户编程负担,覆盖技术只用于早期的操作系统中。
交换
基本思想:把处于等待状态的进程或者被CPU剥夺运行权限的进程从内存移出到外存,这一过程称为换出;把准备好竞争CPU的进程从外存移到内存,这一过程称为换入。
适用情况:不同进程/作业间
ps:一般将阻塞、优先级低的进程先换出到磁盘的对换区
连续分配管理方式
单一连续分配
内存被分为:系统区和用户区。
- 系统区:通常位于内存的低地址部分,用于存放操作系统系统区
- 用户区:用于存放用户进程相关数据。
特点:内存中用户区空间只能有一道用户程序
优点:实现简单;无外部碎片(分区外部不存在空间浪费);可以采用覆盖技术扩充内存;不一定需要采取内存保护(例:早期的PC 操作系统MS- DOS)。
缺点:只能用于单用户、单任务的操作系统中;有内部碎片(分区内部不存在空间浪费);存储器利用率极低
固定分区分配
固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空问划分为若干个固定大小的区域,每个分区只装入一道作业。
两种方法:
- 分区大小相等:缺乏灵活性,只适合用一台计算机控制多个相同对象的场合。
- 分区大小不等:增加了灵活性,可以满足不同大小的进程需求。
为便于内存分配,通常將分区按大小排队,建立一张分区说明表。
优点:实现简单,无外部碎片。
缺点:当用户程序太大时,可能所有的分区都不能满足需求,此时不得不采用覆盖技术来解决,降低性能;会产生内部碎片,内部利用率低
动态分区分配
在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。
动态分区分配算法
- 首次适应 (First Fit) 算法。空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。
- 最佳适应(Best Fit) 算法。空闲分区按容量递增的方式形成分区链,找到第一个能满足要求的空闲分区。
- 最坏适应(Worst Fir) 算法。又称最大适应 (Largest Fit) 算法,空闲分区以容量递减的次序链接,找到第一个能满足要求的空闲分区,即挑选出最大的分区。
- 邻近适应 (Next Fit) 算法。又称循环首次适应算法,由首次适应算法演变而成。不同之处是,分配内存时从上次查找结束的位置开始继续查找。
特点:无内部碎片,有外部碎片
非连续分配管理方式
基本分页存储管理方式
基本概念
- 页/页面:进程中的块
- 页框/页帧/内存块/物理页面/物理块:内存中的块
- 页框号/页帧号/内存块号/物理块号/物理页号:每个页框有一个编号,从0开始
- 页表:为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表。由页表项组成的,页表项由页号和物理内存中的块号组成。
ps:页号不占空间。
地址结构
每页大小为4KB;地址空间最多允许2的20次方页
页号=逻辑地址/页面长度(取除法的整数部分)
页内偏移量=逻辑地址 % 页面长度(取除法的余数部分)
基本地址变换机构
地址变换机构的任务是将逻辑地址转换为内存中的物理地址。地址变换是借助于页表实现的。
设页面长度为L
- 计算页号P(P=A/L)、页内偏移量比(W=A%L)
- 比较页号P和页表长度M,若P>M,则产生越界中断,否则继续执行。
- 页表中页号P对应的页表项地址=页表始址F+页号P*页表项长度,取出该页表项肉容b,即为物理块号。页表长度的值是指一共有多少页,页表项长度是指页地址占多大的存储空间。
- 计算E=b*L+W,用得到的物理地址区去访问内存。
具有快表的地址变换机构
快表,又称联想奇存器(TLB),是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项,以加速地址变换的过程。快表命中,只需一次访存,快表末命中,需要两次访存。
两级页表
二级页表实际上是在原有页表结构上再加上一层页表
基本分段存储管理方式
分段
其逻辑地址由段号S与段内偏移量W两部分组成。
- 段号的位数决定了每个进程最多可以分几个段
- 段内地址拉数决定了每个段的最大长度是多少
段表
每个段表项对应进程的一段,段表项记录该段在内存中的始址和长度。
地址变换机构
在系统中设置了段表寄存器,用于存放段表始址下和段表长度川。
从逻辑地址A到物理地址E之间的地址变换过程如下
- 从逻辑地址A 中取出前几位为段号 S,后几位为段内偏移量W
- 比较段号S和段表长度M,若S>M,则产生越界中断,否则继续执行。
- 段表中段号S对应的段表项地址=段表始址下+ 段号S*段表项长度,取出该段表项的前儿位得到段长C。若段内偏移量 ≥C,则产生越界中断,否则继续执行。
- 取出段表项中该段的始址b,计算E=b+W,用得到的物理地址五 去访问内存。
分段和分页的对比
不同点
- 分页对用户不可见,分段对用户可见
- 分页的地址空间是一维的,分段的地址空间是二维的
相同点
访问一个逻辑地址都需要两次访存
ps:若分页引入快表则仅需一次访存
段页式管理
将分页存储管理方式和分段存储管理方式
逻辑地址结构
地址变换机构
ps:每个进程一张段表,每个段一张页表
虚拟内存管理
概念
虚拟内存:在操作系统的管理下,在用户看来似乎由一个比实际内存大得多得内存
特征
- 多次性。多次性是指无须在作业运行时一次性地全部装入内存,而允许被分成多次调入内存运行。
- 对换性。对换性是指无须在作业运行时一直常驻内存,而允许在作业的运行过程中,进行换进和换出。
- 虚拟性。虚拟性是指从逻辑上扩充内存的容量,使用户所看到的内存容量远大于实际的内存容量。
虛拟内存技术的实现
(1)请求分页存储管理方式
请求分页存储管理建立在基本分页存储管理基础之上,为了支持虛拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虛拟存储器的方法。
页表机制
请求分页中的页表项
状态位P。用于指示该页是否已调入内存,供程序访问时参考。
访问字段A。用于记录本页在一段时问内被访问的次数,或记录本页最近已有多长时间末被访间,供置换算法换出页面时参考。
修改位M。标识该页在调入内存后是否被修改过。
外存地址。用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考。
缺页中断机构
在请求分页系统中,每当要访问的页面不在内存时,便产生一个缺页中断(内中断),然后由操作系统的缺页中断处理程序处理中断。此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。
- 若内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项。
- 若内存中无空闲块,则由页面置换算法选择一个页面淘汰,若该页面在内存期间被修改过,则要将其写回外存。未修改过的页面不用写回外存。
地址变换机构
(2)请求分段存储管理方式
(3)请求段页式存储管理方式
页面置换算法
(1)最佳(OPT)置换算法
算法思想:选择以后永不使用的页面淘汰或者在最长时间内不再被访问的页面,以保证获得最低的缺页率
(2) 先进先出 (FIFO)页面置换算法
算法思想:优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面。
Belady 异常:当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。
只有FIFO 算法会产生Belady 异常。
(3)最近最久末使用(LRU)置换算法
算法思想:选择最近最久时间末访问过的页面予以淘汰。
(4)时钟(CLOCK) 置换算法/最近未用(NRU)算法
算法要循环扫描缓冲区,像时钟的指针一样转动
简单CLOCK 算法实现方法
- 第一轮将访问过的标志位置为0;
- 第二轮将标志位为0的页面置换出
改进型CLOCK算法
利用(访问位,修改位)的形式表示各页面状态。
- 第一轮:从当前位置开始扫描到第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位
- 第二轮:若第一轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换。本轮将所有扫描过的帧访问位设为0
- 第三轮:若第二轮扫描失败,则重新扫描,查找第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位
- 第四轮:若第三轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换
详细过程讲解请观看“王道考研-操作系统”:3.2_3_页面置换算法_哔哩哔哩_bilibili
页面分配
驻留集
指请求分页存储管理中给进程分配的物理块的集合。
内存分配策略
- 固定分配:操作系统为每个进程分配一组固定数目的物理块,在进程运行期问不再改变。即驻留集大小不变
- 可变分配:先为每个进程分配一定数目的物理块,在进程运行期问,可根据情况做适当的增加或减少。即驻留集大小可变
- 局部置换:发生缺页时只能选进程自己的物理块进行置换。
- 全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程。
- 固定分配局部置换:进程运行前就分配一定数量物理块,缺页时只能换出进程自己的某一页
- 可变分配局部置换:频繁缺页的进程,多分配一些物理块;缺页率很低的进程,回收一些物理块。直到缺页率合适
- 可变分配全局置换:只要缺页就分配新物理块,可能来自空闲物理块,也可能需换出别的进程页面
何时调页
- 预调页策略:一般用于进程运行前
- 请求调页策略:进程运行时,发现缺页再调页
何处掉页
- 对换区——采用连续存储方式,速度更快;文件区——采用离散存储方式,速度更慢。
- 对换区足够大:运行将数据从文件区复制到对换区,之后所有的页面调入、调出都是在内存与对换区之间进行
- 对换区不够大:不会修改的数据每次都从文件区调入;会修改的数据调出到对换区,需要时再从对换区调入
- UNIX方式:第一次使用的页面都从文件区调入;调出的页面都写回对换区,再次使用时从对换区调入
抖动(颠簸)现象
页面频繁换入换出的现象。主要原因是分配给进程的物理块不够
工作集
在某段时间间隔里,进程实际访问页面的集合。驻留集大小一般不能小于工作集大小
内存映射文件
特性
- 进程可使用系统调用,请求操作系统将文件映射到进程的虚拟地址空间
- 以访问内存的方式读写文件
- 进程关闭文件时,操作系统负责将文件数据写回磁盘,并解除内存映射
- 多个进程可以映射同一个文件,方便共享
优点
- 程序员编程更简单,已建立映射的文件,只需按访问内存的方式读写即可
- 文件数据的读入/写出完全由操作系统负责,I/O效率可以由操作系统负责优化