简述Linux内存分配--伙伴系统 原理

Linux内存分配——伙伴系统
目的:最大限度的降低内存的碎片化。
原理:
1.将内存块分为了11个连续的页框块(1,2,4,8....512,1024),其中每一个页框块中用链表将内存块对应内存大小的块进行链接。
2.若需要一块256大小的内存块,则从对应的256链表中查找空余的内存块,若有则分配。否则查找512等等。
3.若在256中未找到空余内存块,在512中查找到空余的内存块。则将512分成两部分,一部分进行分配,另一部分则插入256链表中。
 4.内存的释放过程与分配过程相反。在分配过程中由大块分解而成的小块中没有被分配的块将一直等着被分配的块被释放,从而和其合并。最终相当于没有划分小块。

总结:伙伴系统在分配和释放的过程中执行互逆的过程,其将会极大力度的抵消碎片的产生。


伙伴系统,其思想是:把内存块分成不同的组(1,2,4,8,16,32....);分配内存时找到能够满足条件 的最小的块;如果找不到,就找大的块,然后一分为2,分配一块,留一块;回收时:如果有相邻的同样大小的块,则合并


slab是Linux操作系统的一种内存分配机制。其工作是针对一些经常分配并释放的对象,如进程描述符等,这些对象的大小一般比较小,如果直接采用伙伴系统来进行分配和释放,不仅会造成大量的内存碎片,而且处理速度也太慢。而slab分配器是基于对象进行管理的,相同类型的对象归为一类(如进程描述符就是一类),每当要申请这样一个对象,slab分配器就从一个slab列表中分配一个这样大小的单元出去,而当要释放时,将其重新保存在该列表中,而不是直接返回给伙伴系统,从而避免这些内碎片。slab分配器并不丢弃已分配的对象,而是释放并把它们保存在内存中。当以后又要请求新的对象时,就可以从内存直接获取而不用重复初始化。


你可能感兴趣的:(操作系统/linux)