我是靠谱客的博主 安详含羞草,最近开发中收集的这篇文章主要介绍存储管理——内存管理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

存储管理中首先要面对的第一个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 伙伴系统

见过二叉树么?最多只有两个分支的那种,该树结点值代表内存空间大小和是否被使用,初始化根结点未整个空间。
对于某个特定的程序对内存的需求,与未分配的子结点比较,如果子结点大于两倍的申请空间,则将该子结点作为父结点,申请空间继续比较其子结点,直至装入。从而得到其内存空间介于 2is2i+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中存在动态分配所带有的外部碎片的问题,由于是按功能划分段块,也就能提供更好的保护和共享方式。至于重定位的方式,将在虚拟内存中做介绍。

虽然内存中如何存放程序的问题看似解决了,但是,在现实中,小内存碰见大程序该如何解决;内存中存满了,调入新数据和程序时如何处理;空内存调入数据和程序时又该如何呢?
这些问题我们可以通过虚拟内存、中断机制、置换算法解决,这些将在以后分享。

最后

以上就是安详含羞草为你收集整理的存储管理——内存管理的全部内容,希望文章能够帮你解决存储管理——内存管理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(29)

评论列表共有 0 条评论

立即
投稿
返回
顶部