操作系统-内存管理

内存管理

存储器结构

存储器的多层结构
在这里插入图片描述

CPU 寄存器

  • 寄存器

主存

  • 高速缓存(CPU寄存器和主存储器之间的缓冲,是一个独立的硬件,存取效率高)
  • 主存储器(通常理解的内存,内存条)
  • 硬盘缓存(固定磁盘的一部分,挂起的进程就放在这里)

辅存

  • 可移动存储介质(U盘,移动硬盘)
  • 固定磁盘(硬盘)

内存管理的基本原理

在这里插入图片描述

我们写的代码都需要通过编译成计算机能识别的指令。

连接做的主要事情,是将库和我们的代码按照一定的原则,结合起来,得到一个装入模块。

装入模块由装入程序加载到内存中,以进程的形式运行。

编译

不同的编程语言具体的实现形式不一样,不过最终都是编译为二进制语言。

链接

静态链接:在程序运行之前,就已经完成了链接,包装成装入模块,适合比较小的程序。

装入时动态链接:在装入的过程中一边装入一边链接,链接与装入并行,效率变高。

运行时动态链接:程序在内存中工作时,发现有缺失,再重新请求封装成装入模块。

装入

绝对装入:如果直接知道内存中哪块空闲,就可以直接装入到该位置,这就是绝对装入,适合单道程序,因为如果是多道会有别的进程占用该空间。

可重定位装入:根据当前内存的使用情况,把我们的程序装入现有空闲的位置,往后顺延,一次性分配完空间,适用于多道程序。

动态运行时装入:程序运行时,需要新的资源,申请分配新的空间,程序内存空间的分配不一定会连续。

注:程序装入中有逻辑地址与物理地址的转换,也叫地址重定位。在装入的过程中也要保证我们访问的空间不被别的进程访问,也叫内存保护。

内存保护:目的是让我们进程只访问自己的内存空间,其他进程也不能访问我们的进程空间。实现方式是记录我们的开始地址和结束地址,其他程序不能访问我们的内存,我们也不能访问物理地址边界外的内存空间。

内存扩充

内存扩充的两种方式:交换和覆盖

覆盖

内存中会有一块空间为覆盖区,新进来的程序,可以在覆盖区覆盖原来的程序的空间。

交换

不在内存中开辟空间,会在硬盘中开辟一块空间。并不是所有的文件访问频率都很高,不太活跃进程的可以交换到硬盘(外存)中。

连续分配管理方式

单一连续分配

在这里插入图片描述

计算机是单用户单任务的,才可以单一连续分配。

在计算机的内存中分为两大部分,系统区和用户区,系统区一般在加载系统的过程中,把系统的数据从地址为0的位置开始存储,也就是存储在低地址,用户进程在系统进程加载后才进入内存。

但是用户区的空间不一定会充分利用,空闲的用户区内存太多。

优点

  1. 实现比较简单,从用户区的地址开始连续分配,需要多少地址就放多少地址。
  2. 无外部碎片,整个用户区都被用户进程A占用,除分配给用户进程A的内存空间外没有空闲内存。
  3. 不一定需要内存保护,单用户单进程的情况下,整个用户区都是自己的空间,可以随意使用。但从逻辑上讲,分为系统区和用户区,也不一定是完全不能互相访问。

缺点

  1. 只能用于单用户、单任务操作系统
  2. 有内部碎片
  3. 存储器利用率低

固定分区分配

在这里插入图片描述

预先已经对用户区进行分区,使用分区说明表对每块分区记录下来,记录分区的编号,大小,起始地址,当前是否使用。

在这里插入图片描述

优点

  1. 实现简单
  2. 无外部碎片

缺点

  1. 较大用户程序时,需要采用覆盖技术,降低了性能
  2. 会产生内部碎片,利用率低

动态分区分配

在这里插入图片描述

根据进程的需要,建立分区,可以使用空闲分区表进行记录,只记录空闲的分区,这样在分配的时候更加高效。

在这里插入图片描述

它也是一种数据结构,可以使用数组或者链表(双向链表)实现。

在这里插入图片描述

选择哪个分区给新进程

首次适应算法:从地地址查找合适空间

最佳适应算法:优先使用最小空闲空间

最坏适应算法:优先使用最大连续空间

临近适应算法:从上次查找处向后查找

算法算法思想分区排序优缺点
首次适应从低地址查找合适空间地址递增排列综合性能最好,开销小;不需要(对空闲分区)重排序;
最佳适应优先使用最小空闲空间容量递增排列更容易满足大进程需求;小碎片多,开销大,需要重排序;
最坏适应优先使用最大连续空间容量递减排列小碎片少;不利于大进程,开销大;
临近适应从上次查找处向后查找地址递增排列(循环链表)不用每次从链表头查找,开销小;会使高地址大分区被用完;

已使用的分区怎么回收

内存在回收后将相邻空间进行合并,然后更新空闲分区表和/或空闲分区链记录;

非连续分配与管理方式

用户区的内存被分的比较碎,即使我们没有连续的空间,使用非连续的方式也能进行分配,尽可能多的利用内存。

在这里插入图片描述

这样的非连续的分配,我们的数据将存储在不同的内存块中,需要数据结构进行管理,这样记录的数据结构也是占用内存的。

基本分页存储管理方式

将内存分为大小相等的分区(固定分区):页框/页帧/内存块/物理块;页框号/页号从0开始;OS以页框为基本单位分配内存。

将页的大小变小,让内存空间能更好的利用起来。

在这里插入图片描述

用户进程的物理地址是通过分页的,我们也会将用户进程的逻辑地址也进行分页,大小与内存的分页大小保持一致。

在这里插入图片描述

基本地址变换机构

​ 物理地址 = (页号->块号 ) + 偏移量

​ 页号P = 逻辑地址A / 页面长度 (大小)L

​ 偏移量W = 逻辑地址A % 页面长度L

​ P = A >> 12; W = A & 4095

基本地址变换机构的特点

  • 页式管理中地址空间是一维的。

    页号是顺序递增的,块号是随机的,这两个组合在一起可以理解为数组,块号是数值,页号就是块号的索引。

  • 每次访问内存都需要地址转换,必须足够快。

  • 页表不能太大,会降低内存利用率。

在这里插入图片描述

具有快表的地址变换机构

原来的页表存在于内存中,每次通过逻辑地址寻找物理地址的过程,都需要访问两遍储存器(第一遍访问页表找到块号,第二遍通过块号找到物理地址),效率比较差。

此时我们引入快表的概念,将原来的页表称为慢表,把慢表中的部分数据放入高速缓冲区(高速穿冲区在主储存器和寄存器之间,访问效率更高)

快表中的数据是一次一次加进来的,访问过的数据加入到快表中,快表就不会像慢表一样是连续的,它就是页号和块号的对应关系,是二维的。

在这里插入图片描述

页表的问题

页表是一个数组,需连续存放,占用大量连续空间。通过我们的动态装入,就能减少我们的页表大小,但是数组是不能扩容的,所以页表一旦确定就不能改变,所以在动态装入时需要有分页的思想,分页离散存储。

动态加载的时候,每次加载都生成一个页表,此时只需要在创建一个目录表管理离散页表即可。

在这里插入图片描述

对于32位的机器而言,我们可以将最高十位作为一级页号,中间10位作为二级页号,最后12位作为业内地址(偏移量)

在这里插入图片描述

基本分段存储管理方式

分页管理是将磁盘按照固定大小进行划分,分段管理是根据应用程序程序进程按照一定规则划分,分段的大小是不确定的,且每一段都从0开始编址。

在这里插入图片描述

地址变换机构

在这里插入图片描述

高16位表示短号,低16位表示端内地址。

段的共享与保护

如果我们的子程序需要2号段的内容,其它的子程序也需要2号段,他们都在自己的段表中添加2号段就行。

每次取值也都需要进行越界判断。

分页与分段方式对比

  • 分页和分段都属于非连续分配管理方式,也就是进程内容是分布在内存的不同区域。
  • 分页是根据固定的大小进行划分,是属于物理上的划分。
  • 分段是根据程序进行划分,按照自己的逻辑进行划分,是逻辑上的概念。
  • 分页的页表只需要存储分页的块号,是一维的地址空间。
  • 分段因为每个段的长度不固定,需要记录每段的段长,是二维的空间地址。
  • 页表默认在内存中,我们在寄存器中加入了快表。因为分段其实分配不了多少段(不占用多少内存),段表直接存储在寄存器中。
  • 分段更容易实现信息共享和保护。因为分页粒度比较小,实现共享更复杂。

段页式管理方式

分段和分页其实并不冲突,分段是对程序的分段,分页是对物理地址的分页,两者可以结合起来使用。

优点缺点
分页管理内存利用率高,不会产生外部碎片,少量内部碎片不好按照逻辑模块实现信息共享和保护
分段管理容易按逻辑模块实现信息共享和保护段长较大时,不便分配空间;会产生外部碎片

段页式管理方式,先进行分段,再进行分页。一个进程拥有一个段页表(段和页之间的对应关系),段页表的一个段页表项对应一个页表,一个页表又对应多个物理块。

因为一个段可能占用多个页,所以用一个页表记录这个段所记录的多个内存中的物理块。

在这里插入图片描述

根据单页式管理方式访问

  1. 根据段表始址+段号找到段表项

    段表始址和段表长度存储在寄存器中,通过段表始址可以知道段表放在内存中的什么地方,然后根据段号找到段表项。

  2. 根据页表长度检查页号越界情况,

  3. 页表地址+页号找到页表项

    页表地址在段页表中存储,找到页表后再根据页号找到块号

  4. 内存块号+内页地址得到物理地址

在这里插入图片描述

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值