linux 内存分配 释放,Linux中的内存分配和释放之slab分割器

Linux中的内存分配和释放之slab分割器

slab分配器形象地说就是先由伙伴机制申请空闲内存空间,然后slab分配器再把这个内存空间进行分割,按同样大小来进行分割,最后再用一些数据结构来进行管理。上面只是形象地说法。我们平时把由slab进行分割后的内存我们称之为高速缓存内存。这样看来就知道所谓的高速就是说不是每次分配和释放内存都要找伙伴机制,可以先访问这些高速内存的,和我们前面文章中提到的冷热区是一个作用的。我们会发现我们原来说的冷热区和伙伴机制,都是以页为单位进行分配的。这就有点限制了,为什么我不可以再按小点的内存去分配呢?所以就产生了slab分配器了。

当我们从高速缓存内存中分配对象时(这里我们不再说内存页了,我们该为对象,即内存对象),首先检查对应处理器的高速缓存内存阵列中是否有未使用的内存对象。什么是处理器的高速缓存内存阵列?--kmem_cache_t结构里面也为每个处理器预留一个高速缓冲内存阵列(struct array_cache),我们都是用其成员*array[NR_CPUS]这个指针数组里面的每个成员都是指向struct array_cache结构变量,紧跟在struct array_cache结构后面的是连续存放的该struct array_cache结构指定个数的对象指针,这些指针指向的对象就是将来要被分配的空间。kmem_cache_t结构就是算是我们说的高速缓存内存的描述结构。

如果我们发现对应处理器的高速缓存内存阵列中有未使用的内存对象,直接把我们刚才说的struct arrary_cache结构指定个数的对象指针传给调用者。如果没有,那么首先查找共享高速缓存内存阵列中是否有可用的对象,在高速缓存内存描述结构(struct kmem_cache_t)中有一个成员可以访问到它,就是struct kmem_list3 lists中的share成员。其实这个是真正多个cpu的时候才会采取的方案。如果发现这里有可用内存对象的话,我们先把内存对象的地址复制到对应处理器的高速缓存内存阵列中,再从处理器的高速缓存内存阵列中分配对象。

一般情况如果共享高速缓存内存阵列中也没有可用对象时,我们就去查找部分空闲和全部空闲slab列表。struct kmem_list3 lists是高速缓存内存描述结构struct kmem_cache_t的成员,这个链表结构就是用来描述上述的slab列表。链表结构描述了三种高速缓存内存单位,由一个struct slab结构管理的一组特定大小的内存对象叫做一个高速缓存内存单位,一个内存单位包括一些大小一致的内存对象、一些色块(不会被调用的,只是起到对齐的用途)、一个struct slab结构、与每个�

相关文档:

一.前言

Linux拥有丰富各种源代码资源,但是大部分代码在Windows平台情况是无法正常编译的。Windows平台根本无法直接利用这些源代码资源。如果想要使用完整的代码,就要做移植工作。因为C/C++ Library的不同和其他的一些原因,移植C/C++代码是一项困难的工作。本文将以一个实际的例子(Tar)来说明如何把Linux代码移植 ......

Linux I2C核心、总线与设备驱动

注:

在linux2.6.32版本中有这样的代码与注释:

struct i2c_driver {

unsigned int class;

/* Notifies the driver that a new bus has appeared or is about to be

* removed. You should avoid using this if y ......

引用:http://blog.chinaunix.net/u/12207/showart_2061214.html

关于2.6.31遇到的问题

错误提示1:

drivers/built-in.o(.init.text+0x3bad): In function `con_init':

include/trace/events/kmem.h:47: undefined reference to `.L1452'

解决:

vi /usr/src/linux/drivers/char/vt.c 找到static int __init con_init ......

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define NTP_SERVER "clock.via.net"

#define ......

linux下静态库嵌套使用

前提是你会在linux下调用静态库和动态库和Makfile编程(当然不会Makfile直接在终端命令也成)

本例是先由StringLen.h,StringLen.c生成librak.a

然后利用StringLen2.h,StringLen2.并调用librak.a生成librak2.a

最后利用StringLen3.h,StringLen3.c调用librak2.a 生成librak3.so

------------------ ......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值