存储器的管理主要对象是内存,外存的管理由文件管理负责
速度、容量、价格
对于通用计算机而言,存储层次至少应具有三级(从高到低):CPU寄存器、主存、辅存

寄存器和主存储器又被称为可执行存储器,cpu访问快
对辅存的访问则需要通过I/O设备

绝对装入:用户程序编译后,将产生绝对地址(即物理地址)的目标代码
应用:操作系统程序、一些特权程序,只适用于单道程序环境
可重定位装入:绝对地址 = 逻辑地址 + 程序起始地址
地址变换通常在进程装入时一次完成,以后不再改变,故称静态重定位
动态运行时的装入方式:模块装入内存后,并不立即将逻辑地址转换成物理地址,而是在程序真正执行时才进行。
根据链接的时间不同分为以下三种:
静态链接方式:程序运行前,先将各目标模块及它们所需库函数链接成一个完整的装配模块,以后不再拆开
需要解决:对相对地址进行修改、变换外部调用符号
装入时动态链接:装入内存时,边装入边链接
特点:便于修改和更新、便于实现对目标模块的共享
运行时动态链接:程序执行时装入
加快程序装入过程,节省大量内存空间
为用户程序分配一个连续的内存空间,即程序中代码或数据的逻辑地址相邻,体现在内存空间分配是物理地址相邻
在单道程序环境下,内存分为系统区和用户区,系统区仅供OS使用,通常放在内存低址部分。而用户去内存,仅装有一道用户程序
将整个用户空间划分为若干个固定大小的区域,在每个分区中只装入一道作业
划分分区的方法
分区大小相等
优点:方便、对于同时控制相同对象的场合实用
缺点:缺乏灵活性,会造成空间浪费或程序无法运行
分区大小不等
优点:灵活性
缺点:要对作业占内存情况进行调查
内存分配
检索分区使用表
数据结构
分区分配操作
分配内存
m.size :每个空闲分区的大小,u.size:请求的分区大小,注意
m.size - u.size <= size

回收内存

首次适应(first fit FF)算法
FF算法要求空闲分区链从链首开始以地址递增的次序链接查找满足要求的空闲分区
循环首次适应算法(next fit,NF)算法
NF算法不再从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找满足要求的空闲分区
最佳适应(best fit BF)算法
BF总是能把满足要求、又是最小空闲分区分配给作业
优点:孤立的看最佳
缺点:宏观上,会留下难以利用的碎片
最坏适应(worst fit WF)算法
WF总是能把满足要求、又是最大空闲分区分配给作业
快速适应算法
分类搜索法,将空闲分区根据容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表。
算法根据进程长度,从索引表中寻找能容纳它的最小空闲链表,第二步从链表中取下第一块进行分配即可
伙伴系统
算法规定,分配分区或空闲分区大小均为2的k次幂,当需要为一个进程分配长度为n的存储空间时,首先计算一个i值,使2i−1
对于一个大小为2k2^k2k,地址为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 AL\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代表命中率
为每一个物理块设置一个页表项,并按物理块的编号排序
引入分段存储管理方式,主要是为了满足用户和程序员的下述一系列需要


地址变换机构
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用 于存放段表始址和段表长度 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 示出了段 页式系统中的地址变换机构。
