您的位置:首页 > 其它

存储管理——内存管理

2016-12-27 22:07 148 查看
存储管理中首先要面对的第一个boss是内存管理。内存管理需要考虑这两个问题:

1)内存管理需要解决什么问题?

2)内存管理方式有哪些?

那接着具体看看两个问题。

1)内存管理需要解决什么问题?

程序运行需要存储空间,将自身的代码和数据存放起来。为了更好的满足程序对内存提出的存储要求,需要解决的问题如下:

1. 重定位:如何确定程序所在的地址位置

2. 保护:程序之间相互独立的代码和数据如何确保互不干扰

3. 共享:程序之间相互通信的代码和数据如何确保通信

4. 逻辑组织:程序内部如何组织代码和数据

5. 物理组织:存储器如何组织代码和数据

简单点:需要解决怎么在存储中圈一块地出来给程序。在存储中圈的地,保证这块地的使用是当前程序说了算的,同时程序内或程序之间的是可以相互定位的。这就是内存管家需要做的事情。

2)内存管理方式有哪些?

内存管理方式是啥?就是怎么圈地!

1. 固定分区分配:每块地都是已经圈好了的,自己拿。

2. 动态分区分配:按需分配,要多少给多少。少给不行!多给不行!

3. 伙伴系统:一半分你多么,太多了,一半再分成两半分你一半,……

4. 分页分配:一个人,一块地(每块地大小一样)。一家有几个人,每个人自己拿一块地。

5. 分段分配:你家打猎,去拿山头;他家种稻,去拿良田;我家养鱼,去拿小池塘。

以上,说话的方式有点简单。

知道怎么圈地了,看看第二步,怎么分地。(先不考虑别的操作,只考虑内存够用)

2.1 固定分区分配

将内存提前分配好,一种是平均的分内存;另一种是封建的分内存。

对于平均主义式而言:

可以将程序塞到任意一个可以容纳它的内存块。

对于封建等级式而言:

把程序塞到能满足其大小的最小内存,也就是装入后剩下的空间最小的那块内存。

2.2 动态分区分配

内存会随着程序内存需求的增加,而减少相应的内存量。

其中有这样几个放置方式:首次适应算法、下次适应算法、最佳适应算法、最坏适应算法

1. 首次适应算法

按程序装入顺序,寻找能插入的内存块,如果能放进去,那就放进去咯。

2. 下次适应算法

按程序装入顺序,从上一程序装入的位置,开始寻找内存块,如果能放进去,放进去。

3. 最佳适应算法

将内存空间从小到大排序,从第一块空闲内存开始,寻找能装入的最小内存块并放入。

4. 最坏适应算法

将内存空间从大到小排序,从第一块内存开始,寻找能装入的内存。

2.3 伙伴系统

见过二叉树么?最多只有两个分支的那种,该树结点值代表内存空间大小和是否被使用,初始化根结点未整个空间。

对于某个特定的程序对内存的需求,与未分配的子结点比较,如果子结点大于两倍的申请空间,则将该子结点作为父结点,申请空间继续比较其子结点,直至装入。从而得到其内存空间介于2i≤s≤2i+1之间。

2.4 分页分配

考虑固定平均分区那样的分配方式,在此基础上,细分原有内存块的大小;将程序所需的内存划分为同样的大小;

在内存中寻找,将程序的一页分配到可能不连续的内存块中去;

通过一个页表,将程序中的逻辑地址映射到内存中的实际地址,并将映射信息保存在页表中。

2.5 分段分配:

这和分页有点像,和动态分配有点像。

将程序分成若干具有特定功能的大小可不等的段块(如数据段,代码段等等);

像申请动态分区分配那样,将不同的段分配到内存块中去;

将不同段与内存块的映射关系保存到段表中。

内存管理方式分优劣

最后看看每种分配方式(用上述的标号表示,如:2.1)的优劣:

2.1~2.3的分配方式,是将程序连续的分配到内存中,由于程序自带的这个要求,引发的后果是,大量的零碎的空间面临无法使用的情况,然而如果将其合并可能满足其他程序的需求。这个缺陷在2.1中表现为固定数量的程序可以装入内存;在2.2中表现为多次分配和回收之后,产生了极多的内存碎片;在2.3中相当于前两者而言,都较好并不是表现的拙劣。为了弥补这个缺陷,在2.2中采用碎片拼接的方法,引发的缺陷则是,移动大量内存地址,系统效率低下,而且重定位困难啊!安全措施难搞啊!(有种喜新厌旧感觉,说的一无是处了还)但是正是这种简单的分配方式,我们可以将计算机系统得以实现,在历史上是功不可没的。

2.4、2.5则一改连续分配的风格,将连续变成离散的分配到内存中去。破其一点,收获了大好前程!不仅减少了内存碎片的产生,而且能更好重定位,提供更好的保护和共享机制。尽管2.5中存在动态分配所带有的外部碎片的问题,由于是按功能划分段块,也就能提供更好的保护和共享方式。至于重定位的方式,将在虚拟内存中做介绍。

虽然内存中如何存放程序的问题看似解决了,但是,在现实中,小内存碰见大程序该如何解决;内存中存满了,调入新数据和程序时如何处理;空内存调入数据和程序时又该如何呢?

这些问题我们可以通过虚拟内存、中断机制、置换算法解决,这些将在以后分享。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存管理