嵌入式操作系统内核原理和开发(内存分配算法)

上一篇 / 下一篇  2012-06-25 13:16:41 / 个人分类:杂谈

内存分配是操作系统必 须面对的一个环节,除非这个系统本身不需要内存安排,所有业务可以通过全局数据和堆栈搞定。内存分配其实不困难,但是由内存引申出来的东西就比较复杂了。 早前没有MMU,系统本身的空间和用户空间没有优先级之分,所以不同的程序之间的内存都是共享的,相互影响也是不可避免的。所以,一般来说,除了内存分配 之外,还需要一些日志信息、检测信息帮助我们进行调试和分析。当然,这些都不是我们关心的内容,我们关注的就是内存有哪些通用的分配算法。

(?*IS8M)HpL l0  (1)固定内存分配

.Hw$j8Uq2Y(c$U0

x?1L ]n#ejq0  固定内存分配算法是最简单的算法,也是最好理解的算法。比如说有16M内存,现在我们假设分配的基本内存是4K,那么总共有16M/4K = 4K个单元。所以,如果用户想申请内存,最多就是4K次。如果用户想要多一点内存,那么系统把相邻的内存分给用户使用即可。

Z sY(JnS051Testing软件测试网/CXn/L;W Pa9_2s1U

  (2)链表内存分配51Testing软件测试网4osjYh }vP]

51Testing软件测试网/m9ZG.Y0o]

   固定内存分配虽然好,但是还有一个缺点,那就是如果存在很多的浪费机会。试想一下,如果用户只要几十个byte,那么也要分配给它4K个字节,浪费的空 间超过了99%。所以在此基础之上,我们提出了链表内存算法。链表算法中保存有空闲结点,内存释放的时候,那么内存查到空闲结点,该合并合并,该释放的释 放;当然如果要申请内存的话,那方法就多了去了,可以最差申请、最优申请、最好申请,这些都是可以的。51Testing软件测试网(^.v9S:^9?(x+f;~Y

51Testing软件测试网!O C-Tie!T:Yk"@

  (3)伙伴算法51Testing软件测试网7Z r5t6oZ3Da

)X@jx^0   链表算法相比较固定内存算法,可以节省不少内存。但是链表算法本身有一个特点,那就是容易形成内存碎片。所以,我们可以结合固定分配和链表算法的特点, 把内存分配成8、16、32、64、128、256、512大小的几种链表。链表内部的大小都是相同的,链表之间是倍数的关系。分配内存的时候,我们首先 寻找最合适的链表,然后分配内存,如果内存空间不够,可以向高一级的内存链表申请,这样拆解下来的内存可以分配到低一级别的链表;释放内存的时候,我们也 要注意内存的合并和组合。51Testing软件测试网zs7qFIC'fPY

S8b c"W)ZEx@P a;a0  (4)基于内存池的伙伴算法51Testing软件测试网9z r~4V{E

x-ct"J,Br'nQ6w6q0  伙伴算法固然好,但是如果 某一种内存申请特别频繁,那么在伙伴算法中就需要进行反复的拆分和合并处理。一方面,这会影响了内存的分配效率,另外一方面也比较容易造成内存的分配碎 片。所以,我们可以在伙伴算法的基础之上构建一个内存池,在内存释放的时候,只是标注当前内存不再使用,但是并没有真正释放,等到内存池中所有的内存都不 再使用的时候再进行释放,这在一定的程度上会提高内存的分配效率。特别是系统运行一段时间后,这种效果是特别明显的。51Testing软件测试网c?~(Xs n!B.^

$P%}c0T)RWNcb+?$W#p0  (5)工作集算法51Testing软件测试网yf? FC9j%b(]J

51Testing软件测试网J%Y HyOu(v FM O

   工作集的算法本质上说不是一种算法,它只是一种基本思想。我们知道,在系统稳定之后,内存中分配的大小、配置的比例关系都是相对固定的,变化不是特别 大。如果我们可以把这些数据给记录下来,在系统启动的时候预先分配好这些内存,那么不就可以提升系统的启动速度了吗?当然工作集中的参数设定更多的是一种 经验值,它需要我们综合各种因素进行分析,反复比较才会得出比较好的结果。51Testing软件测试网~LZG^ x {9A#i

51Testing软件测试网tm{BlW7B(]/X

  这五种算法只是给出了基本思想,只有付出于实践,多加操练才能从中有所收获。

#M6AO!r/y2Y0

相关链接:

q.}k8|`/br0

嵌入式操作系统内核原理和开发(开篇)51Testing软件测试网BO%li y M5V/C'b7f

嵌入式操作系统内核原理和开发(cpu的那些事)51Testing软件测试网,H1d^+Fo2W.v

嵌入式操作系统内核原理和开发(中断)51Testing软件测试网-\&wlg j3\3M5u

嵌入式操作系统内核原理和开发(地址空间)51Testing软件测试网"d/qY8L*T u)I#o @

嵌入式操作系统内核原理和开发(系统中断仿真)51Testing软件测试网"r3V{S:|Sqe0? [

嵌入式操作系统内核原理和开发(线程切换)51Testing软件测试网8H3C re[1~t

嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查)51Testing软件测试网;vow1d| kq)mGfgd

嵌入式操作系统内核原理和开发(多线程轮转)51Testing软件测试网Y c0u%~"D

嵌入式操作系统内核原理和开发(通用优先级调度)

cXT f/WP`wK0

嵌入式操作系统内核原理和开发(抢占式优先级调度)51Testing软件测试网6a%Le6ndw)A~

嵌入式操作系统内核原理和开发(头文件调整)51Testing软件测试网~ QyB V&['X/X.R


TAG:

 

评分:0

我来说两句

Open Toolbar