存储管理基础 页式内存管理 段式内存管理 虚拟存储管理 存储管理实例
(1)单道程序的内存管理 单道程序内存固定,因此可以将程序永远加载到一个地址,不需要考虑很多。 缺点:比物理内存大的程序无法加载,因而无法运行。 造成资源浪费(小程序会造成空间浪费;I/O时间长会造成计算资源浪费)。 (2)多道程序的内存管理 空间的分配:分区式分配 方法: 固定(静态)式分区分配,程序适应分区。 可变(动态)式分区分配,分区适应程序。
优点:易于实现,开销小。 缺点:内碎片造成浪费,分区总数固定,限制 了并发执行的程序数目。 采用的数据结构:分区表--记录分区的大小 和使用情况 内碎片:已经固定分区,分区内部未充分使用而导致浪费。
分区的边界可以移动,即分区的大小可变。 优点:没有内碎片。 缺点:有外碎片。 位图表示法:给每个分配单元赋予一个字位,用来记录该分配单元是否闲置。例如,字位取值为0表示单元闲置,取值为1则表示已被占用,这种表示方法就是位图表示法。 特点: 空间成本固定:不依赖于内存中的程序数量。 时间成本低:操作简单,直接修改其位图值即可。 没有容错能力:如果一个分配单元为1,不能肯定应该为1还是因错误变成1。
链表表示法:将分配单元按照是否闲置链接起来,这种方法称为链表表示法。如上图所示的的位图所表示的内存分配状态,使用链表来表示的话则会如下图所示 特点: 空间成本:取决于程序的数量。 时间成本:链表扫描通常速度较慢,还要进行链表项的插入、删除和修改。 有一定容错能力:因为链表有被占空间和闲置空间的表项,可以相互验证。
内存回收规则
上面已经介绍了内存分区分配的不同模式,下面介绍具体如何为一个程序分配分区以满足其运行需求。
具体样例见PPT113页 算法特点 首次适应:优先利用内存低地址部分的空闲分区。但由于低地址部分不断被划分,留下许多难以利用的很小的空闲分区(碎片或零头) ,而每次查找又都是从低地址部分开始,增加了查找可用空闲分区的开销。
下次适应:使存储空间的利用更加均衡,不致使小的空闲区集中在存储区的一端,但这会导致缺乏大的空闲分区。
最佳适应:若存在与作业大小一致的空闲分区,则它必然被选中,若不存在与作业大小一致的空闲分区,则只划分比作业稍大的空闲分区,从而保留了大的空闲分区。最佳适应算法往往使剩下的空闲区非常小,从而在存储器中留下许多难以利用的小空闲区(碎片) 。
最坏适应算法的特点:总是挑选满足作业要求的最大的分区分配给作业。这样使分给作业后剩下的空闲分区也较大,可装下其它作业。由于最大的空闲分区总是因首先分配而划分,当有大作业到来时,其存储空间的申请往往会得不到满足。
经过上述分析我们可以看到,基于顺序搜索的动态分区分配算法一般只是适合于较小的系统,如果系统的分区很多,空闲分区表(链)可能很大(很长) ,检索速度会比较慢。为了提高搜索空闲分区的速度,大中型系统采用了基于索引搜索的动态分区分配算法。
1、快速分配算法 2、伙伴系统(Linux常用) 伙伴系统特点
内存中无法被利用的存储空间称为碎片。 内部碎片: 指分配给作业的存储空间中未被利用的部分,如固定分区中存在的碎片。 单一连续区存储管理、固定分区存储管理等都会出现内部碎片。 内部碎片无法被整理,但作业完成后会得到释放。它们其实已经被分配出去了,只是没有被利用。
外部碎片: 指系统中无法利用的小的空闲分区。如分区与分区之间存在的碎片。这些不连续的区间就是外部碎片。动态分区管理会产生外部碎片。 外部碎片才是造成内存系统性能下降的主要原因。外部碎片可以被整理后清除。 消除外部碎片的方法:紧凑技术。
紧凑技术(Compaction) 通过移动作业从把多个分散的小分区拼接成一个大分区的方法称为紧凑(拼接或紧缩) 。 目标:消除外部碎片,使本来分散的多个小空闲分区连成一个大的空闲区。 紧凑时机:找不到足够大的空闲分区且总空闲分区容量可以满足作业要求时。 实现基础:动态重定位 动态重定位:作业在内存中的位置发生了变化,这就必须对其地址加以修改或变换。
问题描述:大作业可能会在运行过程中内存进行动态扩展,使得无法一开始就分配好内存。 解决方案:覆盖(早期OS)和交换(现代OS)
交换:广义的说,所谓交换就是把暂时不用的某个(或某些)程序及其数据的部分或全部从主存移到辅存中去,以便腾出必要的存储空间;接着把指定程序或数据从辅存读到相应的主存中,并将控制转给它,让其在系统上运行。 优点:增加并发运行的程序数目,并且给用户提供适当的响应时间;编写程序时不影响程序结构 缺点:对换入和换出的控制增加处理机开销;程序整个地址空间都进行传送,没有考虑执行过程中地址访问的统计特性。
基本概念:程序、进程和作业 进程是资源分配的单位
页式存储管理的基本概念 页:在分页存储管理系统中,把每个作业的地址空间分成一些大小相等的片,称之为页面(Page)或页,各页从0开始编号。 存储块:在分页存储管理系统中,把主存的存储空间也分成与页面相同大小的片,这些片称为存储块,或称为页框(Frame),同样从0开始编号。 页表:为了便于在内存找到进程的每个页面所对应块,分页系统中为每个进程配置一张页表,进程逻辑地址空间中的每一页,在页表中都对应有一个页表项
逻辑地址: 把相对地址分为页号和页内地址两部分。 页表定位:页表始址 + 页号 × 页表项长度。 查询页表:读出块号。 物理地址:块号 + 块内地址。 (块内地址 = 页内地址)
一级页表的问题:若逻辑地址空间很大 (2^32 2^64 ) ,则划分的页比较多,页表就很大,占用的存储空间大(要求连续) ,实现较困难。
解决方案:动态调入
多级页表 多级页表结构中,指令所给出的地址除偏移地址之外的各部分全是各级页表的页表号或页号,而各级页表中记录的全是物理页号,指向下级页表或真正的被访问页。为了进一步提高效率引入快表
TLB的部分特性 有的TLB在每个TLB条目中还保存地址空间标识码(address-space identifier,ASID)。ASID可用来唯一标识进程,并为进程提供地址空间保护。当TLB试图解析虚拟页号时,它确保当前运行进程的ASID与虚拟页相关的ASID相匹配。如果不匹配,那么就作为TLB失效。
除了提供地址空间保护外,ASID允许TLB同时包含多个进程的条目。如果TLB不支持独立的ASID,每次选择一个页表时(例如,上下文切换时),TLB就必须被冲刷(flushed)或删除,以确保下一个进程不会使用错误的地址转换。
常用哈希页表处理长度超过32位的地址空间 常使用反置页表避免空间浪费的问题(反置页表的大小只与物理内存的大小相关) 反置页表不是依据进程的逻辑页号来组织,而是依据该进程在内存中的物理页面号来组织(即:按物理页面号排列),其表项的内容是逻辑页号 P 及隶属进程标志符 pid 。 采用反置页表很难共享内存
各进程把需要共享的数据/程序的相应页指向相同物理块。 页的保护 页式存储管理系统提供了两种方式: • 地址越界保护 • 在页表中设置保护位(定义操作权限:只读,读写,执行等)
共享带来的问题 若共享数据与不共享数据划在同一块中,则: 有些不共享的数据也被共享,不易保密。 实现数据共享的最好方法:分段存储管理。
意义 方便编程: • 通常一个作业是由多个程序段和数据段组成的,用户一般按逻辑关系对作业分段,并能根据名字来访问程序段和数据段。
信息共享: • 共享是以信息的逻辑单位为基础的。页是存储信息的物理单位,段却是信息的逻辑单位。 • 页式管理中地址空间是一维的,主程序,子程序都顺序排列,共享公用子程序比较困难,一个共享过程可能需要几十个页面。 信息保护 动态增长 动态链接
分页的作业的地址空间是单一的线性地址空间,分段作业的地址空间是二维的。 “页”是信息的“物理”单位,大小固定。 “段”是信息的逻辑单位,即它是一组有意义的信息,其长度不定。
基本思想:用分段方法来分配和管理虚拟存储器,而用分页方法来分配和管理实存储器。
结合二者思想产生段页式管理 段页式存储管理是分段和分页原理的结合,即先将用户程序分成若干个段(段式) ,并为每一个段赋一个段名,再把每个段分成若干个页(页式) 。 其地址结构由段号、段内页号、及页内位移三部分所组成每个进程一张段表,每个段一张页表。 段表含段号、页表始址和页表长度。页表含页号和块号。
运行流程
时间局部性,即一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内;
空间局部性,即当前指令和邻近的几条指令,当前访问的数据和邻近的数据都集中在一个较小区域内。
实际电脑硬件结构说明 主存不等于磁盘 现代计算机时冯.诺伊曼体系的计算机,该体系的计算机以内存为中心; 计算机的内存条属于内部存储器,所有的程序运行之前必须加载到内存; 计算机的硬盘属于外部存储器,外部存储器为计算机提供持久存储(内存的信息停电后就没有,硬盘停电还有); 电脑自带的C盘、D盘、E盘、F盘属于硬盘上的逻辑分区。 因此电脑自带的C盘、D盘、E盘、F盘属于外部存储器。 请求式分页系统的页表
当物理内存已满,而新的页面(位于Swap区或磁盘上其它文件中)又必须调入时,必须选择适当的页面(Victim Page)换出。如何选择?——答案很简单,将造成系统运行损失最小(代价最小)的页面换出。
页面置换策略 1、最优置换(Optimal):从主存中移出永远不再需要的页面,如无这样的页面存在,则应选择最长时间不需要访问的页面。 它会将内存中的页 P 置换掉,页 P 满足:从现在开始到未来某刻再次需要页 P,这段时间最长。也就是 OPT 算法会 置换掉未来最久不被使用的页 。 需要先验知识,实际中很难用到,通常用来估算判断其他算法的性能。
2、先进先出算法(First-in, First-out):总选择作业中在主存驻留时间最长的一页淘汰。 存在有趣的belady现象:内存分配的页增加,缺页率反而增加。 其有两种改进算法 (1) Second Chance (2)Clock 如此可以避免大量挪动数据
3、最近最久不用的页面置换算法(LeastRecently Used Replacement):当需要置换一页面时,选择在最近一段时间内最久不用的页面予以淘汰。 PPT276页,此处需要关注具体实现流程
写时复制提升效率,避免fork时大量复制同样的页面造成浪费