目录
最少使用(LFU:Least Frequently Used)置换算法
存储器的层次结构
连续分配方式
单一连续分配
- 最简单的一种存储管理方式
- 用于单用户、单任务的操作系统
- 把内存分为系统区和用户区两部分,系统区仅提供给OS使用,通常是放在内存的低址部分;用户区是指除系统区以外的全部内存空间, 提供给用户使用。
- 存在内碎片问题
固定分区分配
把内存划分为若干个固定大小的连续分区。 每个分区装入一个作业。互不干扰 最简单的运行多道程序的分区式存储管理方式。
- 分区大小相等:灵活性较差。程序太小,空间浪费;程序太大,一个分区又无法装入。只适合于多个相同程序的并发执行(处理多个类型相同的对象)。
- 分区大小不等:多个小分区、适量的中等分区、少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。
内存分配
将分区按照大小进行排队,建立分区使用表。
——由内存分配程序根据用户程序的大小进行检索,找出满足要求、尚未分配的分区,将之分配给该程序,并设置表项状态
- 优点:易于实现,开销小。
- 缺点:
- 内碎片造成浪费
- 分区总数固定,限制了并发执行的程序数目。
- 可以和覆盖、交换技术配合使用。
- 采用的数据结构:分区表--记录分区的大小和使用情况
动态分区分配
动态创建分区:在装入程序时按其初始要求分配,或在其执行过程中通过系统调用进行分配或改变分区大小。
优点:没有内碎片。
缺点:有外碎片。
分区分配中的数据结构
(1)空闲分区表: 每个空闲分区占一个表目
( 2 ) 空闲分区链:在每个分区的起始部分设置一些用于控制分区分配的信息,用于链接各分区所用的前向指针,在分区尾部设置一后向指针,通过前后向链接指针将所有空闲分区链接成一个双向链。
分区分配算法
分区分配算法:寻找某个空闲分区,其大小需大于或等于程序的要求。若是大于要求,则将该分区分割成两个分区,其中一个分区为要求的大小并标记为“占用”,而另一个分区为余下部分并标记为“空闲”。分区的先后次序通常是从内存低端到高端。
分区释放算法:需要将相邻的空闲分区合并成一个空闲分区。(这时要解决的问题是:合并条件的判断和合并时机的选择)
分区分配算法:
分区分配算法(顺序搜索)
最先匹配法(first-fit):
按分区的先后次序,从头查找,找到符合要求的第一个分区
该算法的分配和释放的时间性能较好,较大的空闲分区可以被保留在内存高端。 要求空闲分区链以地址递增的次序链接。
循环首次适应算法(next-fit):
按分区的先后次序,从上次分配的分区起查找(到最后分区时再回到开头),找到符合要求的第一个分区
该算法的分配和释放的时间性能较好,使空闲分区分布得更均匀,但较大的空闲分区不易保留。
最佳匹配法(best-fit):
找到其大小与要求相差最小的空闲分区
将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。 从个别来看,外碎片较小,但从整体来看,会形成较多外碎片。较大的空闲分区可以被保留。
最坏匹配法(worst-fit):
找到最大的空闲分区
将所有的空闲分区按其容量以从大到小的顺序形成一空闲分区链 基本不留下小空闲分区,但较大的空闲分区不被保留。
- 基于顺序搜索的动态分区分配算法,适用于不太大的系统。
- 当系统很大,系统的内存分区可能会很多,相应的空闲分区链就可能很长,这时采取基于顺序搜索的动态分区分配算法可能会比较慢。
- 在大中型系统中,往往采用基于索引搜索的动态分区分配算法。
分区分配算法(索引搜索)
快速适应算法(quick-fit):
- 分类搜索,将空闲分区根据容量大小进行分类,对于每类具有相同容量的所有空闲分区,单独设置一个空闲分区链表。在内存中设立管理索引表,每个索引表项对象一种空闲分区类型,记录其链表表头指针。
- 根据进程长度,从索引表中找能容纳它的最小空闲区链表,从链表中取下第一块空闲区进行分配。
- 不产生分区分割和内存碎片,查找效率高。 以进程为单位分配分区,一个分区只属于一个进程
- 缺点:为了有效合并分区,分区归还时算法复杂
伙伴系统(buddy system)、哈希算法
分区分配操作
(1) 分配内存
请求分区大小:u.size 空闲分区大小:m.size 事先规定不再切割的剩余分区大小:size
(2) 回收内存
可重定位分区分配
1) 动态重定位的引入
紧缩(或拼凑)
可重定位分区法
紧缩时机
●释放所占分区时
●分配进程分区时
2) 动态重定位的实现
3) 动态重定位分区分配算法
对换(Swapping)
1) 对换的引入
所谓“对换”, 是指把内存中暂时不能运行的进程或者暂时不用的程序和数据,调出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据,调入内存。对换是提高内存利用率的有效措施。
2) 对换空间的管理
在系统中应配置相应的数据结构管理对换区中的空闲盘块,以记录外存的使用情况。
同样用空闲分区表或空闲分区链。在空闲分区表中的每个表目中应包含两项, 即对换区的首址及其大小,它们的单位是盘块号和盘块数。
3) 进程的换出与换入
(1) 进程的换出。
选择处于阻塞状态且优先级最低的进程作为换出进程
然后启动盘块,将该进程的程序和数据传送到磁盘的对换区上。
若传送过程未出现错误,回收该进程所占用的内存空间,并对该进程的进程控制块做相应的修改。
(2) 进程的换入。
系统应定时地查看所有进程的状态,从中找出“就绪”状态但已换出的进程,将其中换出时间(换出到磁盘上)最久的进程作为换入进程,将之换入,直至已无可换入的进程或无可换出的进程为止。
思考:
连续分配方式会形成许多碎片,虽然可以用紧凑方法将许多碎片拼接成可用的大块空间,但必须付出较大开销。
若允许将一个进程直接分散空间,装入多个不相邻的分区中,可充分利用内存,且无须进行紧凑。
离散分配:分页存储、分段存储、段页式
分页存储管理
用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。
分段存储管理
将用户程序地址空间分成若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。存储分配时,以段为单位,段与段在内存中可以不相邻接,也实现了离散分配。
分页与分段的主要区别
页是信息的物理单位,分页是为了实现非连续分配,以便解决内存碎片问题,或者说分页是由于系统管理的需要。
段是信息的逻辑单位,它含有一组意义相对完整的信息,分段的目的是为了更好地实现共享,满足用户的需要。
页的大小固定,由系统确定,将逻辑地址划分为页号和页内地址,是由机器硬件实现的。
段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时根据信息的性质来划分。
分页的作业地址空间是一维的。
分段的地址空间是二维的。
段页式存储管理
分页系统能有效地提高内存的利用率,而分段系统能反映程序的逻辑结构,便于段的共享与保护,将分页与分段两种存储方式结合起来,就形成了段页式存储管理方式。
在段页式存储管理系统中,作业的地址空间首先被分成若干个逻辑分段,每段都有自己的段号,然后再将每段分成若干个大小相等的页。对于主存空间也分成大小相等的页,主存的分配以页为单位。
基本分页存储管理方式
分页存储管理的基本方法
1) 页面和物理块
一个进程的逻辑地址空间分成大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。
内存空间分成与页面相同大小的存储块,称为(物理)块或页框(frame), 也同样为它们加以编号,如0#块、1#块等等
在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。
由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“页内碎片”。
页面大小??
页面太小
使内存碎片减小,但也会使每个进程占用较多的页面,从而导致进程的页表过长,占用大量内存,降低页面换进换出的效率。
页面较大
可以减少页表的长度,提高页面换进换出的速度,但却又会使页内碎片增大。
折衷方案:
页面的大小适中,且应是2的幂,通常为512 B~8 KB。
地址结构
分页地址中的地址结构如下:
它含有两部分:前一部分为页号P,后一部分为位移量W(或称为页内地址)。图中的地址长度为32位,其中0~11位为页内地址,即每页的大小为4 KB;12~31位为页号,地址空间最多允许有1 M页。
对于某特定机器,其地址结构是一定的。若给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址d可按下式求得:
其中,INT是整除函数,MOD是取余函数。例如,其系统的页面大小为1 KB,设A = 2170 B,则由上式可以求得P = 2,d = 122。
页表
在分页系统中,允许将进程的各个页离散地存储在内存不同的物理块中,但系统应能保证进程的正确运行,即能在内存中找到每个页面所对应的物理块。为此,系统又为每个进程建立了一张页面映像表,简称页表。
在进程地址空间内的所有页(0~n),依次在页表中有一页表项,其中记录了相应页在内存中对应的物理块号。在配置了页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号。可见,页表的作用是实现从页号到物理块号的地址映射。
●实现从页号到物理块号的地址映射
例
8页的逻辑空间,每页1024字节,映射到32块的物理存储区中,则
逻辑地址的有效位是多少位?
物理地址的有效位是多少位?
地址变换机构
实现从逻辑地址到物理地址的转换 查找由硬件执行
1) 基本的地址变换机构
- 进程被调度后,写页表寄存器
- 把逻辑地址拆分为页号和页内地址
- 判断是否越界中断,找到页表
- 确定该页号在页表中的位置
- 得到物理块号
- 与页内地址拼接为物理地址
页表大多驻留在内存中。在系统中只设置一个页表寄存器,在其中存放页表在内存的始址和页表的长度。平时,进程未执行时,页表的始址和页表长度存放在本进程的PCB中。当调度程序调度到某进程时,才将这两个数据装入页表寄存器中。
具有快表的地址变换机构
由于页表是存放在内存中的,这使CPU在每存取一个数据时,都要两次访问内存。
第一次是访问内存中的页表,从中找到指定页的物理块号,再将块号与页内偏移量W拼接,以形成物理地址。第二次访问内存时,才是从第一次所得地址中获得所需数据(或向此地址中写入数据)。
因此,采用这种方式将使计算机的处理速度降低近1/2。可见,以此高昂代价来换取存储器空间利用率的提高,是得不偿失的。
把访问频率高的页表项放在一个联想寄存器(快表)中,实现高速地址变换。
为了提高地址变换速度,可在地址变换机构中增设一个具有并行查寻能力的特殊高速缓冲寄存器,又称为“联想寄存器”(Associative Memory),或称为“快表”
两级和多级页表
大多数现代计算机系统都支持非常大的逻辑地址空间,如2^32 ~2^64。在这种情况下,只用一级页表会使页表变得非常大。
一种方法是利用两级页表,即把页表本身也分页。
外层页表记录页表页面的物理块号
逻辑地址为32位的二级页表结构
基本分段存储管理方式
分段存储管理方式的引入
引入分段存储管理方式, 主要是为了满足用户和程序员的下述一系列需要:
1) 方便编程
2) 信息共享
3) 信息保护
4) 动态增长
5) 动态链接
分段系统的基本原理
分段
分段地址中的地址具有如下结构:
段表
利用段表实现从逻辑段到物理内存区的地址映射
地址变换机构
分段系统的地址变换过程
分页和分段的主要区别
① 页是信息的物理单位
段是信息的逻辑单位
② 页的大小是由系统确定的
段的长度因段而异
③ 分页的进程地址空间是一维的
分段的进程地址空间是二维的
④ 分页系统很难实现过程和数据的分离
分段系统却可以很容易实现这些功能
信息共享
分段系统的一个突出优点是易于实现段的共享,即允许若干个进程共享一个或多个分段,且对段的保护也十分简单易行。
段页式存储管理方式
1)基本原理
段页式系统的基本原理,是分段和分页原理的结合,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。
利用段表和页表实现地址映射
2) 地址变换过程
获得一条指令或者数据,需要3次访问内存
高速缓冲寄存器:同时用段号、页号去检索,得到对应页的物理块号,与页内地址一起形成物理地址。
扩大内存的方法
虚拟存储器
常规存储器管理方式的特征
(1)一次性。 (2) 驻留性。
虚存的应用需求:小的存储设备运行大的程序。
虚拟内存可行性基础:局部性原理
早在1968年, Denning.P就曾指出:
(1) 程序执行时, 除了少部分的转移和过程调用指令外, 在大多数情况下仍是顺序执行的。
(2) 过程调用将会使程序的执行轨迹由一部分区域转至另一部分区域, 但经研究看出,过程调用的深度在大多数情况下都不超过5。
(3) 程序中存在许多循环结构, 这些虽然只由少数指令构成, 但是它们将多次执行。
(4) 程序中还包括许多对数据结构的处理, 如对数组进行操作, 它们往往都局限于很小的范围内。
2) 虚拟存储器定义
所谓虚拟存储器, 是指具有请求调入功能和置换功能, 能从逻辑上对内存容量加以扩充的一种存储器系统。
其逻辑容量由内存容量和外存容量之和所决定,其运行速度接近于内存速度,而每位的成本却又接近于外存。
可见,虚拟存储技术是一种性能非常优越的存储器管理技术。
2)虚拟存储技术的本质
3) 虚拟存储器的实现方法
分页请求系统:在分页系统基础上增加了请求调页和页面置换功能
硬件支持:
- 请求分页的页表机制,它是在纯分页的页表机制上增加若干项而形成的,作为请求分页的数据结构;
- 缺页中断机构,即每当用户程序要访问的页面尚未调入内存时便产生一缺页中断,以请求OS将所缺的页调入内存;
- 地址变换机构, 它同样是在纯分页地址变换机构的基础上发展形成的。
实现请求分页的软件:实现请求调页、页面置换
请求分段系统
请求段页式系统
4) 虚拟存储器的特征
多次性
一个作业被分成多次调入内存运行,亦即在作业运行时没有必要将其全部装入,只需将当前要运行的那部分程序和数据装入内存即可
对换性
允许在作业的运行过程中进行换进、换出
虚拟性
能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。
请求分页存储管理方式
每次调入调出都是长度固定的页面
请求分页中的硬件支持
请求分页中的内存分配策略和分配算法
在为进程分配内存,涉及到3个问题:
为保证进程正常运行,所需要的最小物理块数
为每个进程分配物理块时,采取的分配策略:固定?可变?
为不同进程分配的物理块数,是平均分配还是按照进程大小进行比例分配?
调页策略
页面置换算法
最佳置换算法和先进先出置换算法
影响缺页次数的因素
分配给进程的物理页面数
页面本身的大小
程序的编制方法
页面淘汰算法
最近最久未使用(LRU)置换算法
最少使用(LFU:Least Frequently Used)置换算法
选择在最近时期使用最少的页面作为淘汰页。
在采用最少使用置换算法时,应为在内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率。
该置换算法选择在最近时期使用最少的页面作为淘汰页。
由于存储器具有较高的访问速度,例如100 ns,在1 ms时间内可能对某页面连续访问成千上万次,因此,通常不能直接利用计数器来记录某页被访问的次数,而是采用移位寄存器方式。
每次访问某页时,便将该移位寄存器的最高位置1,再每隔一定时间(例如100 ms)右移一次。这样,在最近一段时间使用最少的页面将是∑Ri最小的页。
LFU置换算法的页面访问图与LRU置换算法的访问图完全相同;
或者说,利用这样一套硬件既可实现LRU算法,又可实现LFU算法。
应该指出,LFU算法并不能真正反映出页面的使用情况,因为在每一时间间隔内,只是用寄存器的一位来记录页的使用情况,因此,访问一次和访问10 000次是等效的。
Clock置换算法
页面缓冲算法
请求分段存储管理方式