第四章存储器管理
第四章存储器管理
一,(连续的内存管理)
1. 连续分配存储器管理方式
连续分配方式,是指为一个用户程序分配一个连续的内存空间。
1)单一连续分配
最简单的一种存储管理方式,但只能用于单用户、单任务的操作系统中。
采用这种存储管理方式时,可把内存分为:
-
系统区:系统区仅提供给OS使用,通常放在内存低址部分
-
用户区:用户区是指除系统区以外的全部内存空间,提供给用户使用
2)固定分区分配
将内存用户空间划分为若干个固定大小的区域,在每个分区中只装入一道作业。这样把用户空间划分为几个分区,便允许有几道作业并发执行。
当有一空闲分区时,便可以再从外存的后备作业队列中,选择一个适当大小的作业装入该分区,当该作业结束时,可再从后备作业队列中找出另一作业调入该分区。
优点:允许多道程序同时进入内存,可以进行更好的并发,系统性能提升
缺点:无法保证每一道作业进入的分区的大小与作业完全匹配
OS中分区中剩下了一些空间作业不用但也不能分配给别的进程,这种碎片就叫做内碎片(分区的内部)
固定分区分配划分分区的方法
- 分区大小相等
- 分区大小不等
固定分区分配的分区使用表
为便于内存分配,通常将分区按大小进行排队,并为之建立一张分区使用表,其中各表项包括每个分区的起始地址、大小及状态(是否已分配):
3)动态分区分配
动态分区分配是根据进程的实际需要,动态地为之分配内存空间。作业装入内存时,把可用内存分出一个连续区域给作业,且分区的大小正好适合作业大小的需要。分区的大小和个数依装入作业的需要而定。
按需分配,需要多少给多少内碎片的问题就没有了,弥补了固定分区分配的缺点
1.分区分配中的数据结构
➢空闲分区表:记录每个空闲分区的情况。每个空闲分区占一个表目。
表目中包括:分区序号、分区始址、分区的大小、等。
➢空闲分区链:在每个分区的起始部分,设置一些用于控制分区分配的信息,以及用于链接各分区所用的前向指针;在分区尾部则设置一后向指针,在分区末尾重复设置状态位和分区大小表目。
2.分区分配算法
为把一个新作业装入内存,需按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。
常用的分配算法:
1.首次适应算法FF
FF算法要求空闲分区表以地址递增的次序排列。在分配内存时,从表首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止;然后按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表中。若从头到尾不存在满足要求的分区,则分配失败。
从低地址开始选
➢优点
- 优先利用内存低址部分的内存空间
➢缺点
- 低址部分不断划分,产生小碎片(内存碎块、内存碎片、零头);每次查找从低址部分开始,增加了查找的开销。
动态分区分配的碎片叫做外碎片,因为每一个你得到的分区都是按照需要来的,划分到最后那些小的不能被利用的不属于任何一个分区,那他就是外碎片
2.循环首次适应算法
在分配内存空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。
为实现算法,需要:
- 设置一起始查寻指针
- 采用循环查找方式
➢优点:使内存空闲分区分布均匀,减少查找的开销
➢缺点:缺乏大的空闲分区
3.最佳适应算法
所谓“最佳”是指每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。
要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。
➢缺点:产生许多难以利用的小空闲区
3.分区分配及回收操作
➢分配内存
利用某种分配算法,从空闲分区链(表)中找到所需大小的分区。设请求的分区大小为u.size
,表中每个空闲分区的大小表示为m.size
若m.size-u.size≤size
(规定的不再切割的分区大小),将整个分区分配给请求者
否则从分区中按请求的大小划出一块内存空间分配出去,余下部分留在空闲链中,将分配区首址返回给调用者。
不分割了,分完后只剩下一个1k的空间谁也不能用,也就没有必要分了,只要按需分配中剩余的量小于这个下限,我们就不划分了直接这一块都给你就好了,避免出现特别零碎的小碎片
➢分区回收操作
当进程运行完毕释放内存时,系统根据回收区首址,在空闲分区链(表)中找到相应插入点。
这样回收可能会产生很多不相邻的小碎片无法整合到一起充分利用
4)可重定位分区分配(动态重定位)
1.动态重定位的引入
在连续分配方式中,必须把系统或用户程序装入一连续的内存空间。如果在系统中只有若干个小分区,即使它们的容量总和大于要装入的程序,但由于这些分区不相邻,所以无法将程序装入内存。
解决方法:将内存中的所有作业进行移动,使它们全部邻接,这样可把原来分散的小分区拼接成大分区,这种方法称为“拼接”或“紧凑”。
缺点:用户程序在内存中的地址发生变化,必须重定位。
2.动态重定位的实现
在动态运行时装入的方式时,将相对地址转换为物理地址的工作在程序指令真正要执行时才进行。地址转换需要重定位寄存器的支持。程序执行时访问的内存地址是相对地址与重定位寄存器中的地址相加而成
地址变换过程是在程序执行过程期间,随着对每条指令的访问自动进行的,称为动态重定位
一个程序的起始地址由寄存器的内容决定
也就是从某种意义上说是用户程序在内存中被分配了一个连续的内存空间,但这个连续的内存空间作为一个整体是可以移动的
3.动态重定位分区分配算法
动态重定位分区分配算法与动态分区分配算法基本相同,差别在于增加了紧凑的功能
5)四种连续的内存分配方式总结:
每种的特点,有什么问题,后一种如何弥补上一种的问题
1:单一连续分配方式
效率低只能在用户去放一道作业
2:固定分区配
无论大小是否相等都无法避免内碎片的产生
3:动态分区配
根据实际需要按需分配,内碎片没了,但随着不断地分配和回收会产生一些外碎片
4:可重定位分区配
动态分区分配再加上拼凑功能,动态分区分配也就成为了动态重定位的分区方式。动态重定位的分
区分配方式紧凑是有开销的
Q:紧凑上的开销是如何解决的的呢?
不用连续分配存储器管理方式用离散的就好了
二,(离散的内存管理)
紧凑开销过大,我们通过使用离散的内存管理方式来解决紧凑上的开销问题
连续分配方式会形成“碎片”,虽然可以通过“紧凑”解决,但开销大。如果允许将一个进程直接分散地装入许多不相邻的分区中,则无需“紧凑”,由此产生离散分配方式。
分类:
- 分页存储管理方式:离散分配的基本单位是页
- 分段存储管理方式:离散分配的基本单位是段
2.1 分页存储管理方式
1)页面与页表
1.分页存储管理的原理
分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片称为页面或页,并为各页加以编号,从0开始。
同时把内存空间分成与页面相同大小的若干个存储块,称为块或页框。在为进程分配内存时,以块为单位将进程的若干个页分别装入到多个可以不相邻的物理块中。
进程的最后一页经常装不满而形成“页内碎片”
2.分页存储管理的类别
-
基本分页式存储管理
所有页面全部进内存(第四章也就是本章中的都是把所有的都装入内存)
-
请求分页式存储管理
把部分页面装入内存,需要的时候万一没在,再请求调入内存,万一内存空间有限没有空间
允许将内存中的已有页面置换出去,让新的页面进入内存,(于第五章虚拟内存讲解)
3.页面大小的选择
-
由机器的地址结构所决定的,即由硬件所决定。
-
某一种机器只能采用一种大小的页面。
-
通常是:几KB到几十KB。
✓小:内碎片小,内存利用率高,但页面数目多,使页表过长,占大量内存,管理开销大;
✓大:页表短,管理开销小,内碎片大,内存利用率低。
页表:用于记录页在内存中的哪一块
,页太小页表需要存储的内容过多
4.页面大小
页面大小应选地适中,应是2的幂,通常是512B~8KB。
5.页表
2)地址结构
地址长度32位:
- 0~11位为位移量(页内地址),即每页的大小为4KB
- 12 ~31位为页号,地址空间最多允许有1M页
➢若给定一个逻辑地址空间中的地址为A,页面大小为L,则:
页号P = INT[A/L] (下取整)
页内地址d = [A] MOD L
一个程序有很多页
➢例如:系统页面大小为1KB,设A=2170D,则
P=2,d=122
3)基本分页式存储管理的实现
在分页系统中,允许进程的每一页离散地存储在内存的任一存储块中
为方便查找,系统为每一进程建立一张页面映像表,简称页表。页表实现了从页号到物理块号的地址映射。 在页表表项中常设置一存取控制字段,对存储块内容加以保护。
每个进程都有一个页表
4)地址变换机构
地址变换机构实现从逻辑地址到物理地址的转换,其任务是借助于页表,将逻辑地址中的页号转换为内存中的物理块号。
1.基本的地址变换机构
-
页表的功能可以由一组专门的寄存器来实现,一个页表项用一个寄存器。但寄存器成本高,系统页表可能很大,所以页表大多常驻内存。
-
在系统中只设置一个页表寄存器PTR,在其中存放系统中进程的页表在内存中的始址和页表的长度。
页表:常驻内存
页表在内存中的始址和页表的⻓度:放寄存器
- 两次访存
- 越界中断:
- 逻辑地址中出现了页表中不存在的页号
- 页内地址大于页面长度
2. 具有快表的地址变换机构
➢CPU在每存取一个数据时,需要两次访问内存:
- 第一次:访问页表,找到指定页的物理块号,将块号与页内偏移量拼接形成物理地址。
- 第二次:从第一次所得地址中获得所需数据,或向此地址中写入数据。
➢存储器利用率提高,处理器处理速度降低。
寄存器少用了,每访问一个数据都要两次访存
➢解决方法:在地址变换机构中,增设一个具有并行查询能力的特殊高速缓冲寄存器,称为“联想存储器”或“快表
5)两级和多级页表
两级页表
1. 为什么要两级页表
➢现代计算机系统都支持非常大的逻辑地址空间(\(2^{32}\) ~ \(2^{64}\)),页表就非常大,需占用较大的地址空间。
➢例如:一个具有32位逻辑地址空间的分页系统,规定页面大小为4KB即\(2^{12}\)B,则每个进程页表的页表项可达1M个,若每个页表项占用一个字节,则每个进程的页表就要占据1MB的内存空间,而且要求连续存放。
页面小了,每个进程的页表项所包含的内容过多,占内存
页面大了,离散内存管理的离散效果就不明显了
➢解决方法
- 采用离散方式
- 只将当前所需页表项调入内存
2.两级页表是什么
➢将页表分页,并离散地将各个页面分别存放在不同的物理块中,同时为离散分配的页表在建立一张页表,称为外层页表,其每个页表项记录了页表页面的物理块号。
和多维数组有些像
原来是
num[i]
(i=n,j=0)现在是
num[i][j]
(i+j=n)
➢例如: 32位逻辑地址空间,页面大小为4KB(即12位),若采用一级页表机构,应有20位页号,即页表项应有1M个;在采用两级页表机构时,再对页表进行分页,使每页包含210(即1024)个页表项,最多允许有210个页表分页。即:
外部页表有i
个地址,内部页表有j
个地址
注:
上述方法用离散分配空间解决了大页表无需大片存储空间的问题,但并未减少页表所占的内存空间。
解决方法是把当前需要的一批页表项调入内存,以后再根据需要陆续调入。
多级页表
-
两级页表对32位机器适用,64位呢?
-
解决方法:采用多级页表,将外层页表再进行分页。
练习题:
➢例1. 设页面大小为1KB,将逻辑地址3BADH划分为页号和页内偏移量两部分。⽤16进制表示。
别忘了进行物理地址的合成
2.2 分段存储管理方式
在离散的内存分配方式中,基本的分页存储管理虽然有一些优势但也有一些缺点,所以就引出来了分段存储管理方式
回顾:
分页存储管理的类别
基本分页式存储管理
所有页面全部进内存(第四章也就是本章中的都是把所有的都装入内存)
请求分页式存储管理
把部分页面装入内存,需要的时候万一没在,再请求调入内存,万一内存空间有限没有空间
允许将内存中的已有页面置换出去,让新的页面进入内存,(于第五章虚拟内存讲解)
1)分段存储管理方式的引入
➢分页从根本上克服了外零头(地址空间、物理空间都分割)。内存利用率提高。
除了最后一页会有碎片,其他页⾯是不会有碎片的
多道任务系统中每一个作业最后一页上有一些碎片,整体利⽤率还是提高了
➢缺点:无论信息内容如何,按页长分割,分割后装入内存,有可能主程序未能全部进入内存——执行速度降低。
➢ 所以考虑以逻辑单位分配内存。如
基本分页式存储管理的优点:
➢便于编程
➢分段共享
➢分段保护
➢动态链接
➢动态增长
2)分段系统的基本原理
➢分段
在分段存储管理方式中,作业地址空间被划分为若干个段,每个段定义了一组逻辑信息,都有自己的名字。
通常用段号代替段名,每段从0开始编址,并采用一段连续地址空间。段长由逻辑信息组的长度决定。
整个作业的地址空间分成多个段,逻辑地址由段号(段名)和段内地址所组成。
该地址结构允许一个作业最长有64K个段,每段的最大长度为64KB
\(64K=2^{16}\)
➢分段式存储管理的原理
作业分为若干个段。每段分配一个连续的内存区,由于各段的长度不等,这些区域也就大小不一。作业各段间不要求连续。
分段存储管理的类别
-
基本分段式存储管理的原理
在段式存储管理原理的基础上,要求将整个作业的全部段装入内存。(第四章也就是本章中的都是把所有的都装入内存)
-
请求分段式存储管理的原理
在段式存储管理原理的基础上,不要求将整个作业的全部段装入内存。只装入作业的几段即可运行,其余段可根据运行的需要再装入内存。(于第五章虚拟内存讲解)
3)基本分段式存储管理的实现
基本分段式存储管理:整个作业都要进内存,分段的话是按逻辑分段,⽽不是按照大小分段
➢段表
在分段式存储管理系统中,系统为每个分段分配一个连续的分区,而进程中的各个段可以离散地移入内存中不同的分区中。
为使程序正常运行,须在系统中为每个进程建立一张段映射表,简称“段表”。每个段在表中占有一个表项。
➢段表结构:段号;段在内存中的起始地址(基址);段长。
段表可以存放在寄存器中,但更多的是存放在内存中。
段表用于实现从逻辑段到物理内存区的映射。
此图表示一个进程中的各个段被离散的分配到内存中
比如:1号分段放在内存80k的位置,⻓度20k
在内存当中要求每一段连续分配,段与段之间没必要连续分配,可以离散,段表起到了映射的效果
上图中的作业(存储器管理是从外存调入内存,所以调入的一定是作业)被分为了4段
4)地址变换机构
➢在系统中设置段表寄存器,用于存放段表始址和段表长度,以实现从进程的逻辑地址到物理地址的变换。
在系统中只设置一个段表寄存器STR,在其中存放系统中进程的段表在内存中的始址和段表的长度
➢当段表存放在内存中时,每访问一个数据,都需访问两次内存,降低了计算机的速率。
➢解决方法:设置联想寄存器,用于保存最近常用的段表项。
5)分页和分段的主要区别
1. 从地址变换机构看:
段表比页表多了一列是因为一页里面有很多个基本存储单元,一段中也有很多基本存储单元。但一页的大小是固定的,一段的大小不固定。
注意:区分页表长度,页面长度,段表长度,段长
页表长度,段表长度是看地址中多少位是段(页)号多少位是段(页)内地址
【即由段(页)号决定】
页面长度是固定的,段在内存中的长度是不固定的,所以段表比页表多了一列
越界中断:
- 逻辑地址中出现了段(页)表中不存在的页号
- 段(页)内地址大于段(页)面长度
2.相似点
采用离散分配方式,通过地址映射机构实现地址变换
逻辑地址映射到物理地址
3.不同点
页是信息的物理单位,分页是为了满足系统的需要
段是信息的逻辑单位,含有一组意义相对完整的信息,分段是为了满足用户的需要
+++
页的大小固定且由系统确定,由系统把逻辑地址分为页号和页内地址,由机器硬件实现
段的长度不固定,取决于用户程序,编译程序对源程序编译时根据信息的性质划分
+++
分页的作业地址空间是一维的;分段的作业地址空间是二维的。
6)信息共享
➢分段系统的一个突出优点是易于实现段的共享和保护,允许若干个进程共享一个或多个分段,且对段的保护十分简单易行
分段的独有好处:以逻辑为单位
➢分页系统中虽然也能实现程序和数据的共享,但远不如分段系统方便
分页也可以共享:但共享的块越大占⽤的页表项越多
➢在分段系统中,实现共享十分容易,只需在每个进程的段表中为共享
程序设置一个段表项
段表中有一个段表项是共享的,只重复一项。段表项⽐页表项少很多
ps:个人感觉主要是一个作业在内存中的段数肯定远小于相同作业在内存中的页数,所以就共享而言分段确实比分页方便(而且分段是有实际含义的)
7)可重入代码(Reentrant Code)
➢ 又称为“纯代码”(Pure Code),在实现段共享时,需要用到可重入代码(Reentrant Code) 。它是一种允许多个进程同时访问的代码,是一种不允许任何进程对其进行修改的代码
只有读的权限没有写的权限
2.3 段页式存储管理方式
同时具备了分段,分页存储管理的优势
1)段页式存储管理方式
➢分段和分页存储管理方式各有优缺点。把两者结合成一种新的存储管理方式——段页式存储管理方式,具有两者的长处。
分段:便于信息共享
分页:严格按照大小去分,除了每道作业最后一页可能有碎片,内存的利⽤率是很高的
➢基本原理:先将用户程序分成若干段,再把每个段分成若干页,并为每个段赋予一个段名
分段存储管理的类别
-
基本段页式存储管理
把作业的所有段装入内存方可运行。(第四章也就是本章中的都是把所有的都装入内存)
-
请求段页式存储管理
没必要把整个作业装入内存,可把作业的几段或几页装入内存即可运行(于第五章虚拟内存讲解)
2)地址结构
在段页式系统中,地址结构:段号;段内页号;页内地址
三次访问外存:
- 对段表访问
- 对页表访问
- 对存储单元访问
3)段页式存储管理之例
4)段页式存储管理方式
➢在段页式系统中,为了获得一条指令或数据,需访问三次内存:
-
第一次:访问内存中的段表,取得页表始址
-
第二次:访问内存中的页表,取得该页所在的物理块号,将块号与页内地址形成物理地址
-
第三次:访问第二次所得的地址,取出指令或数据
➢缺点:访存次数增加两倍
➢解决方法:增设高速缓冲寄存器
练习题:
32个物理块:\(2^{5}\),页的大小和块的大小相同都是1KB
所以就是\(2^{15}\)
4.4 对换
1)对换(Swapping)的引入
所谓“对换”,是指把内存中暂时不能运行的进程或者暂时不用的程序和数据调出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据调入内存。对换是提高内存利用率的有效措施。
挂起是对换,对换不一定是挂起
2)对换空间的管理
在具有对换功能的OS中,通常把外存分为文件区和对换区。
文件区:用于存放文件
对换区:用于存放从内存换出的进程
由于通常的文件都是较长久地驻留在外存上,故对文件区管理的主要目标,是提高文件存储空间的利用率,为此,对文件区采取离散分配方式。
然而,进程在对换区中驻留的时间是短暂的,对换操作又较频繁,故对对换空间管理的主要目标,是提高进程换入和换出的速度。为此,采取的是连续分配方式,较少考虑外存中的碎片问题。
3)进程的换出与换入
(1) 进程的换出。每当一进程由于创建子进程而需要更多的内存空间,但又无足够的内存空间等情况发生时,系统应将某进程换出。
其过程是:系统首先选择处于阻塞状态且优先级最低的进程作为换出进程,然后启动磁盘,将该进程的程序和数据传送到磁盘的对换区上。若传送过程未出现错误,便可回收该进程所占用的内存空间,并对该进程的进程控制块做相应的修改。
(2) 进程的换入。系统应定时地查看所有进程的状态,从中找出“就绪”状态但已换出的进程,将其中换出时间最久(换出到磁盘上)的进程作为换入进程,将之换入,直至已无可换入的进程或无可换出的进程为止。