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都有一个独立的缓存池
#嵌入式##嵌入式笔面经分享##牛客解忧铺##牛客在线求职答疑中心##牛客创作赏金赛#