内存分配-----伙伴算法buddy和slab算法

本文探讨了内存管理中的伙伴算法和slab算法。伙伴算法将内存按2的幂次方划分,简单易行但可能导致内存浪费;slab算法针对小块内存,通过对象缓存提高分配效率,减少碎片。slab缓存分配器适用于频繁分配和回收的小对象,支持初始化优化和硬件缓存对齐,提升系统性能。
摘要由CSDN通过智能技术生成

内存管理问题:

内存碎片大小和管理内存碎片的效率问题(即空间和时间效率的问题):

内存碎片是指当回收一块内存时,一般将内存直接放入free链表中,由于内存越分配越小,内存块就会特别多而且特别小,当需要一块大的内存块的时候无法找到.原因就在于回收内存的时候,不能把相邻两块可用内存合并.

解决方法:

1.小块内存单独分配,大块内存有系统自动分配.(nginx和stl就是使用这种方法)

2.伙伴算法.

3.slab算法.

 

伙伴算法:

1.将空闲页面分为m个组,第1组存储2^0个单位的内存块,,第2组存储2^1个单位的内存块,第3组存储2^2个单位的内存块,第4组存储2^3个单位的内存块,以此类推.直到m组.

2.每个组是一个链表,用于连接同等大小的内存块.

3.伙伴块的大小是相等的,并且第1块和第2块是伙伴,第三块和第四块是伙伴.以此类推.

 

伙伴算法分配内存:

若申请的内存大小为n则将n向上取整为2的幂设次数为s,则需要分配s大小的内存块,定位大相应数组,

1.如果该数组有剩余内存块,则分配出去.

2.若没有剩余内存块就沿数组向上查找,然后再将该内存块分割出来s并将剩余的内存块放入相应大小的数组中.

例如分配5大小的内存块

----------->定位到大小为8的链表中 -------->若该链表中之中没有空余元素,则定位到16的链表中,16中有剩余元素,则取出该元素,并分割出大小为8的内存块供用户使用,然后将剩余的8连接到大小为8的数组中.

 

伙伴算法的内存合并:

当用户用完内存后会归还,然后根据该内存块实际大小(向上取整为2的幂)归入链表中,在归入之前,

1.我们还要检测他的伙伴内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值