- 📢博客主页:盾山狂热粉的博客_优快云博客-C、C++语言,机器视觉领域博主
- 📢努力努力再努力嗷~~~✨
💡大纲
⭕存储管理的主要目的:解决多个用户共同使用主存的问题(怎么分配内存??)
👉主要包括分区存储管理、分页存储管理、分段存储器管理、段页式存储管理以及虚拟存储管理
一、分区存储管理
(一)基本思想
👉把主存的用户区划分成若干个区域,每个区域分配给一个用户作业使用,并限定它们只能在自己的区域中运行
(二)按分区的划分方式不同:固定分区、可变分区、可重定向分区
1、固定分区
👉一种静态分区方式
👉在系统生成时已将主存划分为若干个分区,每个分区的大小可以不相等
👉操作系统通过主存分配情况表管理主存
👉这种方法的突出问题是已分配区中存在未用空间(零头、内碎片),原因是程序或作业的大小不可能刚好等于分区的大小,故造成了空间的浪费
2、可变分区
👉一种动态分区方式
👉存储空间的划分是在作业装入是进行的(及时申请),故分区的个数可变,分区的大小刚好等于作业的大小
👉可变分区分配需要两种管理表格:已分配表(记录已分配分区的情况),未分配表(记录未分配区的情况)
💡请求和释放分区主要有如下4种算法
⭕最佳适应算法
👉假设系统中有n个空白区(空闲区或自由区),每当用户申请一个空间时,将从这n个空白区中找到一个最接近用户需求的分区
👉优点:能保留较大的空白区
👉缺点:查找合适空白区的代价大(消耗时间),且空白区不可能刚好等于用户要求的区,所以必然要将一个分区一分为二,随着系统不断地分配和释放空间,可能会产生无法再继续分配的小分区(碎片)
⭕最差适应算法
👉系统总是将用户作业装入最大的空白分区
👉优点:将一个最大的分区一分为二,所以剩下的空白区通常也大,不容易产生碎片
⭕首次适应算法
👉每当用户作业申请一个空间时,系统总是从主存的低地址开始选择一个能装入作业的空白区
👉优点:当用户释放空间时,此算法更容易实现相邻的空白区合并
⭕循环首次适应算法
👉与首次适应算法的不同之处是,每次分配都是从刚分配的空白区开始寻找一个能满足用户要求的空白区
📑 例:某计算机系统的内存大小为128K,采用可变分区的分配方式进行内存分配,当前系统的内存使用情况如下图所示,现有作业4想要申请9K的内存,不同的存储分配算法各自是怎么样分配的呢?
⚠️引入可变分区后虽然主存分配更灵活也提高了主存利用率,但是由于系统在不断地分配和回收中,必定会出现一些不连续的小的空闲区
3、可重定向分区
👉是解决碎片问题简单而又行之有效的方法
👉基本思想:移动所有已分配好的分区,使之成为连续区域
⚠️分区“靠拢”的时机是用户请求空间得不到满足时或某个作业执行完毕时。当进行分区“靠拢”时会导致地址发生变化,所以有地址重定位问题
(三)分区保护的目的
💡防止未经核准的用户访问分区
1、上界/下界寄存器保护
👉作业的装入地址、结束地址
2、基址/限长寄存器保护
👉作业的装入地址、作业长度
⭕尽管分区管理方案是解决多道程序共享主存的可行方案,但是此方案的主要问题是用户程序必须装入连续的地址空间中,若没有满足用户要求的连续空间时,则需要进行分区靠拢操作,这就要耗费系统时间。为此引入了分页存储管理方案
二、分页存储管理
(一)分页管理
👉页:将一个进程的地址空间划分成为若干个大小相等的区域
👉块或页框:将主存空间划分成与页相同大小的若干个物理块
⚠️为进程分配主存时,可将进程中若干页分别装入多个不相邻接的块中
1、地址结构
💡分页系统的地址结构由两部分组成:页号P + 偏移量(页内地址)W

⚠️允许的地址空间大小最多为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的页面。
(二)快表
💡从地址映射的过程可以发现,页式存储管理至少需要两次访问内存
👉第一次时访问页表,得到数据的物理地址
👉第二次是存取数据
👉若采用间接寻址访问数据,还需要再进行地址变换。为了提高访问内存的速度,可以在地址映射机构中增加一组高速寄存器,用来保存页表,这种方法需要大量的硬件开销。另一种方法是在地址映射机构中增加一个小容量的联想存储器,联想存储器由一组高速存储器组成,称为快表,用来保存当前访问频率高的少数活动页的页号及相关信息
👉联想存储器存放的只是当前进程最活跃的少数几页的物理块号
👉当用户程序要访问数据时,在联想存储器中找出此数据所在的逻辑页号对应的物理块号,与页内地址拼接形成物理地址;若找不到对应的物理页号,则地址映射仍通过内存的页表进行
👉实际上,查找联想存储器和查找内存页表是并行进行的,但联想存储器的查找优先级更高,只有当通过联想存储器找不到相符的逻辑页号时才会通过查找内存页表得到物理页号
三、 分段存储管理
(一)分段存储管理方式的引入
💡段是信息的逻辑单位,因此分段系统的一个突出优点是易于实现段的共享,即允许若干个进程共享一个或多个段,可简单地实现段的保护
👉在实现程序和数据的共享时,常常以信息的逻辑单位为基础。分页系统中的每一页只是存放信息的物理单位,其本身没有完整的意义,因而不便于实现信息共享,而段却是信息的逻辑单位,有利于信息的共享和保护