存储器----内存管理
存储器的多层结构
虚拟存储器的定义和特征?
虚拟存储器的定义:指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。
虚拟存储器有以下三个主要特征:
1) 多次性,是指无需在作业运行时一次性地全部装入内存,而是运行被分成多次调入内存运行。
2) 对换性,是指无需在作业运行时一直常驻内插,而是运行在作业的运行过程中,进行换进和换出。
3) 虚拟性,是指从逻辑上扩充内存的容量,使用户所看到的内插容量,远大于实际的内存容量。
存储器管理有哪几种方式,具体如何实现。
存储管理分为两大类:实存管理和虚存管理。
实存管理中分出:连续分配和离散分配
连续分配方式:程序代码中代码或者数据的逻辑地址相邻,体现在内存分配时物理地址的相邻
- 单一连续分配(只有一道程序);
- 固定分区分配(最早的,最简单的可以运行多道程序的分区管理存储方式;
- 动态分区分配(根据内存的实际需要,动态地为之分配空间,顺序搜索的动态分区算法和基于索引搜索的动态分区算法)
- 连续分配的特点会引起内存空间的碎片,所以采用紧凑技术,动态重定来解决紧凑产生的问题(动态重定位利用重定位寄存器实现)
离散分配方式:
- 分页存储管理方式:将用户地址空间分为若干个固定大小的区域,将内存空间分为若干物理块,页和块的大小相同。
- 分段存储管理方式:为了满足用户要求而形成的一种存储管理方式。他把用户程序的地址空间分为若干个大小不同的段,每段可定义一组相对完整的信息。
- 段页式:结合了分页和分段的有点,目前比较广泛的一种存储管理方式
连续性内存分配
基于顺序搜索的动态分区分配算法
- 首次适应算法
- 空闲分区按地址递增
- 导致高地址的利用率低
- 最佳适应算法
- 空闲分区按容量递增--算法开销大,回收后可能需要重新排序
- 解决了大部分分区被空闲的问题,但是产生了很多无法利用的小分片碎片
- 最坏适应算法
- 空闲分区按容量递减--算法开销大,回收后可能需要重新排序
- 解决了小碎片的问题,但是导致大分区先被分配,不利于后面大进程的分配
- 邻近适应算法空闲分区
- 按地址递增
- 是首次适应算法的升级,每次从上次查找结束的位置开始查找,解决了高地址利用率低的问题
基于索引搜索的动态分区分配算法
快速适应算法
伙伴系统
哈希算法
回收内存--动态分区分配
在动态分区分配方案中,某一作业完成后,系统收回其主存空间,并与相邻空闲区合并,为此需要修改空闲区表,造成空闲区数减1的情况是()
上临下临空闲区
- 有上有下
- 空闲分区-1
- 修改长度=上临空闲区+收回空闲区+下临空闲区,将下临的标志位改为空
- 有上无下
- 空闲分区不变
- 只修改,长度=上临空闲区+收回空闲区
- 无上有下
- 空闲分区不变
- 修改下临空闲区记录地址为收回空闲区地址,长度=收回空闲区+下临空闲区
- 无上无下
- 空闲分区+1
- 找一个标志位为空的记录,记下地址和长度,改标志位为未分配,表明该登记栏中指示了一个空闲区
动态重定向
什么叫地址重定位?动态地址重定位的特点是什么?
答:重定位是指作业装入与其逻辑地址空间不同的物理空间所引起的地址变换过程。
静态重定向
- 在程序执行前,进行重定向
- 不可改变
- 内存地址必须连续
动态重定向
- 程序执行过程中重定向
- 但是可以改变
- 需要硬件一定位数的寄存器
- 有利于解决碎片问题
- 内存地址可以不连续
动态地址重定位的特点是:(1)由硬件实现;(2)在程序运行过程中进行地址变换
非连续性内存分配
逻辑地址转物理地址
BDQH
2,10,8,16
当逻辑地址为十六进制0X,八进制0,二进制B,十进制D等
- 转换为二进制
- 根据单表大小确认页号和页内偏移量(逻辑地址与物理地址的页偏移量相同)
- 查询页表中,页号对应的帧号,都转化为二进制格式,帧号+页偏移量=物理地址
当逻辑地址为十进制D
- 逻辑地址的页号=逻辑地址/页面大小,页内偏移量=逻辑地址%页面大小
- 根据单表大小确认页号和页内偏移量(逻辑地址与物理地址的页偏移量相同)
- 查询页表中,页号对应的帧号,帧号*页面大小+页偏移量=物理地址
段表
一个进程一个段表,每个段号有一个页表
逻辑地址(段号,页偏移量)
步骤
- 先根据段号找到页表,
- 然后比较页偏移量和长度,如果大于长度,发生段越界,产生越界中断。
- 如果小于长度,则物理地址=基质+页偏移量
页表-分页
分页/虚拟内存能有助“大大地”降低整体及额外非必要的 I/O 次数,提高系统整体运作性能。
分页就是把整个虚拟和物理内存切成一段段固定大小的空间,连续且尺寸固定的内存空间叫页,Linux下每一页大小4KB。
虚拟内存和物理内存之间通过页表来映射;虚拟地址分为:页号和页内偏移。
在分页管理中,"页"和"块"是一样大小的,这样才知道物理存储器是32KB。
参数:
单页大小,页表,逻辑地址
问题:
- 逻辑地址转物理地址
- 如果页号不在页表内,发送缺页中断,请求系统调页
段页
什么是快表,在地址变换中有何作用?
结构=页号+页框号+有效位
页表实现了,从页号到物理块号的映射,PCB中存放着页表长度和首地址
地址变换机构:为了能将用户地址空间中的逻辑地址转换为内存空间中的物理地址
快表:快表示在地址变换机构中增设的一个具有并行查询能力的特殊高速缓冲寄存器。
作用:可以提高地址变换的速度(不用访问内存,提高速度)
分页存储和分段存储有什么区别
1.分页式系统管理的需要,对用户不可见,段是逻辑单位,包含一完整意义的信息,可以满足用户需要
2.页的大小固定,由硬件决定,段的大小不固定,由编程决定
3.分页的用户地址空间是一维,是系统行为,分段的用户地址空间是二维,程序员在标志一个地址时,既需要给出段名,又要给段内地址
4.分段更容易共享
页面置换算法
页面置换次数:就是置换物理块页面的次数
缺页次数:插入新页面次数+页面置换
置换:
首先会有物理块个数,是最大能存页面的个数,当无法再次存放页面的时候,需要置换出一个页面,根据不同算法置换不同的页面,来实现不断更新物理块,缺页率
最佳置换算法OPT
查看物理块内每个页面最近的调用步骤,选择最远那个置换
思路
该置换算法就是不断更新物理块内存放的页面,
先进先出置换算法FIFO
最久未使用
比较谁先存放的,先置换掉该页面
队列的实现,物理块就是队列的大小
LRU置换算法
最近最久未使用
Clock置换算法
优缺点分析
OPT是向后看,根据后面的实际使用情况来置换,
LRU是向前看,是根据以前的使用情况来置换,相比较,LUR有预测的可能,ORT更准确,但是OPT很难实现
FIFO是置换最先进入内容的,没有参考意义,无法确定该页面使用情况
缺页率
影响因素
- 该进程分配的物理块
- 页面大小,越大缺页率越低
频繁缺页影响--抖动
由于分配的物理块达不到该进程所需最小的物理块个数,导致频繁的页面置换,频繁的缺页中断,导致系统的实际效率很低,这种现象成为抖动
抖动现象发生在FIFO页面置换算法中,FIFO并不是一个好的置换算法。