内存管理
1.概述
1.1基础部分
1.计算机按字节编址,即每个存储单元为1字节;按字编址,每个存储单元大小为1个字;
指令的工作原理:基于地址,每个地址对应一个数据的存储单元
2.装入的三种方式:
(1).绝对装入:在编译时,就写入地址(单道操作系统)
(2).可重定位装入:又称静态重定位。作业在装入的内存时,必须分配其要求的全部内存空间,程序运行期间不可移动
(3).动态运行时装入:又称动态重定位。把地址转换推迟到程序真正要执行时才进行。这种方式必须要一个重定位寄存器的支持,可以移动进程在内存的位置
3.三种链接方式:
(1).静态链接
(2).装入时动态链接
(3).运行时动态链接
4.内存管理:
(1).操作系统负责内存空间的分配与回收
(2).需要提供某种技术从逻辑上对内存空间进行扩充(实现虚拟性)
(3).负责程序的逻辑地址与物理地址的转换
(4).内存保护(设置上、下限地址寄存器;采用重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器))
5.覆盖&交换:解决程序大小超过物理内存总和的问题;
覆盖技术(同一个进程中):内存分为一个“固定区”和若干个“覆盖区”;缺点:对用户不透明,增加用户编程负担
交换技术(不同进程/作业中):当内存空间紧张时,系统将内存中某些进程暂时换出外存。磁盘分为“文件区”和“对换区”
1.2.连续分配管理方式
内部碎片:分配给某个进程的内存区域,而没有用上的部分
外部碎片:内存中某些空闲分区由于太小二难以利用的部分,可采用“紧凑”技术实现
1.2.1连续分配方式
1.单一连续分配:内存被分为系统区和用户区。内存只能有一道用户程序
优点:实现简单,无外部碎片,可采用覆盖技术扩充内存,不一定需要采取内存保护
缺点:只适用于单用户、单任务的操作系统,有内部碎片(内存中没有用上的部分),存储器利用率极低
2.固定分区分配:把整个用户空间分为固定大小的分区,在每个分区只装入一道作业
- 分区大小相等:缺乏灵活性,适用于一台计算机控制多个相同对象的场合
- 分区大小不等:增加灵活性,可以满足大小不同的进程需求
分区说明表:实现各个分区的分配与回收
优点:实现简单,无外部碎片
缺点:用户程序太大,分区可能不满足需求,会降低性能;会产生内部碎片,内存利用率低
3.动态分区分配(可变分区分配):不会预先划分分区,而是在进程装入内存时,根据进程的大小动态的建立分区
常用的数据结构:空闲分区表、空闲分区链
按照动态分区分配算法分配内存空间,回收时(4种情况,相邻分区需要合并)可能会按照内存起始地址连续性回收
无内部碎片,有外部碎片
1.2.2动态分区分配算法
1.首次适应算法:每次从低地址部分开始查找,找到第一个满足大小的空闲分区(优点:综合性能好,算法开销小)
2.最佳适应算法:空闲分区按容量递增次序链接,找到第一个满足的空闲分区(优点:有大分区保留,满足大进程要求;缺点:算法开销大,会留下越来越多的外部碎片)
3.最坏适应算法:优先使用最大的连续空闲区,空闲分区按容量递减次序链接,找到第一个满足的空闲分区(优点:减少了外部碎片的产生;缺点:算法开销大,大进程可能没有分区可用)
4.邻近适应算法:从上次查找结束的位置开始空闲分区链(表),找到满足第一个空闲分区(优点:最佳适应算法优点;缺点:大进程可能没有分区可用)
1.3 非连续分配管理方式
1.3.1 基本分页存储管理
内存空间分为一个大小相等的分区,每个分区就是一个“页框”(页框=页帧=内存块=物理块=物理页面),每个页框有一个编号,即“页框号”,页框号从0开始
将进程的逻辑地址空间分为与页框大小相等的部分,每个部分称为一个“页”或“页面”,页号也从0开始
进程页面与内存页框一一对应,但各个页面不必连续存放,也可以放大不相邻的各个页框中
页表:由“页号”与“块号”,一个进程拥有一个页表
页号->不占用存储空间;块号->计算机内存块号->用多少B表示块号
页表只记录内存块的块号而不是内存块的起始地址,内存块的起始地址=内存块号×内存块大小
页号=逻辑地址/页面长度(取整数部分)
页内偏移量=逻辑地址%页面长度
物理地址=页面始址+页内偏移量
若页面大小为2^nB,用二进制表示逻辑地址,则末尾n位表示业内偏移量,区域部分位页号
1.3.2基本地址转换机构—慢表
两次访存
用于实现逻辑地址到物理地址转换的一组硬件机构
页表寄存器:包含页表始址+页表长度
逻辑地址A到物理地址e的过程
(1).根据逻辑地址计算页号和页内偏移量
(2).根据页号与页表长度M进行合法匹配(P>=M都会越界)
(3).页表地址=页表起始地址F+页号×页表项长度
(4).计算物理地址E=b×L+W(b:内存块号,L:页面大小,W:页内偏移量)
(5).访问物理内存对应单元
1.3.3具有快表的地址转换机构
快表:又称联想寄存器(TLB),是访问速度比内存快的高速缓存(Cache),用来存放最近访问的页表项的副本
一次访存
过程:略
1.3.4 两级页表
1.单级页表存在的问题:
-页表必须连续存放
-页表没必要整个都常驻内存
2.各级页表大小不能超过一个页表,两级页表访存次数(1.访问页目录表-访问二级页表-访问目标内存单元)
3.N级页表访问一个逻辑地址需要N+1次访存
1.4 基本分段存储管理
逻辑地址结构由段号(段名)和段内地址(段内地址)
段号决定每个进程可以分多少个段
段内地址决定每个段最大长度是多少
段映射表:简称段表。由段号、段长、段基质组成。段表项的长度是相同的,段表项为6B。同样段号可以隐藏,不占存储空间
地址变换过程:
(1).根据逻辑地址计算段号和段内偏移量
(2).根据段号与段表寄存器中段表长度M进行合法匹配(P>=M都会越界)
(3).段表地址=段表起始地址F+段号×段表项长度
(4).计算段内地址W与段长是否越界
(5).计算物理地址=基址B+段内地址W
(6).访问物理内存对应单元
分段比分页更容易实现信息的共享与保护
1.4.1段页式管理方式
分页:
优点:内存利用率高,不会产生外部碎片
缺点:不方便按照逻辑结构实现信息的共享和保护
分段:
优点:方便按照逻辑结构实现信息的共享和保护
缺点:会产生外部碎片
段页式管理:进程按照逻辑模块分段,再将各段分页
逻辑地址结构:由段号+页号+页内偏移量
段号位数决定了每个进程最多可以分几个段
页号位数决定每个段最大有多少页
页内偏移量决定页面大小、内存块大小是多少
段表项由段号,页表长度,页表存放块号
地址转换:
(1)根据逻辑地址得到段号,页号,页内偏移量
(2)根据段号与段表寄存器中段表长度M进行合法匹配(P>=M都会越界)
(3)查询段表:段表地址F+S*段表项长度-----第一次访问内存
(4)检查页号是否越界
(5)查询页表,找到块号 -----------第二次访问内存
(6)计算物理地址=基址B+段内地址W
(7)访问目标内存单元--------------第三次访问内存
2.虚拟内存
传统存储方式:一次性(作业必须一次性全部装入内存后才能开始运行);驻留性
局部性原理
-时间局部性:某个数据在被访问过后,不久之后再次被访问
-空间局部性:程序访问某个存储单元,不久之后其附近的存储单元也很有可能被访问
虚拟内存三个特征:
多次性:作业可以多次被调入内存
对换性:允许作业运行过程中,将作业换入换出内存
虚拟性:从逻辑上扩充内存的容量
如何实现虚拟内存技术:需要建立在离散分配(非连续分配存储管理)的内存管理,包括请求分页(段/段页式),通过请求调页(段/段页)、页(段/段页)面置换
2.1请求分页管理方式
1.页表机制:
新增状态位(是否已调入内存)、访问字段(记录最近被访问过几次)、修改位(页面调入内存后是否被修改过)、外存地址
缺页中断机构:在请求分页系统中,当访问页面不在内存时,产生一个缺页中断,然后操作系统处理中断
缺页中断属于“内中断”,一条指令执行期间可能引起多次缺页中断
地址变换机构:类比于基本分页管理
2.2页面置换算法
1.最佳置换算法(OPT)-----无法实现的
为了追求最低缺页率,每次淘汰以后永久不访问或在最长时间内不再被访问的页面
缺页中断时未必发生页面置换,缺页率=缺页此处/访问页面次数
2.先进先出算法(FIFO)
选择淘汰的页面是最早进入内存的页面。
Belady异常:当为进程物理块增大时,缺页次数不减反增的现象
3.最近最久未使用算法(LRU)—实现困难,开销大,性能好
选择淘汰最近最久为使用的页面,在访问字段中选择淘汰最大值的序列
4.时钟置换算法(CLOCK)
又称CLOCK算法,或最近未用算法(NRU),将每个页面设置访问位,通过指针链接成一个循环队列,循环检查访问位(淘汰访问位0的,并把扫面过的访问位为1的变更为0)
5.改进型时钟置换算法
增加修改位,修改位为0时表示没有被修改过,为1时表示被修改过
第一轮:扫描第一个(0,0);本轮不会修改任何标志位
第二轮:若第一轮扫描失败,扫描第一个(0,1);本轮将所有扫描过的访问位置为0
第三轮:若第二轮扫描失败,扫描第一个(0,0;)本轮不会修改任何标志位
第四轮:若第三轮扫描失败,扫描第一个(0,1)用于置换
2.3页面分配测量
驻留集:请求分页存储管理中给进程分配的物理块的集合,在采用虚拟存储技术,驻留集小于进程总大小
固定分配:系统为每个进程分配一组固定数目的物理块,进程运行期间不再改变,即驻留集大小不在改变
可变分配:系统为每个进程分配一定的物理块,进程运行期间可以适当增加或减少,即驻留集大小可变
局部置换:发生缺页时,只能选择进程自己的物理块进行置换
全局置换:将系统空闲物理块分配给进程,也可以将别的进程持有的物理块置换到外存再分配给缺页进程
分配方式:
1.固定分配局部置换
2.可变分配全局置换:只要缺页就分配物理块
3.可变分配局部置换:根据缺页频率动态增加和减速物理块
策略:
1.预调页策略:主要用于进程的首次调入。
2.请求调页策略:在运行期间发现缺页才将所缺页面调入
抖动(颠簸)现象:刚刚换出的页面又换入内存,刚刚换入的页面马上换出外存的频繁页面调度行为
工作集:在某段时间间隔内,进程实际访问页面的集合。工作集大小可能小于窗口尺寸,驻留集大小不能小于工作集大小