linux内核 内存管理

44 篇文章 0 订阅
8 篇文章 0 订阅

页表

页框大小为4K(也可设置为4M)

slab框架

伙伴系统在分配内存的时候是以page为单位的,但是实际上可能需求是以Byte为单位的,所以使用slab来管理小块内存

1 slab分配器是使用伙伴系统分配出来的实际的物理地址,不过slab分配器在连续的物理页面上,对小内存进行管理。

2 Linux 支持单个最大的 slab 缓存大小为32MB

3 内存框架
在这里插入图片描述
4
SLAB 类型
在SLAB分配器中将SLAB分为两大类:专用SLAB和普通SLAB。专用SLAB用于特定的场合(比如TCP有自己专用的SLAB,当TCP模块需要小内存时,会从自己的SLAB中分配),而普通SLAB就是用于常规分配的时候。我们可以使用命令 cat /proc/slabinfo 查看SLAB的状态:
在这里插入图片描述
在这里插入图片描述
有些SLAB的名字比较特别,如TCP,UDP,dquot这些,它们都是专用SLAB,专属于它们自己的模块。而后面这张图,如kmalloc-8,kmalloc-16…还有dma-kmalloc-96,dma-kmalloc-192…这些都是普通SLAB,当需要为一些小数据分配内存时(比如一个结构体),就会从这些普通SLAB中获取内存。值得注意的是,对于kmalloc-8这些普通SLAB,都有一个对应的dma-kmalloc-8这种类型的普通SLAB,这种类型是专门使用了ZONE-DMA区域的内存,方便用于DMA模式申请内存。

5 slab 作用
在SLAB中,可分配的内存块称之为对象,在后面那张图中,如kmalloc-8这个普通SLAB,里面所有的对象都是8B大小,同理,kmalloc-16中的对象都是以16B为大小。当你申请1B8B的内存时,系统会从kmalloc-8中分配一个对象给你,当你申请8B16B的内存时,系统会从kmalloc-16里给你分配。虽然即使申请5B,分配了一个8B的对象,还有3B空闲,但这样设计已经大大减小了内存碎片化了,保证了碎片内存不会超过50%(kmalloc-8除外)。需要注意,在kmalloc-8中申请到的对象,释放时也会回到kmalloc-8中。

除了减小了内存碎片化,SLAB还有一个作用,提高了系统的效率,当对象拥有者释放一个对象后,SLAB的处理是仅仅标记对象为空闲,并不做多少处理,而又有申请者申请相应大小的对象时,SLAB会优先分配最近释放的对象,这样这个对象甚至有可能还在硬件高速缓存中,有点类似管理区页框分配器中每CPU高速缓存的做法。

Vmalloc

vmalloc 首先会申请一个vm_struct 对象用于描述虚拟的地址空间,然后再通过vmalloc_area_node -> alloc_page申请实际的物理内存
Vmalloc实现原理
内核分配不连续页 - vmalloc

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值