储存管理(操作系统)一

储存管理(操作系统)

​ 内存是计算中重要资源,每个程序员都梦想着拥有私有的,“取之不尽用之不竭”,并且是永久性的(断电也不会丢失的乃种)内存。

​ 那是不可能滴,既然是有限的,我们如何让他能够满足我们的需求,产生无限的价值呢,那么储存管理就显得尤为重要。

操作系统中管理分层储存器体系的部分称为存储管理器,他的任务是有效的管理内存,即记录那些内存是正在使用的,那些内存是空闲的;在进程中那些需要分配的,那些是需要释放的。

​ 那么接下来,我们将从最简单的管理方案开始讨论学习,并逐步深入。

1.无储存管理

​ 最简单的储存管理,就没有抽象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AudSPMMn-1620994333847)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210514174049035.png)]

​ 简单的说,就是当0001位置存储的是系统程序,但是你执行的程序将其覆盖了,那么系统执行时,将出现崩溃。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f8kS90tS-1620994333850)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210514174912595.png)]

​ 1-1示例:
在这里插入图片描述

​ 如上图所示,程序A和B加载到C上运行时,当A程序执行一段时间之后,程序执行至16384处,执行程序B,他将跳转到28处执行add,从而导致崩溃

2.一种储存器抽象:地址空间

地址空间时一个进程可用于寻址内存的一套地址集合。 每一个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程。

地址空间:

  1. 可解决用户程序破环系统
  2. 可解决多个程序在一个cpu上执行困难

基址寄存器与界限寄存器<用于时间对多程序运行的保护和重定位>

​ 详细介绍一下:
基址寄存器和界限寄存器是给每个进程提供私有的地址空间

基址寄存器:在每个内存地址送到内存之前都加上基址<重定位>

界限寄存器:防止地址越界<保护>

​ 那么这时我们再次思考一下,1-1实例 ,是不是就可以完美的解决了。但是呢,他每次访问都需要进行加法和比较。比较可以很快,但是加法由于进位传递时间问题,在没有使用特殊电路的情况下会很慢。

2.1 交换技术

​ 计算机内存有限,无法将所有的进程保存,那么处理内存超载的通用方法有 交换技术和虚拟内存

​ 交换技术:把一个进程完整的调入内存,进程运行一段时间,然后把他存回磁盘。空闲的进程就储存在磁盘上,当他们不运行时,就不会占用内存。

​ 2-1 示例:

​ 现有A、B、C、D四个程序,依次执行
在这里插入图片描述

​ 在交换之中会产生多个空闲区,如果把所有的程序下移很浪费时间。而且程序在运行时,数据和堆栈的大小并不是一成不变的,所有 在进程创建和换入时,需要多为其分配空间 在进程换出时,也无需将空闲区交换出去。

​ 视图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rag6zHzo-1620994333855)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210514185604652.png)]

空闲区可供数据和堆栈同时使用,当空闲区被用光,则需要迁移到更大的空间,或者结束进程。

2.2空闲内存管理

​ 在程序运行过程中,动态的分配内存时,就会产生类似于下图的空闲空间

​			[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PjUnIVdY-1620994333857)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210514191622468.png)]

​ 一般而言,有两种方式跟踪内存的使用情况

​ 1.位图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pyZPA7Ny-1620994333858)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210514192726921.png)]

​ 分配单元的大小是一个重要的设计因素,分配单元越小,位图就会越大;分配单元大了或者进程不是分配单元的整数倍,则会产生浪费。

在查找位中指定的长度连续0串是耗时的操作,因为在位图中可能跨越边界,这就是位图的缺点 ,以2位或者2位以上位分配单元,在查找时就有可能发生越界。

​ 2.使用链表的储存管理

在这里插入图片描述

​ 结点的含义:

空闲区(H)或者进程(P),起始地址,长度 和指向下一个结点的指针

​ 当一个进程结点P结束时,则会将其改为空闲区(H),并于相邻空闲区合并,删除一个或两个结点。

​ 综上所述:

​ 段链表使用循环双链表可能要比单链表更加方便,这样的结构更易于找上一个结点,并检查时候可以合并。

2.3存储管理器分存的五种算法

​ 1.首次适配算法(First Fit)

​ 简单解释,当一个进程申请5个字节大小的空间时,我们就去找空闲区,如果发现的第一个大于等于5个字节的空闲区,那么我们就分离出5个字节大小给他。

​ 2.下次适配算法 (Next Fit)

​ 下次适配可不是找第二个合适的,他是基于首次适配算法,但是他每次开始搜索时,不是从头开始搜索,而是从上次结束的地方开始。

​ 3.最佳适配算法(Best Fit)

​ 最佳适配算法试图找到最接近实际需要的空闲区。

​ 4.最差适配算法(仿真系统表面他也不是好主意)

​ 最佳适配找最接近,那么他就是找最不接近的,那么就是找最大的。为什么说他不是个好主意呢,因为他会把大的空间全部搞成小的,当你需要大的空间的时候,你找不见了。

综上 :

​ 最佳和最差适配算法要比首次适配和下次适配算法效率低。

​ 意外:最佳适配比首次适配算法和下次适配算法更浪费内存

​ 因为最佳适配算法,会产生大量无用的小的空闲区,这也就是内部碎片。

​ 虽然我们可以对其进行优化,比如将空闲区和进程段链表分离,使用两个不同的链表进行维护;他可以提高算法的速度,但是产生的代价是增加复杂度和内存释放速度。当然我们也可以对空闲区大小进行排序、对数据结构进行优化,空闲区的第一个字存放空闲区大小,第二个字指向下一个空闲区等等,但是优化也伴随着复杂度的增加。

​ 5.快速适配算法(Quick Fit)

快速适配算法,对空闲区进行划分,将其划分成常用大小的空闲区,然后用单独的链表进行维护;虽然他们快速适配常用大小的空闲区,但是程序终止后的合并过程时,非常耗时的。
在很多的内存池中,采用的就是这种思想。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Yi_Xiao

来瓶可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值