操作系统笔记四(存储管理:内存分配与回收、段页式存储管理、虚拟内存)

1.存储管理

存储管理需要完成三件事
确保计算机有足够的内存处理数据
确保程序可以从可用内存中获取一部分内存使用
确保程序可以归还使用后的内存以供其他程序使用

2.内存分配与回收(从物理角度进行存储管理)

2.1内存分配的方式

其一:单一连续分配
单一连续分配是最简单的分配方式,只能在单用户、单进程的操作系统中使用。

其二:固定分区分配
固定分区分配是支持多道程序的最简单存储分配方式,内存空间被划分为若干固定大小的区域,每个分区只提供给一个程序使用,互不干扰。

其三:动态分区分配
动态分区分配是根据进程实际需要,动态分配内存空间。有相关的数据结构、分配算法。

两个数据结构:
空闲分区表:每一块空闲分区都对应一个表项,里面有分区号、分区大小、起始地址、分区状态。
空闲分区链:是一个双向循环链表,每一个节点存储一个空闲分区的相关信息。

相关算法
首次适应算法(FF算法)
首次适应算法,要求空闲分区链以地址递增的次序链接,在分配内存时,从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止,然后再按照作业的大小,从该分区中划出一块内存空间分给请求者,余下的空闲分区仍停留在空闲链中。
最佳适应算法(BF算法)
该算法总是把既能满足需求又是最小的空闲分区分配给作业。
为了加速查找,该算法需要将所有的空闲区按其大小从小到大进行排序后,当有作业要分配的时候,查找满足其内存需求,同时又是最小的空闲块,然后分配给作业。
这样每次找到的第一个满足需求的空闲区,必然是最优的。但该算法容易由于每次是查找到满足作业的最小空闲块,然后从该分区中再按照作业的大小划出一块内存空间分给作业,该分区余下的空闲分区当做一个新的空闲分区留在空闲链中,由于在没分配前该分区(满足作业的最小空闲块)大小一般不会超过该作业太多,就容易会出现在存储器中将留下许多难以利用的小空闲区,同时每次分配后必须重新排序,这也带来了一定的开销。
循环首次适应算法
该算法是由首次适应算法演变而成的。在为进程分配内存空间时,不再每次从链首开始查找,而是从上次找到的空闲分区开始查找,直至找到一个能满足需求的空闲分区,并从中划出一块来分给作业。该算法能使空闲中的内存分区分布得更加均匀,但将会缺乏大的空闲分区。
最差适应算法
最差适应算法中,该算法需要将所有的空闲区按其大小从大到小进行排序,分配时直接从空闲区链的第一个空闲分区中分配(不能满足需要则不分配)。非常显然,如果第一个空闲分区不能满足,那么再没有空闲分区能满足需要。
这种分配方法初看起来不太合理,但他也有非常强的直观吸引力:在大空闲区中放入程式后,剩下的空闲区常常也非常大,于是还能装下一个较大的新程式。

2.2内存回收的过程

内存回收的四种情况
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.段页式存储管理(从进程角度进行存储管理)

问题:操作系统是如何管理进程的空间呢?

3.1页式存储管理

在给进程分配内存时是以块为单位的,我们将进程的逻辑地址空间分成若干个页,再将这若干页分别装入到多个可以不相邻的物理块中。也就是说:页对应的是逻辑概念,块是一个物理概念;页对应的是进程,块对应的是物理内存。

①将整个系统的内存空间划分成一系列大小相等的块,每一块称为一个物理块、物理页或实页,页架或页帧(frame),可简称为块(block)。所有的块按物理地址递增顺序连续编号为0、1、2、……。
②每个进程的地址空间也划分成一系列与内存块一样大小的块,每一块称为一个逻辑页或虚页,也有人叫页面,可简称为页(page)。所有的页按照逻辑地址递增顺序连续编号为0、1、2、……。
③一个进程,只要它的总页数不大于内存中的可用块数,系统就可以对它实施分配。为进程分配内存时,一页分配一个块,作业所有的页所占的块可以不连续。因为不知道哪个页面是哪个进程的哪个部分。所以,系统同时为这个作业建立一个页号与块号的对照表,称为页表。

页表:记录进程逻辑空间与物理空间的映射。
在这里插入图片描述二级页表:现代的大多数计算机系统,都支持非常大的逻辑地址空间(232~264)。页表就变得非常大,要占用相当大的内存空间。如何解决?只将当前需要的部分页表项调入内存,其余的页表项仍驻留在磁盘上,需要时再调入即可。或者换个说法:一级页表相当于把一本书缩小成几页的目录,通过目录来找书的内容。但有个问题,如果书非常非常厚,有两本康熙字典那么大,目录也非常多,有一本高中教材那么厚。那自然而然的,继续分呗,把高中教材那么厚的一级目录就当成一本教材书,再建立一次目录二级页表由此诞生,就是把页表当数据,再建立页表

优点
较好地解决了碎片问题
打破了存储分配的连续性要求
提高了主存的利用率

缺点
页内碎片(由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“页内碎片”)
动态地址变换、方案实施需耗用额外的系统资源
存储扩充问题没有解决——作业大小受到限制,可用块数小于作业需求时需等待

3.2段式存储管理

:用户编制的程序可以由一个主程序、若干个子程序、符号表、栈以及数据等若干段组成,每一段都有独立、完整的逻辑意义,每一个段的长度可以不同
段式存储管理:以段为单位进行存储空间的管理。段内地址是连续的,段与段之间的地址是不连续的(占据内存的连续区域)

段表:系统为每个进程创建一张段映射表,每个段在表中有一个表项记录该段在内存中的起始地址(基址)和长度(段长)。
功能:实现了逻辑段到内存空间之间的映射
在这里插入图片描述分配:以段为单位进行主存分配,每段在主存中占有一个连续空间;如果在装入某段信息时找不到满足该段地址空间大小的空闲区则采用移动技术合并分散的空闲区,有利于大作业的装入

去配:检查是否存在和与回收区相邻的空闲区,有则合并。

3.3段页式存储管理

兼顾了段式在逻辑上的清晰(段是逻辑单位)和页式在管理上方便的特点。

段页式存储管理为每一个装入内存的作业建立一张段表,对每一段建立一张页表

段表的长度由作业分段的个数决定,段表中的每一个表目指出本段页表的始址和长度;页表的长度则由对应段所划分的页面数所决定,页表中的每一个表目指出本段的逻辑页号与内存物理块号之间的对应关系。
在这里插入图片描述

地址转换过程中需要三次访问内存
第一次:访问段表,获得页表始址
第二次:访问页表,获取块号,获得指令或数据的物理地址
第三次:按物理地址存取信息

4.虚拟内存

4.1虚拟内存概述

原由:
有些进程实际需要的内存很大,超过物理内存的容量。
多道程序设计,使得每个进程可用物理内存更加稀缺。
不可能无限增加物理内存,物理内存总有不够的时候。

概述:
虚拟内存是操作系统内存管理的关键技术,使得多道程序运行和大程序运行成现实,把程序使用内存划分,将部分暂时不使用的内存放置在辅存。

4.2程序的局部性原理

局部性原理是指CPU在访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。

因为有局部性原理,所以程序运行时不必全部装入内存中,只要部分即可。当访问页不在内存时,发出缺页中断,发起页面置换。

4.3虚拟内存的置换算法

先进先出算法(FIO)
思路:选择在内存驻留时间最长的页面进行置换
实现:维护一个记录所有位于内存中的逻辑页面链表,链表元素按驻留内存的时间排序,链首最长,链尾最短,出现缺页时,选择链首页面进行置换,新页面加到链尾
特点:实现简单;性能较差,调出的页面可能是经常访问的
在这里插入图片描述

最不经常使用算法(LFU)
思路:缺页时,置换访问次数最少的页面
实现:每个页面设置一个访问计数,访问页面时,访问计数加1,缺页时,置换计数最小的页面
特点:算法开销大,开始时频繁使用,但以后不使用的页面很难置换
在这里插入图片描述

最近最少使用算法(LRU)
思路:选择最长时间没有被引用的页面进行置换,因为如果某些页面长时间未被访问,则它们在将来还可能会长时间不会访问
实现:缺页时,计算内存中每个逻辑页面的上一次访问时间,选择上一次使用到当前时间最长的页面
特点:可能达到最优的效果,维护这样的访问链表开销比较大。
在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值