目录
连续分配管理
连续分配指为用户进程分配一个连续的内存空间
1. 单一连续分配
这是最简单的一种存储管理方式,内存分为系统区和用户区,系统区仅提供给OS使用,放在内存地址部分;用户区为除系统区以外的全部内存空间,给用户使用,通常放在内存高址部分.
优点:简单,无外部碎片(内存中某些太小的而难以利用的分区),可以采用覆盖技术,无需内存保护以及额外的技术支持
缺点:有内部碎片(分配给进程的内存没被用上的部分),内存空间浪费大,资源利用率不高

2. 固定分区分配
固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存划分为若干大小固定的区域,每个区域只装入一道作业
①划分分区的两种方法
··分区大小相等:用在控制多个相同对象的场合,缺乏灵活性
··分区大小不等:增加了灵活性,满足不同大小的进程需求

②实现分配
先建立一张分区说明表,每个表项对应一个分区。当有用户程序要装入时,检索该表,找到合适的分区给予分配,然后将状态置为“已分配”;未找到则拒绝为该用户程序分配内存

优点:实现简单,无外部碎片
缺点:当用户程序太大无满足的分区时,需要采用覆盖技术,降低了性能;会产生内部碎片,内存利用率低
3.动态分区分配
动态分区分配不预先划分内存,当进程装入内存时,根据进程的大小动态建立分区,使分区的大小正好适合进程的需要
①两种记录内存的数据结构:
·空闲分区表

·空闲分区链

②分区分配算法:
··首次适应(First Fit):空闲分区以地址递增的次序链接。当一个作业到达时,从该表中顺序检索,找到大小能满足要求的第一个空闲分区。余下的空用分区仍然保留。若从头到尾都不存在符合条件的分区,则分配失败。

优点:优先利用低地址部分的空闲分区从而保留了高地址部分大的空困分区,无内部碎片。
缺点:由于低地址部分不断技划分致使低地址端创下许多难以利用的很小的空闲分区(外部碎),而每次查找又都是从低地处部分开始这无疑增加了查找可用空闲分区的开销。
·邻近适应(Next Fit): 又称循环首次适应算法,由首次适应法演变而来,空闲分区以地址递增的顺序排列(排成一个循环列表)分配内存时从上次查找结束的位置开始继续查找。

优点:空闲分区的分布更加均匀,减少了查找空闲分区的开销
缺点:同时可能会导致缺乏大的空闲分区
·最佳适应(Best Fit): 空闲分区按容量递增的方式形成分区链,当作业到达时,从该表中检索出第一个能满足要求的空闲分区分配给它。该方法碎片最小,如果剩余空闲分区太小,则将整个分区全部分配给它。

优点:总能分配给作业最恰当的分区,并保留大的分区
缺点:会导致产生很多难以利用的碎片空间,即外部碎片,重新排列会使得算法开销变大
·最坏适应(Worst Fit):又称量大适应算法。空闲分区以容量递减的次序链接。当一个作业到达时,从该表中检索第一个能满足要求的空闲分区,即挑选出最大的分区,该方法碎片最大,但剩余的空闲分区可再次使用。

优点:使分给作业后剩下的空闲分区比较大,足以装入其他作业
缺点:由于最大空闲分区总是因首先分配而被划分,当有大作业到来其储存空间的申请会得不到满足,重新排列会使得算法开销变大
综合来看,首次适应算法不仅是最简单的,通常也是最好最快的
③分区的分配与回收
分配:

回收的四种情况:
···回收区与插入点前一分区相连接
··回收区与插入点后一个分区相连接
··回收区与插入点前后两个分区相连接
··回收区前后都没有相邻的空闲分区
非连续分配管理
在连续分配管理方式中,即使内存有超过1GB的空闲空间,但若没有连续的1GB内存,则该需要1GB的作业也无法运行。此时我们可以采用非连续分配管理方式,则该作业可以分散地分配到内存地各个区域。而根据分区地大小是否固定,可以将非连续管理方式分为分页存储管理方式和分段存储管理方式。
1.分页存储管理方式
①分页的思想:
将内存空间划分为大小相等且固定的块,块的大小相对分区要小很多,作为内存的基本单位。每个进程也以块为单位进行划分,执行时以块为单位逐个申请内存中的块空间。

②几个基本概念:
a.页面和页框
进程若干个大小相等的块称为页面or 页(page),页从0开始编号,每个页都有一个编号;
内存空间若干个与页面大小相等的块称为页框(page frame) or页帧or物理块,页框也从0开始编号;
页框不宜太大,因为进程的最后一个页面可能没有页框那么大,若页框太大会产生过大的内部碎片;同时页面的大小也应该适中,一般为2的整数幂(518B~8KB),页面太小会使进程的页面过多,导致页表过长占用大量内存,增加硬件地址转换的开销;页面过大会使页内碎片增多,降低内存的利用率。
b.地址结构

若已知逻辑地址为A,页面大小为L,则页号P=A/L(取整); 页内偏移量W=A%L(取余)
c. 页表
为了知晓每个进程的页面在内存中存放的位置,操作系统为每个进程建立一张页表

一个进程对应一张表,进程的每一页对应一个页表项(页号+块号),记录进程页面和实际存放的内存块之间的对应关系
③地址变换机构:用于实现逻辑地址到物理地址转换的一组硬件机构,即实现逻辑页号到物理块号,常借助页表来完成,因此会在系统中设置一个页表寄存器,进程执行时会将页表起始值和页表长度从PCB中存入页表寄存器。

1.根据逻辑地址计算出页号,页内偏移量;
2.判断页号是否越界;若P>=M则产生越界中断
3.查询页表,找到页号对应的页表项,确定内存块号;P对应的页表项地址=页表起始地址F+页号P*页表项长度,得到b(每个页表项的长度是相等的,页号是“隐含”的)
4.内存块号和页内偏移量相加得到物理地址;E=b*L+W
5.用得到的物理地址访问内存
![]()

(页内偏移量占10位说明页面大小为2^10B=1KB)
④快表的地址变换机构:
地址变换过程,若页表全部放在内存中,则存取一个数据或一条指令至少要访间两次内存:第一次访问页表确定所存取的数据或指令的物理地址;第二次是根据该地址存取数据或指令。这种方法比通常执行指令的速度慢了一半。
为此,在地址变换机构中增没一个具有并行查找能力的高速缓冲存储器快表,又称相联存储器(TLB)用来存放当前访向的若干页表项,以加速地址变换的过程。与此对应,主存中的页表常称为慢表。

在具有快表的分页机制中:
1.CPU给出逻辑地址后,由硬件进行地址转换,将页号送入高速缓存寄存器,并将此页号
与快表中的所有页号进行比较。
2.若找到匹配的页号,说明所要访问的页表项在快表中,则直接从中取出该页对应的页框
号,与页内偏移量拼接形成物理地址。这样,存取数据仅一次访存 便可实现。
3.若未找到匹配的页号,则需要访问主存中的页表,在读出页表项后,应同时将其存入快
表,以便后面可能的再次访问。但若快表已满,则必须按照定的算法对旧的页表项进
行替换。


⑤两级和多级页表:
单级页表的两个问题:
问题一:页表必须连续存放,当页表很大时,需要占用很多连续的页框;
[eg]:

解决:参考进程在内存中必须连续存储的问题,我们将地址空间分页,同样的思路也可用于解决上述问题,把必须连续存放的页表再分页;如上例中,页面大小4KB,每个页表项4B,每个页面可存放1K个页表项,因此每1K个连续的页表项为一组,每组刚好占一个内存块,再将各组离散地放到各个内存块中,为离散分配的页表再建立一张页表,称为页目录表,或称外层页表,即:

其地址变换过程:
①按照地址结构将逻辑地址拆分成三部分
②从PCB中读出页目录表始址,再根据一级页号查页目录表,找到下一级页表在内存中的存放位置
③根据二级页号查表,找到最终想访问的内存块号
④结合页内偏移量得到物理地址
[eg]: 将逻辑地址(000000000,000000001,11111111)转换为物理地址(用十进制表示)

最终要访问的内存块号为4
该内存块的起始地址为4* 4KB =4*2^12= 16384
页内偏移量为1023
最终的物理地址为16384 + 1023 = 17407
问题二:进程一段时间内可能只需要访问几个特定的页面,所以没有必要让整个页表常驻内存。
解决:可以在需要访问页面时才把页面调入内存(虚拟存储技术,后面介绍)。可以在页表项中增加一个标志位,用于表示该页面是否已经调入内存
【注意】:采用多级页表机制,各级页表的大小不能超过一个页面;N级页表访问一个逻辑地址需要N+1次访存

2. 分段存储管理方式
①什么是分段
进程的地址空间按照自身的逻辑关系划分为若干个段,每个段从0开始编址(段名可供程序员编程);内存以段为单位进行分配,每个段在内存中占用连续的空间,但可以不相邻

其逻辑地址如图:
段号决定了每个进程最多可以分为多少段,段内偏移量决定了每个段的最大长度。
②段表
每个进程都有一张逻辑空间与内存空间映射的段表,每个段表项对应进程的一段,并记录了段的长度和段在内存中的起始位置

③地址变换机构
- 根据逻辑地址得到段号和偏移量,比较段号S和段表长度M,若S>=M越界,否则继续
- 查询段表,S对应的段表项地址=段表始址F+段号S*段表长度M,从而取出段长C,若C<=偏移量W,则越界中断,否则继续
- 得到物理地址E=b+W,访问内存

④分页和分段的主要区别
1)页是信息的物理单位,分页是由于系统管理的需要而不是用户的需要,为了实现离散分配,提高内存的利用率;段则是信息的逻辑单位,分段的主要目的是更好满足用户需求,是对用户可见的。
2)页的大小固定由系统决定;而段的长度却不固定,取决于用户所编写的程序。
3)分页的作业地址空间是一维的,即单一的线性地址空间:而分段的作业地址空间则是二维的。
4)在一个进程中,段表只有一个,而页表可能有多个。
5)分段比分页更容易实现信息的共享和保护。
6)单级页表和分段访问一个逻辑地址均需要两次访存。
3. 段页式存储管理

段页式存储管理是页式和段式管理方式的结合,按程序分段,段内再分页:

①段页式存储的段表和页表
进程中每个段对应一个段表项,每个段表项由段号、页表长度、页表存放块号(页表起始
地址)组成。每个段表项长度相等,段号是隐含的。
每个页面对应一个页表项,每个页表项由页号、页面存放的内存块号组成。每个页表项长度相等,页号是隐含的。

②段页式系统的地址变换机构
1)由逻辑地址中的段号S与段表长度M比较,如果S小于M,就继续否则发生越界中断。
2)由股表和逻辑地址A中的页号起查找到页表始址, 首先比较页号P与页表长度C的大如果页号P>C则发生越界中断否则继续。
3)最后根据页表将页号转换为内存块号。物理地址E=b+W。

893

被折叠的 条评论
为什么被折叠?



