一、存储管理的功能
1.存储器
功能需求:容量足够大;速度足够快;信息永久保存;多道程序并行
实际存储体系:Cache(小,贵)+内存(适中)+辅存(大,慢,廉)
基本原理:当内存太小时,用辅存支援内存;暂时不运行的模块换出到辅存上,必要时再换入内存
地址重定位(地址重映射):
辅存上的映像换入内存时,需要重新确定放置地点,且把程序中访问的地址更新为新地址;
多道程序并行带来的问题:
共享(代码和数据共享,节省空间);保护(不允许内存中程序相互间非法访问)
2.地址映射:把程序中的地址变成真实的内存地址的过程。
源程序-----逻辑地址-------物理地址
固定地址映射:编程或编译时确定逻辑地址和物理地址的映射关系
特点:程序加载时必须放在指定的内存区域;容易产生地址冲突,运行失败;
静态地址映射:程序装入时由操作系统完成逻辑地址到物理地址的映射
物理地址(MA)=装入地址(BA)+逻辑地址(VA)
特点:程序运行之前确定映射关系;
程序装入后不能移动(若移动,必须放回原来位置);
程序占用连续内存空间
动态地址映射:在程序执行过程中,把逻辑地址换成物理地址
MA=BA+VA(若程序移动,则BA会变化,自动计算新的MA)
特点:程序占用的内存空间可动态变化(要求及时更新基址);
程序不要求使用连续内存空间(每段存放的基址系统都应该知道)
便于多个进程共享代码(共享代码作为独立的一段存放);
硬件改变后不需要重新编译程序;
缺点:硬件支持、硬件时延、软件复杂
3.虚拟存储:
问题:程序过大或过多时,内存不够,不能运行;多个程序并发时地址冲突,不能运行;
基本原理:借助辅存在逻辑上扩充内存,解决内存不足;
把进程当前正在运行的部分装入内存(迁入),把当前不运行的部分暂时存放在辅存(迁出),尽量腾出足够的内存供进程正常运行(辅存存放的部分当需要运行时才临时按需调入内存;进程不运行党的部分往往占大部分)
程序局部性原理:
时间局部性:一条指令或数据,会在较短时间内被重复访问(如,循环语句)
空间局部性:任一内存单元及其邻近单元会在短时间内被集中访问;
短时间内,CPU对内存的访问往往集中在一个较小的区域内(如,表,数组的操作)
程序在一个有限的时间内访问的代码和数据往往集中在有限的地址范围内,因此,一般情况下,把程序的一部分装入内存在较大概率上也足够让其运行;
虚拟存储的定义:编程时不受内存容量和结构限制,认为内存时理想存储器(虚拟存储器)
特点:线性地址;封闭空间;容量足够大(2^32BYTE);虚拟地址和虚拟地址空间
工作原理:运行时把虚拟地址转化为物理地址(地址映射功能);
不同程序中同一虚拟地址转化为不同的物理地址;
内存管理单元:MMU
作用:实现虚拟地址和物理地址的分离
前提:足够的辅存;适当容量的内存;地址变换机构
应用:页式虚拟存储、段式虚拟存储
4.内存分配:为程序运行分配足够的内存空间
放置策略:程序调入时将其放在哪个(些)内存区
调入策略:什么时候把要运行的代码和要访问的数据调入内存
淘汰策略:内存不够时,迁出哪些代码或数据以腾出足够内存空间
5.存储保护功能:保证在内存中多道程序只能在给定的存储区域内活动并互不干扰
防止访问越界、防止访问越权
方法:界址寄存器
在CPU中设置一对下限寄存器和上限寄存器存放程序在内存中的上限和下限地址;
程序访问内存时硬件自动将目的地址和上下限寄存器中的地址界限比较,判断是否越界;
基址寄存器和限长寄存器
二、物理内存管理
1.单一区存储管理(不分区存储管理):用户区不分区,完全被一个程序占用
优点:简单,不需要复杂硬件支持,适于单用户任务OS
缺点:程序运行时占用整个内存,即使小程序也是如此。内存浪费,利用率低
2.分区存储管理:把用户区内存划分为若干大小不等的分区,供不同程序使用
最简单的存储管理,适于单用户单任务系统
分类:固定分区:把内存固定地分为若干大小不等的分区供各个程序使用。每个分区大小和位置固定,系统运行期间不再重新划分。
分区表:记录分区位置、大小和使用标志
使用特点:在程序装入前,内存已被分区,不在改变;
每个分区大小可能不同,以适应不同大小的程序;
系统维护分区表,说明分区大小、地址和使用标志
具有固定任务数的多道程序系统;
性能:当程序比所在分区小时,浪费内存;
当一个程序比最大分区大时,无法装入运行;
建议措施:根据分区表安排程序的装入顺序,使得每个程序都能找到合适的分区运行;
当程序大小、个数、装入顺序等都固定时,内存使用效率很高。
动态分区:在程序装入时创建分区,使分区大小刚好与程序大小相等。解决固定分区浪费内存和大程序不能运行的问题。
特点:分区的个数和大小均可变动;
存在内存碎片
3.分区的分配
( 空闲区表:描述内存空闲区的位置和大小的数据结构 )
功能:在所有空闲区找一个,分配个用户使用(基本要求:空闲区大小满足用户要求)
过程:(假定用户要求的空间大小为SIZE)
从空闲区表中的第一个区开始,寻找>=SIZE的空闲区;
找到后从分区中分割出大小为SIZE的部分分配给用户使用;
分割后的剩余部分作为空闲区仍然登记在空闲区表中。
(一般从底部分割)
4.分区的选择——放置策略:选择空闲分区的策略
空闲区表的排序原则:按空闲位置(首地址)递增或递减排序
按空闲区大小递增或递减排序
首次适应算法(首次匹配):空闲区表按首地址递增排序
从空闲区表的第一个分区开始查找,直到找到第一个满足用户要求的分区为止;
优点:尽可能得先利用低地址空间,保证高地址空间有较大空闲区,当大程序需要较大分区时,满足的可能性较大;
最佳适应算法(最佳匹配):空闲区按大小递增排序
从空闲区表的第一个分区开始查找,直到找到第一个满足用户需求的分区为止
优点:选中分区使满足要求的最小分区,尽量保留较大空闲分区,当大程序需要较大分区时,满足的可能性较大; 缺点:容易出现内存碎片
最坏适应算法(最坏匹配):空闲区表按大小递减排序
从空闲区表的第一个分区开始查找,直到找到第一个满足用户要求的分区为止;
优点:最大分区分割后剩下部分还可能相当大,还能装下较大程序
缺点:仅做一次查找就可以找到索要分区
4.分区的回收
功能:回收程序结束后所释放的分区(释放区),将其适当处理后登记到空闲区表中,以便再分配
回收算法:若释放区与空闲区不相邻,则把释放区直接插入空闲区表;
若相邻,则把释放区与相邻空闲区合并后作为新的更大的空闲区插入到空闲区表
5.碎片问题:
规定门限值:分割空闲区时,若剩余部分小于门限值,则此空闲区不进行分割,而是全部分配给用户;
内存拼接技术:定期清理存储空间,将所有空闲区集中到一起 (存储器紧缩技术)
拼接的时机:分区回收的时候(拼接频率过大,系统开销大)
系统找不到足够分区的时候(空闲分区的管理复杂)
拼接技术的缺点:消耗系统资源、离线拼接、重新定义作业
把程序分成几个部分装入不同的分区中,化整为零,以便充分利用小的碎片;
6.覆盖:
目的:在较小的内存空间中运行较大的程序
内存分区:常驻区:被某段单独占用的区域,可划分多个;
覆盖区:能被多段重复共用的区域,可划分多个;
工作原理:程序分为若干断代码段和数据段
将程序常用的段装入常驻区的内存;(核心段)
目前正运行的段处于覆盖区中;
将目前不用的段或用过的段放在硬盘的特殊区域中(覆盖文件);
临时将要用的段从硬盘装入覆盖区的内存(覆盖不在用的内容);
意义盖区,减少程序对内存的需求
缺点:编程复杂,程序员划分程序模块并确定覆盖关系;
程序执行时间长:从外存装入内存耗时;
7.对换技术:(UNIX、LINUX、Windows3.1)
原理:当内存不够时,把进程写到磁盘上(换出),以便腾出空内存。当进程要运行时,再将其重新写入内存(换入)
优点:增加进程并发数;不考虑程序结构
缺点:换入和换出增加CPU开销;对换单位太大
需要考虑的问题:程序换入时的地址重定位;
减少对换传送的信息量;
外存对换空间的管理方法
三、虚拟内存的管理
1.虚拟内存:面向用户的虚拟封闭空间
线性地址空间; 容量4G=2^32BYTE; 封闭空间(进程空间);
和物理地址分离(地址无冲突); 程序员编程时使用线性虚拟地址
2.虚拟内存管理的目标:
使得大的程序能在较小的内存中运行; 使得多个程序能在较小的内存中运行(能容纳下);
使得多个程序并发运行时地址不发生冲突(方便,高效);使得内存利用率高,无碎片,共享方便;
3.程序运行的局部性:
程序在一个有限的时间段内放文件的代码和数据往往集中在有限的地址范围内;
把程序的一部分装入内存在较大概率上也足够让其运行一小段时间;
4.虚拟内存原理/技术的用途
应用层程序:编写一些较底层或有特殊功能的应用程序时,往往需要使用虚拟内存相关技术;
木马和病毒会使用虚拟内存技术进行代码注入;
内核层程序:优化或裁减OS内核(尤其是开源嵌入式OS)
内存管理优化;实时性优化
5.典型虚拟内存管理方式
页式虚拟存储管理;段式虚拟存储管理;段页式虚拟存储管理