您的位置:首页 > 其它

【操作系统】 存储管理

2016-03-12 21:37 274 查看
    关于计算机的存储管理,大体上其实就是如何分配内存的问题。我们都知道我们的程序是存放在硬盘里的,而运行程序是需要把程序读到内存里,然后CPU才可以处理程序。在这里,CPU和内存是直接交流的,硬盘和CPU是无法交流的,硬盘那就是个存东西的地。流程就是
硬盘→内存→CPU。

    举个简单的例子,如果我们下载了一个5G大小的游戏,然后把游戏安装在了D盘了。那么我们打开游戏开始运行的时候,电脑是如何操作的呢?第一步把游戏的数据读到(复制到)内存里,然后CPU处理内存中这个程序的数据,然后游戏,开始。

1.程序是怎么放进内存的?——重定位,我们来重新排排座

    内存作为一个看得见摸得着的东西,它的每一个存储单元都是有实际的物理地址的。这里可以把内存上每一个单元的内存都看做一个小房间,每个房间都有它的唯一门牌号。

    但是我们写程序的时候,可是不知道到时候内存的哪里是空着可以使用的,我们最后究竟会放在哪里?所以我们的程序拥有的只是逻辑上的地址,而并不是真实的物理地址。要想要程序正常运行,我们必须把所有的逻辑地址转换为他们真实存在内存上的物理地址,否则,程序连他自己的数据都找不到那还怎么运行。

    如果我们写了一段4k的程序,它的逻辑地址可能是1-4000,但是物理地址那就没准了,可能是1001-5000(前面的被其它程序占了),我们要找到具体的数据,必须要从1001-5000里面找。举个例子,如果内存是房间,一个个旅游队是程序的话,他们可能在出发前就有各自的序号,但是住进具体的房间后,就不能按照原来的序号了,要想找到具体的人,那得按现在重排的房间号来找,这里的房间号就是具体的物理地址。

静态重定位:把作业中的指令地址和数据地址全部转换成绝对地址。

   例:如果旅行队有100人,一次性的把连续的100个房间分给他们,比如房间101—200

动态重定位:设置基址寄存器,指令执行的过程中通过地址转化机动态的转化地址。

   例:还是那100人,分两次来,第一波的基址是101,则他们房间动态分配为101—150,第二波的基址是301,则他们的房间动态分配为301—350

2.内存如何划分之第一阶段——固定分区,以不变应万变

    固定分区管理就是:把主存储器中可分配的用户区域预先划分成若干个连续区,每一个连续区称为一个分区

    现在我们可以知道装入内存的作业都是大小不一的连续程序段,所以最开始的内存就是提前分配好大小不一的分区,以便各种程序可以直接装入内存,方便他们的重定位。

    这样设计的原因很淳朴,就像我们刚管理一个宾馆,面对一个个不同大小的旅游队,他们各自都要求连续的房间,所有我们会天然的把自己的房间分成一组组大小不一的房间组,方便旅游队挑选合适的套餐。

    但是暴露出来的问题就是:内存资源的浪费(因为不可能正好合适,每个分区肯定都用不完)

3.内存如何划分之第二阶段——可变分区,以变制变

    可变分区:分区的长度不是预先固定的,而是按作业的实际需求来划分的;分区的个数也不是预先确定的,而是由装入的作业数决定的。

    由于固定分区造成资源的浪费,那就进行可变分区,你要多少内存我就给你多少内存。

    按照刚才的那个例子,如果我们管理这1000房间,那么就根据每个旅游队的人数具体给他们分配不同数量的连续房间。但是又出问题了,如果是100人,200人,300人按顺序入住之后,200人退出之后,房间按理说剩下600间,但是如果有个500人的队伍是进不去的,因为此时房间的状态是 100、200(空)、300、400(空),没有500的连续房间,如果后面有更小的队伍,会不断的插入连续区,随着各个队伍的进入,整个房间一直处于各种切断的状态,也就是没有完整的连续区。

    这时候,就引入了最先适应分配算法、最优适应分配算法、最坏适应分配算法来解决,同时也用移动技术来集中分散的空闲区,这里很像磁盘中的碎片清理,通过移动那些空闲区集中起来就可以得到完整的连续区。

    但是这样也会造成系统的开销,同时移动也是有条件的,不是什么都能移的。

4.内存如何划分之第三阶段——页式虚拟,分批发放

    分页式存储管理:把主存储器分成大小相等的许多区,每个区称为一块。与此对应,编制程序的逻辑地址也分成页,页的大小与块的大小相等。

    通过分页存储管理,就可以解决可变分区必须通过移动来得到连续分区的困境,同时也可以有效的解决固定分区造成的浪费。

    还是刚才的例子,如果我们继续分1000个房间的话,我们将房间分为10间为一组(一层也可以),所以可以划分100层,也就是10³=10²X10¹。类比于分页就是分了100页,每页10个地址。那么同时旅游队也是按照10人一组编组,有几组就分几层。只要我们知道自己对应的层数就可以完整的获得所有的队员,同理,只要我们知道程序对于的所有页数,就可以知道程序所有的地址。

    每次的划分,我们只需要提供足量的页数,标明每一页具体对应的内存区,以及每一页对应的程序段,就可以完成内存分配。这样我们可以不用分配连续的页数,不用移动技术来浪费开销,也可以很好降低浪费。

总结:

    

    回顾一下刚才的例子,1000个房间,120人,220人,320人相继进入,220人退出后400人想要进入。

    固定分区分为100,200,300,400,结局是:100(空),200(存120),300(存220),400(存320),后果是资源浪费;

    可变分区处理完220退出后,结局是:120(存120),220(空),320(存320),320(空),即使现在共空余540,但是400还是进不去,只有通过移动技术才可以解决;

    分页存储管理,都以10为单位,处理完220退出后是:120(分12页),220(空22页),320(分32页),320(空32页),所以空54页,400人用其中40页就可以解决,只需要用一张表记录每一个小组对应的那一页就可以,不需要连续,完全可以分页运算找到具体的位置。

    可以看出,内存管理是不断进化的,既要效率同时也要避免浪费。

    在操作系统的这部分学习过程中,我们可以很好体会到硬件和软件的结合后产生的各种问题,通过各种天才般的处理让软件和硬件更好的结合,充分提高效率。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: