从linux内存管理的角度分析内存池设计与享元模式

linux的强大之处就在于任何一个点都能被别人借鉴发扬光大,成为独树一帜的知识点

今天来分析一下linux的内存管理方式,两种常见的内存分配释放方式

一:伙伴系统介绍

把所有的空闲页框分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页框块。最大可以申请1024个连续页框,对应4MB大小的连续内存。每个页框块的第一个页框的物理地址是该块大小的整数倍。

假设要申请一个256个页框的块,先从256个页框的链表中查找空闲块,如果没有,就去512个页框的链表中找,找到了则将页框块分为2个256个页框的块,一个分配给应用,另外一个移到256个页框的链表中。如果512个页框的链表中仍没有空闲块,继续向1024个页框的链表查找,如果仍然没有,则返回错误。

页框块在释放时,会主动将两个连续的页框块合并为一个较大的页框块。

伙伴系统就是对释放后内存如何组成一个大页的算法

内存池的思想:

比如现在有这么一个内存池,第二块未使用,第三块已经使用,当第一块内存释放时,会将第一块跟第二块合并,整成一个大的内存池

当需要分配内存时,总是从最接近大小的块分配,比如现在需要一个63字节大小的内存,肯定是会从第四块内存中申请,这样可以避免大块内存被使用,后面分配大块内存时不够用,这种内存池的思想完全就是借鉴的linux管理释放内存的伙伴算法

 

二:slab方式介绍

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

设计模式中的享元模式就是当一个对象要释放时,就将其先放入回收站,当需要创建一个对象时,先从回收站查找是否存在已经分配好的对象,如果存在者之间将对象返回回去使用,从概念上可以看出完成是借鉴的slab的内存管理方式

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值