文章目录
- 存储器的层次结构
- 存储器的指标
- 多层结构的存储器系统
- 主存储器与寄存器
- 高速缓存和磁盘缓存
- 程序的装入和链接
- 对用户程序的处理步骤
- 程序的装入
- 程序的链接
- 连续分配的存储管理方式
- 单一连续分配
- 固定分区分配
- 动态分区分配
- 基于顺序搜索的动态分区分配算法
- 基于索引搜索的动态分区分配算法
- 动态课重定位分区分配
- 对换
- 对换的类型
- 对换空间的管理
- 进程的换出与换入
- 分页存储管理方式
- 分页存储管理的基本方法
- 地址变换机构
- 访问内存的有效时间
- 反置页表
- 基本分段存储管理
- 分段存储管理方式的引入
- 分段系统的基本原理
- 信息共享
- 段页式存储管理方式
存储器的管理主要对象是内存,外存的管理由文件管理负责
存储器的层次结构
存储器的指标
速度、容量、价格
多层结构的存储器系统
对于通用计算机而言,存储层次至少应具有三级(从高到低):CPU寄存器、主存、辅存
寄存器和主存储器又被称为可执行存储器,cpu访问快
对辅存的访问则需要通过I/O设备
主存储器与寄存器
- 主存储器简称内存或主存,用于保存进程运行时的程序和数据
- 寄存器具有与处理机相同的速度,故对寄存器的访问速度最快,存放处理机运行时的数据
高速缓存和磁盘缓存
- 高速缓存(cache):介于寄存器和存储器之间,主要用于备份主存中的较常用数据,以减少处理机对主存的访问次数
- 磁盘缓存:作用类似于cache,是主存中的部分存储空间
程序的装入和链接
对用户程序的处理步骤
- 编译:由编译程序对用户源程序进行编译成目标模块obj文件
- 链接:由链接程序将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成完整的装入模块
- 装入:由装入程序装入内存
程序的装入
-
绝对装入:用户程序编译后,将产生绝对地址(即物理地址)的目标代码
应用:操作系统程序、一些特权程序,只适用于单道程序环境
-
可重定位装入:绝对地址 = 逻辑地址 + 程序起始地址
地址变换通常在进程装入时一次完成,以后不再改变,故称静态重定位
-
动态运行时的装入方式:模块装入内存后,并不立即将逻辑地址转换成物理地址,而是在程序真正执行时才进行。
程序的链接
根据链接的时间不同分为以下三种:
-
静态链接方式:程序运行前,先将各目标模块及它们所需库函数链接成一个完整的装配模块,以后不再拆开
需要解决:对相对地址进行修改、变换外部调用符号
-
装入时动态链接:装入内存时,边装入边链接
特点:便于修改和更新、便于实现对目标模块的共享
-
运行时动态链接:程序执行时装入
加快程序装入过程,节省大量内存空间
连续分配的存储管理方式
为用户程序分配一个连续的内存空间,即程序中代码或数据的逻辑地址相邻,体现在内存空间分配是物理地址相邻
单一连续分配
在单道程序环境下,内存分为系统区和用户区,系统区仅供OS使用,通常放在内存低址部分。而用户去内存,仅装有一道用户程序
固定分区分配
将整个用户空间划分为若干个固定大小的区域,在每个分区中只装入一道作业
-
划分分区的方法
-
分区大小相等
优点:方便、对于同时控制相同对象的场合实用
缺点:缺乏灵活性,会造成空间浪费或程序无法运行
-
分区大小不等
优点:灵活性
缺点:要对作业占内存情况进行调查
-
-
内存分配
检索分区使用表
动态分区分配
-
数据结构
- 空闲分区表
- 优点:易于查找
- 缺点:不易分配、占内存
- 空闲分区链
- 优点:易于分配适合操作系统环境、不占内存
- 缺点:不易查找
- 空闲分区表
-
分区分配操作
-
分配内存
m.size :每个空闲分区的大小,u.size:请求的分区大小,注意
m.size - u.size <= size
-
回收内存
- 回收区与插入点的前一个空闲分区 F1相邻接,见图 4-8(a)。此时应将回收区与插入 点的前一分区合并,不必为回收分区分配新表项,而只需修改其前一分区 F1的大小。
- 回收分区与插入点的后一空闲分区 F2相邻接,见图 4-8(b)。此时也可将两分区合并, 形成新的空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和。
- 回收区同时与插入点的前、后两个分区邻接,见图 4-8©。此时将三个分区合并, 使用 F3的表项和 F3的首址,取消 F2的表项,大小为三者之和。
- ) 回收区既不与 F1邻接,又不与 F2邻接。这时应为回收区单独建立一新表项,填写 回收区的首址和大小,并根据其首址插入到空闲链中的适当位置。
-
基于顺序搜索的动态分区分配算法
-
首次适应(first fit FF)算法
FF算法要求空闲分区链从链首开始以地址递增的次序链接查找满足要求的空闲分区
- 优点:优先利用内存中低址的空闲分区,从而保留高址部分的大空闲区,这为以后到达的大作业分配内存空间创造了条件
- 缺点:产生很多碎片,增加查找空闲分区难度
-
循环首次适应算法(next fit,NF)算法
NF算法不再从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找满足要求的空闲分区
- 优点:使内存中的空闲分区分布更均匀,从而减少查找空闲分区的开销
- 缺点:缺乏大的空闲分区
-
最佳适应(best fit BF)算法
BF总是能把满足要求、又是最小空闲分区分配给作业
-
优点:孤立的看最佳
-
缺点:宏观上,会留下难以利用的碎片
-
-
最坏适应(worst fit WF)算法
WF总是能把满足要求、又是最大空闲分区分配给作业
- 优点:可使剩下的空闲去不至太小,产生碎片可能性最小,对中小作业有利。同时查找效率高。
基于索引搜索的动态分区分配算法
-
快速适应算法
分类搜索法,将空闲分区根据容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表。
算法根据进程长度,从索引表中寻找能容纳它的最小空闲链表,第二步从链表中取下第一块进行分配即可
- 优点:满足对大空间需求,也不会产生内存碎片,查找效率高
- 缺点:算法复杂,系统开销大
-
伙伴系统
算法规定,分配分区或空闲分区大小均为2的k次幂,当需要为一个进程分配长度为n的存储空间时,首先计算一个i值,使 2 i − 1 < n < = 2 i 2^{i - 1} < n <= 2^i 2i−1<n<=2i,然后在空闲分区大小为 2 i 2^i 2i的空闲分区链表中查找,若找到,则分配出去。没有找到,则把 2 i 2^i 2i的空闲分区分为两个相等的分区,这两个分区称为一对伙伴系统。其中的一个分区用于分配,而把另一个加入分区大小为 2 i 2^i 2i 的空闲分区链表中。
对于一个大小为 2 k 2^k 2k,地址为x的内存块,其伙伴快的地址则用buddy(x)来表示,其通式为:
KaTeX parse error: Unknown column alignment: * at position 51: … \begin{array}{*̲*lr**} …
- 优点:空闲分区的使用率高
- 缺点:时间性能上相较差
-
哈希算法
优点:查找快速
动态课重定位分区分配
将内存中的所有作业进行移动,使它们全都 相邻接,这样,即可把原来分散的多个小分区拼接成一个大分区,这时就可把作业装入该 区。这种通过移动内存中作业的位置,以把原来多个分散的小分区拼接成一个大分区的方 法,称为“拼接”或“紧凑”,见图 4-9(b)。
动态重定位的实现:系统中增设一个重定位寄存器,用它来存放程序(数据)在内存中的起始地址。程序在执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的。
对换
所谓“对换”,是指把内存中暂时不能 运行的进程或者暂时不用的程序和数据调出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据调入内存。
直接提高了内存利用率,处理机利用率和系统的吞吐量
对换的类型
- 整体对换:果对换是以整个进程为单位的,便称之为“整体对换”或“进程对换”。
- 页面对换:对换是以“页”或“段”为单位进行的,则分别称之为“页面对换”或“分段 对换”
对换空间的管理
在具有对换功能的 OS 中,通常把外存分为文件区和对换区
-
文件区管理的主要目标
由于通常的文件都是较长久地驻留在外存上,故对文件区管理 的主要目标,是提高文件存储空间的利用率,为此,对文件区采取离散分配方式。
-
对换区管理的主要目标
,进 程在对换区中驻留的时间是短暂的,对换操作又较频繁,故对对换空间管理的主要目标, 是提高进程换入和换出的速度。为此,采取的是连续分配方式,较少考虑外存中的碎片问题。
进程的换出与换入
-
进程的换出
进程的换出。每当一进程由于创建子进程而需要更多的内存空间,但又无足够的内 存空间等情况发生时,系统应将某进程换出。其过程是:系统首先选择处于阻塞状态且优 先级最低的进程作为换出进程,然后启动磁盘,将该进程的程序和数据传送到磁盘的对换 区上。若传送过程未出现错误,便可回收该进程所占用的内存空间,并对该进程的进程控 制块做相应的修改。
-
进程的换入
)进程的换入。系统应定时地查看所有进程的状态,从中找出“就绪”状态但已换出 的进程,将其中换出时间最久(换出到磁盘上)的进程作为换入进程,将之换入,直至已无可 换入的进程或无可换出的进程为止。
分页存储管理方式
分页存储管理的基本方法
-
页面和物理块
分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页, 并为各页加以编号,从 0 开始,如第 0 页、第 1 页等。相应地,也把内存空间分成与页面 相同大小的若干个存储块,称为(物理)块或页框(frame),也同样为它们加以编号,如 0 #块、 1 #块等等。在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相 邻接的物理块中。由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为 “页内碎片”。
-
地址结构
它含有两部分:前一部分为页号 P,后一部分为位移量 W(或称为页内地址)。图中的地址长 度为 32 位,其中 0~11 位为页内地址,即每页的大小为 4 KB;12~31 位为页号,地址空 间最多允许有 1 M 页。
对于某特定机器,其地址结构是一定的。若给定一个逻辑地址空间中的地址为 A,页 面的大小为 L,则页号 P 和页内地址 d 可按下式求得: P = INT A L \cfrac{A}{L} LA d = [A] MOD L 其中,INT 是整除函数,MOD 是取余函数。
-
页表
系统又为每个 进程建立了一张页面映像表,简称页表。在进程地址空间内的所有页(0~n),依次在页表中 有一页表项,其中记录了相应页在内存中对应的物理块号,见图 4-12 的中间部分。在配置 了页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号。可见,页表 的作用是实现从页号到物理块号的地址映射。
地址变换机构
将逻辑地址的页号转换为内存中的物理块号
-
基本地址变换机构
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对 地址)分为页号和页内地址两部分,再以页号为索引去检索页表。查找操作由硬件执行。在 执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本 次所访问的地址已超越进程的地址空间。于是,这一错误将被系统发现并产生一地址越界 中断。若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项 在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。与此同 时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。这样便完 成了从逻辑地址到物理地址的变换。图 4-13 示出了分页系统的地址变换机构。
-
具有块表的地址变换机构
为了提高地址变换速度,可在地址变换机构中增设一个具有并行查寻能力的特殊高速 缓冲寄存器,又称为“联想寄存器”(Associative Memory),或称为“快表”
访问内存的有效时间
从进程发出指定逻辑地址的访问请求,经地址变换,到在内存中找到实际物理单元并取出数据,所需要花费的总时间(Effective Access Time EAT)
假设访问一次内存的时间为t
-
基本地址变换机构
EAT = t + t = 2t
-
具有块表的地址变换机构
EAT = a*入 + (t + 入)(1- a) + t = 2t+入-t*a
入表示查找块表所需要的时间,a代表命中率
反置页表
为每一个物理块设置一个页表项,并按物理块的编号排序
-
基本分段存储管理
分段存储管理方式的引入
引入分段存储管理方式,主要是为了满足用户和程序员的下述一系列需要
- 方便编程
- 信息共享
- 信息保护
- 动态增长
- 动态链接
分段系统的基本原理
- 分段:在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑 信息。整个作业的地址空间由于是分成多个段,因而是二维的,亦即,其逻辑地 址由段号(段名)和段内地址所组成。
- 段表:在系统中为每个进程建立一张段映射表,简称 “段表”。每个段在表中占有一个表项,其中记录了该段在内存中的起始地址(又称为“基址”) 和段的长度,如图 4-17 所示。段表可以存放在一组寄存器中,这样有利于提高地址转换速 度,但更常见的是将段表放在内存中。
-
地址变换机构
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用 于存放段表始址和段表长度 TL。在进行地址变换时,系统将逻辑地址中的段号与段表长度 TL 进行比较。若 S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界, 则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的 起始地址,然后,再检查段内地址 d 是否超过该段的段长 SL。若超过,即 d>SL,同样发出 越界中断信号;若未越界,则将该段的基址 d 与段内地址相加,即可得到要访问的内存物 理地址。
-
分页和分段的主要区别
- 页是信息的物理单位。段则是信息的 逻辑单位。
- 页的大小固定且由系统决定。而段的长度却不固定,决定于 用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分
- 分页的作业地址空间是一维的,即单一的线性地址空间,程序员只需利用一个记忆 符,即可表示一个地址;而分段的作业地址空间则是二维的,程序员在标识一个地址时, 既需给出段名,又需给出段内地址。
信息共享
-
分页系统共享
-
分段系统共享
可重入代码(Reentrant Code)又称为“纯代码”(Pure Code),是一种允许多个进程同时访 问的代码。为使各个进程所执行的代码完全相同,绝对不允许可重入代码在执行中有任何 改变。因此,可重入代码是一种不允许任何进程对它进行修改的代码。
段页式存储管理方式
-
基本原理
段页式系统的基本原理,是分段和分页原理的结合,即先将用户程序分成若干个段, 再把每个段分成若干个页,并为每一个段赋予一个段名。图 4-21 示出了一个作业地址空间 的结构。该作业有三个段,页面大小为 4 KB。在段页式系统中,其地址结构由段号、段内 页号及页内地址三部分所组成,如图 4-22 所示。
-
地址变换过程
在段页式系统中,为了便于实现地址变换,须配置一个段表寄存器,其中存放段表始 址和段表长 TL。进行地址变换时,首先利用段号 S,将它与段表长 TL 进行比较。若 S < TL,表示未越界,于是利用段表始址和段号来求出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号 P 来获得对应页的页表项位置,从中 读出该页所在的物理块号 b,再利用块号 b 和页内地址来构成物理地址。图 4-23 示出了段 页式系统中的地址变换机构。