- 📢博客主页:盾山狂热粉的博客_CSDN博客-C、C++语言,机器视觉领域博主
- 📢努力努力再努力嗷~~~✨
💡大纲
⭕存储管理的主要目的:解决多个用户共同使用主存的问题(怎么分配内存??)
👉主要包括分区存储管理、分页存储管理、分段存储器管理、段页式存储管理以及虚拟存储管理
一、分区存储管理
(一)基本思想
👉把主存的用户区划分成若干个区域,每个区域分配给一个用户作业使用,并限定它们只能在自己的区域中运行
(二)按分区的划分方式不同:固定分区、可变分区、可重定向分区
1、固定分区
👉一种静态分区方式
👉在系统生成时已将主存划分为若干个分区,每个分区的大小可以不相等
👉操作系统通过主存分配情况表管理主存
👉这种方法的突出问题是已分配区中存在未用空间(零头、内碎片),原因是程序或作业的大小不可能刚好等于分区的大小,故造成了空间的浪费
2、可变分区
👉一种动态分区方式
👉存储空间的划分是在作业装入是进行的(及时申请),故分区的个数可变,分区的大小刚好等于作业的大小
👉可变分区分配需要两种管理表格:已分配表(记录已分配分区的情况),未分配表(记录未分配区的情况)
💡请求和释放分区主要有如下4种算法
⭕最佳适应算法
👉假设系统中有n个空白区(空闲区或自由区),每当用户申请一个空间时,将从这n个空白区中找到一个最接近用户需求的分区
👉优点:能保留较大的空白区
👉缺点:查找合适空白区的代价大(消耗时间),且空白区不可能刚好等于用户要求的区,所以必然要将一个分区一分为二,随着系统不断地分配和释放空间,可能会产生无法再继续分配的小分区(碎片)
⭕最差适应算法
👉系统总是将用户作业装入最大的空白分区
👉优点:将一个最大的分区一分为二,所以剩下的空白区通常也大,不容易产生碎片
⭕首次适应算法
👉每当用户作业申请一个空间时,系统总是从主存的低地址开始选择一个能装入作业的空白区
👉优点:当用户释放空间时,此算法更容易实现相邻的空白区合并
⭕循环首次适应算法
👉与首次适应算法的不同之处是,每次分配都是从刚分配的空白区开始寻找一个能满足用户要求的空白区
📑 例:某计算机系统的内存大小为128K,采用可变分区的分配方式进行内存分配,当前系统的内存使用情况如下图所示,现有作业4想要申请9K的内存,不同的存储分配算法各自是怎么样分配的呢?
⚠️引入可变分区后虽然主存分配更灵活也提高了主存利用率,但是由于系统在不断地分配和回收中,必定会出现一些不连续的小的空闲区
3、可重定向分区
👉是解决碎片问题简单而又行之有效的方法
👉基本思想:移动所有已分配好的分区,使之成为连续区域
⚠️分区“靠拢”的时机是用户请求空间得不到满足时或某个作业执行完毕时。当进行分区“靠拢”时会导致地址发生变化,所以有地址重定位问题
(三)分区保护的目的
💡防止未经核准的用户访问分区
1、上界/下界寄存器保护
👉作业的装入地址、结束地址
2、基址/限长寄存器保护
👉作业的装入地址、作业长度
⭕尽管分区管理方案是解决多道程序共享主存的可行方案,但是此方案的主要问题是用户程序必须装入连续的地址空间中,若没有满足用户要求的连续空间时,则需要进行分区靠拢操作,这就要耗费系统时间。为此引入了分页存储管理方案
二、分页存储管理
(一)分页管理
👉页:将一个进程的地址空间划分成为若干个大小相等的区域
👉块或页框:将主存空间划分成与页相同大小的若干个物理块
⚠️为进程分配主存时,可将进程中若干页分别装入多个不相邻接的块中
1、地址结构
💡分页系统的地址结构由两部分组成:页号P + 偏移量(页内地址)W
![](https://i-blog.csdnimg.cn/blog_migrate/af3c724f02219f7ca0b9c2d3336cd493.png)
⚠️允许的地址空间大小最多为1MB个页
2、页表
👉为保证能在内存中找到每个页面所对应的物理块,系统为每个进程建立了一张页面映射表,简称页表
👉每个页在页表中占一个表项,记录程序中的某页在内存中对应的物理块号
👉进程在执行时,系统通过查找页表,就可以找到每页所对应的物理块号,实现页号到物理块号的地址映射
3、地址变换机构
👉基本任务:利用页表把用户程序中的逻辑地址变换成内存中的物理地址
👉页表寄存器用来存放页表的起始地址和页表的长度
👉进程在执行时,系统通过查找页表,就可以找到每页所对应的物理块号,实现页号到物理块号的地址映射
⭕高级程序语言使用逻辑地址,而运行状态和内存中使用物理地址
- 优点:内存利用率高,碎片小,分配及管理简单
- 缺点:增加了系统开销,可能产生抖动现象
4、例题
📑在页式存储管理方案中,如果地址长度为 32 位,并且地址结构的划分如下图所示,则系统中页面总数与页面大小分别为 B 。
A.4K,1024K B.1M,4K C.1K,1024K D.1M,1K
🗣️页内地址的宽度就是页面大小,共有12位,即2的12次方,等于4KB。页号的宽度就是页面总数,共有20位,即2的20次方,等于1MB。
🗣️逻辑地址:5A29H,对应的内存页内地址是一样的A29H。页号为5,查表得页帧号6,所以为6A29H。
🗣️应该淘汰的是访问位为0的,由表得1、3、4均为0,但3、4不在内存里,所以应该淘汰页号为1的页面。
(二)快表
💡从地址映射的过程可以发现,页式存储管理至少需要两次访问内存
👉第一次时访问页表,得到数据的物理地址
👉第二次是存取数据
👉若采用间接寻址访问数据,还需要再进行地址变换。为了提高访问内存的速度,可以在地址映射机构中增加一组高速寄存器,用来保存页表,这种方法需要大量的硬件开销。另一种方法是在地址映射机构中增加一个小容量的联想存储器,联想存储器由一组高速存储器组成,称为快表,用来保存当前访问频率高的少数活动页的页号及相关信息
👉联想存储器存放的只是当前进程最活跃的少数几页的物理块号
👉当用户程序要访问数据时,在联想存储器中找出此数据所在的逻辑页号对应的物理块号,与页内地址拼接形成物理地址;若找不到对应的物理页号,则地址映射仍通过内存的页表进行
👉实际上,查找联想存储器和查找内存页表是并行进行的,但联想存储器的查找优先级更高,只有当通过联想存储器找不到相符的逻辑页号时才会通过查找内存页表得到物理页号
三、 分段存储管理
(一)分段存储管理方式的引入
💡段是信息的逻辑单位,因此分段系统的一个突出优点是易于实现段的共享,即允许若干个进程共享一个或多个段,可简单地实现段的保护
👉在实现程序和数据的共享时,常常以信息的逻辑单位为基础。分页系统中的每一页只是存放信息的物理单位,其本身没有完整的意义,因而不便于实现信息共享,而段却是信息的逻辑单位,有利于信息的共享和保护
👉在实际系统中,有些数据会不断地增长,而事先却无法知道数据段会增长到多大,分段存储管理方式可以较好地解决这个问题
(二)什么是分段存储管理
👉分段的基本管理方式中,作业的地址空间被划分为若干段,每段是一组完整的逻辑信息,如主程序段、子程序段、数据段及堆栈段等,每段都有自己的名字,都是从零开始编址的一段连续的地址空间,各段长度不等
👉分段系统的地址结构如图所示,逻辑地址由段号(名)和段内地址两部分组成。在此地址结构中,允许一个作业最多有216段,每段的最大长度为64KB
⚠️每一段分配一个连续的分区,进程中的各段可以离散地分配到内存地不同分区
(三)段映射表(段表)
💡每段在表中占有一表项,其中记录了此段在内存中的起始地址(又称为“基址”)和段的长度
👉利用段表寄存器中的段表长度与逻辑地址中的段号比较,若段号超过段表长度则产生越界中断。进程在执行中,通过查找到每个段所对应的内存区,实现逻辑段到物理内存区的映射
四、 段页式存储管理
💡先分段再分页,段式存储和页式存储的结合
👉优点:空间浪费小、存储共享容易、能动态连接
👉缺点:由于管理软件的增加,复杂性和开销也随之增加,需要的硬件以及占用的内容也有所增加,使得执行速度大大下降
五、虚拟存储管理
⚠️前面介绍的存储管理方案中,必须为每个作业分配足够的空间,以便装入全部信息。当主存空间不能满足作业要求时,作业便无法装入主存执行
💡如果一个作业的部分内容装入主存便可开始启动运行,其余部分暂时留在磁盘上,需要时再装入主存。这样,可以有效地利用主存空间。
👉从用户角度看,此系统所具有的主存容量将比实际主存容量大得多,人们把这样的存储器称为虚拟存储器
👉虚拟存储器是为了扩大主存容量而采用的一种设计方法,其容量是由计算机的地址结构决定的
(一)程序局部性原理
💡程序在执行时将呈现出局部性规律,即在一段时间内,程序的执行仅局限于某个部分。相应地,它所访问的存储空间也局限于某个区域内。程序的局限性表现在时间局限性和空间局限性两个方面
1、时间局限性
👉如果程序中的某条指令一旦执行,则不久的将来此指令可能再次被执行
👉如果某个存储单元被访问,则不久以后此存储单元可能再次被访问
👉产生时间局限性的典型原因是程序中存在着大量的循环操作
2、空间局限性
👉一旦程序访问了某个存储单元,则在不久的将来,其附近的存储单元也最有可能被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围内
👉其典型原因在于程序是顺序执行的
(二)虚拟存储器的实现
👉虚拟存储器具有请求调入功能和置换功能,可以把作业的一部分装入主存使其开始运行,能从逻辑上对主存容量进行扩充
👉虚拟存储器的逻辑容量由主存和外存容量之和以及CPU可寻址的范围来决定,其运行速度接近于主存速度,成本接近于外存
💡虚拟存储器实现主要有以下三种方式
1、请求分页系统
👉在分页系统的基础上,增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统👉它允许只装入若干页的用户程序和数据(而非全部程序),就可以启动运行,以后再通过调页功能的页面置换功能,陆续把将要使用的页面调入主存,同时把暂不运行的页面置换到外存上
👉置换时以页面为单位
2、请求分段系统
👉在分段系统的基础上,增加了请求调段和分段置换功能所形成的段式虚拟存储系统
👉它允许只装入若干段(而非全部段)的用户程序和数据,就可以启动运行,以后再通过调段功能和置换功能将不运行的段调出,同时调入将要运行的段
👉置换是以段为单位
3、请求段页式系统
👉在段页式系统的基础上,增加了请求调页和页面置换功能所形成的段页式虚拟存储系统
(三)请求分页管理的实现
💡请求分页是在纯分页系统的基础上,增加了请求调页功能、页面置换功能所形成的页式虚拟存储系统,是目前常用的一种虚拟存储器的方式
👉请求分页的页表机制是在纯分页的页表机制上形成的,由于只将应用程序的一部分调入主存,还有一部分仍在外存上,故需在页表中再增加若干项,如状态位、访问字段、辅存地址等供程序(数据)在换进、换出时参考
👉在请求分页系统中,每当所要访问的页面不在主存时,便产生一个缺页中断,请求调入所缺的页
👉缺页中断与一般中断的主要区别在于
- 缺页中断在指令执行期间产生和处理中断信号;一般中断指令在一条指令执行结束后,下一条指令开始执行前检查和处理中断信号
- 缺页中断返回到被中断指令的开始重新执行此指令,而一般中断返回到下一条指令执行
👉一条指令在执行期间,可能会产生多次缺页中断
(四)页面置换算法(重要)
💡置换算法的好坏将直接影响系统的性能,不适当的算法可能会导致刚被换出的页很快又被访问,需重新调入,使得系统频繁地更换页面,以致一个进程在运行中把大部分时间花费在页面置换工作上,称此进程发生“抖动”。请求分页系统的核心问题是选择合适的页面置换算法。
⭕常用的页面置换算法有:最佳置换算法、先进先出置换算法、最近最少使用置换算法、最近未用置换算法等
1、最佳(Optimal)置换算法
💡此算法选择那些永不使用的,或者是在最长时间内不再被访问的页面置换出去。但是要确定哪一个页面是未来最长时间内不再被访问的,很难估计
📑例:假设系统为某进程分配了三个物理块,进程访问页面的顺序为0、7、6、5、7、4、7、3、5、4、7、4、5、6、5、7、6、0、7、6。进程运行时先将0、7、6三个页面装入内存,最佳置换算法应用示例如下表所示:
🗣️当进程访问页面5时,产生缺页中断,根据最佳置换法,页面0将在第18次才被访问,是三页中将最久不被访问的页面,所以被淘汰。接着访问页面7时,发现已在内存中,不会产生缺页中断,依次类推
2、先进先出(FIFO)置换算法
💡此算法总是淘汰最先进入内存的页面。此算法实现简单,只需把一个进程中已调入内存的页面按先后次序链接成一个队列即可
📑例:对页面访问序列为ABCDABEABCDE,物理块从3块增加到4块,缺页次数会增加
访问页面
A
B
C
D
A
B
E
A
B
C
D
E
物
理
块
A
B
C
D
A
B
E
E
E
C
D
D
A
B
C
D
A
B
B
B
E
C
C
A
B
C
D
A
A
A
B
E
E
缺页
×
×
×
×
×
×
×
×
×
访问页面
A
B
C
D
A
B
E
A
B
C
D
E
物
理
块
A
B
C
D
D
D
E
A
B
C
D
E
A
B
C
C
C
D
E
A
B
C
D
A
B
B
B
C
D
E
A
B
C
A
A
A
B
C
D
E
A
B
缺页
×
×
×
×
×
×
×
×
×
×
📑例:假设系统为某进程分配了三个物理块,进程访问页面的顺序为0、7、6、5、7、4、7、3、5、4、7、4、5、6、5、7、6、0、7、6,利用FIFO算法进行页面置换的结果为:
🗣️从表中可以看出,共发生了12次页面置换,缺页次数为15次。缺页率:15/20 = 75%
3、最近最少使用(Least Recently Used,LRU)置换算法
💡此算法是选择最近最少未使用的页面予以淘汰,系统在每个页面设置一个访问字段,用以记录这个页面自上次被访问以来所经历的时间为T,当要淘汰一个页面时,选择T最大的页面
📑例:假设系统为某进程分配了三个物理块,进程访问页面的顺序为0、7、6、5、7、4、7、3、5、4、7、4、5、6、5、7、6、0、7、6,利用LRU算法进行页面置换的结果为:
🗣️从表中可以看出,共发生了9次页面置换,缺页次数为12次
4、最近未用置换算法
5、例题
📑在一台按字节编址的8位计算机系统中,采用虚拟页式存储管理方案,页面大小位1KB,且系统中没有使用快表(或联想存储器)。如下图所示的是划分为6个页面的用户程序。图中swap A、B是16位的指令,A和B表示该指令的两个16位操作数。swap指令存放在内存中的1023单元中,操作数A存放在内存的3071单元中,操作数B存放在内存的5119单元中。执行swap指令需要访问(1)次内存,将产生(2)次缺页中断。
(1)A. 6 B. 12 C. 18 D. 24
(2)A. 3 B. 4 C. 5 D. 6
🗣️一次页面最少要进两次内存。指令不会被拆分,数据会拆分,缺页。
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!