一、基本概念
1.1.存储管理
- 存储管理主要是指对内存的管理,负责内存分配和回收,内存的保护和扩充
- 存储管理的目的是尽量提高内存的使用效率
1.2.内存的分配方式有两种
- 连续的分配方式
- 离散的分配方式
二、连续的分配方式
2.1.基本概念
- 指为一个用户程序分配一个连续的内存空间
2.2.分配方式分类
- 单一连续分配
- 固定分区分配
- 动态分区分配
- 可重定位分区分配
2.3.动态分区分配
- 为把一个新作业装入内存,需按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业
- 常用的分配算法:
- 首次适应算法
- 循环首次适应算法
- 最佳适应算法
- 最坏适应算法
2.4.可重定位分区分配
- 如果在系统中只有若干个小分区,即使它们的容量总和大于要装入的程序,但由于这些分区不相邻,也无法将程序装入内存
- 解决办法:将内存中的所有作业进行移动,使它们全部邻接,这样把原来分散的小分区拼接成大分区,这种方法称为“拼接”或“紧凑”
- 动态重定位的实现
- 在动态运行时装入的方式,将相对地址转换为物理地址的工作在程序指令真正要执行时才进行。地址转换需要重定位寄存器的支持。程序执行时访问的内存地址时相对地址与重定位寄存器中的地址相加而成
三、对换与覆盖技术
3.1.覆盖技术
- 一个作业的若干程序段或数据段的某些部分共享内存空间
3.2.对换技术
-
把内存中暂时不能运行的进程或暂时不用的程序和数据,调到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程和进程所需要的程序和数据调入内存
-
对换的分类:
- 整体对换(或进程对换):以整个进程为单位
- 页面对换或分段对换:以页或段为单位
四、离散分配方式
4.1.基本概念
- 连续分配方式会形成“碎片”,虽然可以通过“紧凑”解决,但开销大。如果允许将一个进程直接分散地装入许多不相邻地分区中,则无需“紧凑”,由此产生离散分配方式
4.2.分类
- 分页存储管理方式:离散分配的基本单位是页
- 分段存储管理方式:离散分配的基本单位是段
五、基本分页存储管理方式
5.1.页面
- 分页式存储管理的原理:
- 将一个进程的逻辑地址空间分成若干个大小相等的片称为页面或页,并为各页加以编号,从0开始。同时把内存空间分成与页面相同大小的若干个存储块,称为块或页框
- 在为进程分配内存时,以块为单位将进程的若干页分别装入到多个可以不相邻的物理块中。进程的最后一页经常装不满一块而形成“页内碎片”
5.2.地址变换
- 若给定一个逻辑地址空间中的地址为A,页面大小为L,则页号P = INT[A/L],页内地址d = [A] MOD L
5.3.基本分页式存储管理的实现
-
进程的每一页离散地存储在内存地任一存储块中,为方便查找,系统为每一进程建立一张页面映像表,简称页表。页表实现了从页号到物理块号地地址映射
-
为了能将用户地址空间地逻辑地址变换为内存空间地物理地址,在系统中必须设置地址变换机构。地址变换机构实现从逻辑地址到物理地址的转换,由于页内地址与物理地址是一一对应的,因此,地址变换机构的任务是借助于页表,将逻辑地址中的页号转换为内存中的物理块号
5.4.具有块表的地址变换机构
-
由于页表是存放在内存中的,CPU在每存取一个数据时,需要两次访问内存:
- 第一次:访问页表,找到指定页的物理块号,将块号与页内偏移量拼接形成物理地址
- 第二次:从第一次所得地址中获得所需数据,或向此地址中写入数据
-
存储器利用率提高,处理器处理速度降低。
-
解决方法:在地址变换机构中,增设一个具有并行查寻能力的特殊高速缓冲寄存器,称为“联想存储器”或“快表”
六、基本分段式存储管理的实现
6.1.段表
- 为使程序正常运行,须在系统中为每个进程建立一张段映射表,简称“段表”。每个段在表中占有一个表项。
- 段表结构:段号;段在内存中的起始地址(基址);段长
- 段表可以存放在寄存器中,但更多的使存放在内存中
- 段表用于实现从逻辑段到物理内存区的映射
6.2.地址变换机构
- 在系统中设置段表寄存器,用于存放段表始址和段表长度,以实现从进程的逻辑地址到物理地址的转换
- 当段表存放在内存中时,每访问一个数据,都需访问两次内存,降低了计算机的速率
- 解决方法:设置联想寄存器,用于保存最近常用的段表项
6.3.分页和分段的主要区别:
-
相似点:
- 采用离散分配方式,通过地址映射机构实现地址变换
-
不同点:
- 页是信息的物理单位,分页是为了满足系统的需要;段是信息的逻辑单位,含有意义相对完整的信息,是为了满足用户的需要
- 页的大小固定且由系统确定,由系统把逻辑地址分为页号和页内地址,由机器硬件实现;段的长度不固定,取决于用户程序,编译程序对源程序编译时根据信息的性质划分
- 分页的作业地址空间是一维的;分段的作业地址空间是二维的
七、段页式存储管理
7.1.基本原理
-
先把用户程序分为若干段,再把每个段分成若干页,并为每个段赋予一个段名
-
在段页式系统中,为了获得一条指令数据,需访问三次内存
- 第一次:访问内存中的段表,取得页表始址
- 第二次:访问内存中的页表,取得该页所在的物理块号,将块号与页内地址形成物理地址
- 第三次:根据第二次所得的地址,取出指令或数据
-
缺点:访存次数增加两倍
-
解决方法:增设高速缓冲寄存器
八、页面置换算法
8.1.最佳置换算法
- 理想化的算法,其选择的被淘汰页面,将是以后永不再用的,或许式在最长(未来)时间内不再被访问的页面
- 优点:保证获得最低的缺页率
- 缺点:无法预知一个进程在内存的若干个页面,哪个在未来最长时间内不再被访问
- 算法无法实现,但可评价其他算法
8.2.先进先出置换算法
- 算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰
- 算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针(替换指针),使它总是指向最老的页面
- 算法与进程的实际运行规律不相适应,因为进程中的某些页面经常被访问,但先进先出置换算法不能保证这些页面不被淘汰
- Belady现象
- 如果对一个进程未分配它所要求的全部页面,有时会出现分配的页面数增多但缺页率反而提高的异常现象,发生在FIFO(先进先出)置换算法
8.3.最近最久未使用(LRU)置换算法
- 算法根据页面调入内存后的使用情况进行决策,由于无法预测各页面将来的使用情况,只能利用“最近的过去”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰
- 该算法赋予每个页面的一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当需淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰