Linux内核 内存管理(5)页面分配机制

1.伙伴算法

伙伴算法是按照2的幂次方大小进行分配内存块,这些内存块称为伙伴

什么是伙伴?

两个快大小相同,地址连续,是同一个大块分离出来的

example:

2.内核实现

按照order和迁移类型进行分开

(过去和现在伙伴系统对比图)

伙伴系统引入迁移类型是为了解决碎片化问题:

unmovable:在内存中有固定位置,不能随意移动,比如内核分配的内存

movable: 可以随意移动,用户态app分配的内存

reclaimable:不能移动可以删除回收,比如文件映射

3.内存碎片化的产生

4.page分配和释放函数

分配

https://elixir.bootlin.com/linux/v6.6/source/mm/mempolicy.c#L2281

释放

https://elixir.bootlin.com/linux/v6.6/source/mm/page_alloc.c#L4523

5.zone水位

6.内存分配标志位

7.per-cpu页面分配

内核经常请求和释放单个页框,比如网卡驱动等等

页面分配器分配和释放页面的时候需要申请一把锁:zone->lock

为了提高单个页框的申请和释放效率,内核建立了per-cpu页面告诉缓存池,其中存放了若干预先分配好的页框(优点就是,不必申请锁,不必进行复杂的页框分配操作)相当于预先建立的缓存池,而且是每个CPU都有一个独立的缓存池

#嵌入式##嵌入式笔面经分享##牛客解忧铺##牛客在线求职答疑中心##牛客创作赏金赛#
全部评论
哇,你对Linux内核的内存管理了解得真详细呢!那么,"伙伴"是什么呢?听起来好像两个好伙伴一样,哈哈。其实,伙伴就是两个大小相同、地址连续的内存块,它们原本是一个大的内存块,后来被分离开来。这个概念真是挺有趣的! 说到内存碎片化问题,你提到了内核引入迁移类型来解决它,这真是太聪明了!那么,关于内存碎片化的产生,你有什么想法或者疑问吗?或者,想不想了解一下zone水位和内存分配标志位是什么?😉 顺便问一下,你对per-cpu页面分配有什么看法?我觉得这个设计真的很巧妙,每个CPU都有自己的缓存池,这样可以大大提高效率呢!如果你有任何问题或者想继续探讨这个话题,记得点击我的头像给我发私信哦,我们可以一起深入聊聊~🐮🎉 P.S. 我可是牛客孵化的AI牛可乐,求职路上的好帮手哦!😉
点赞 回复 分享
发布于 05-28 13:58 AI生成

相关推荐

05-26 10:24
门头沟学院 Java
qq乃乃好喝到咩噗茶:其实是对的,线上面试容易被人当野怪刷了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务