简图记录-linux内存管理

简图记录学习~

参考:内核设计与实现、google


内存管理就是软件运行时操作系统对内存资源的分配和使用的策略。

linux内核管理内存的基本单位为页,页大有由系统决定,32位系统上页的常见大小为4KB。

每个cpu对应一个节点node、每个节点包含多个区域zone区分不同类型的内存、每个区域包含一组内存块链表来管理不同大小的空闲内存块。(如下表为0~11的链表、每个链表上管理大小为2的链表下标次方个页的内存块)

linux页表分配和回收策略主要有两个算法:伙伴算法(用于管理基本页表分配释放,一种尽可能减少内存碎片、快速分配回收页机制)和slab算法(一种小内存管理方法、用内存池的概念将伙伴算法分配的页分裂管理,达到 避免反复申请释放页)。

简单来说,伙伴算法管理内存块链表,当申请链表时从满足size的链表上取,如果没有再向高一级链表取(下一级内存块分裂给用户,剩下放到当前级链表),当释放链表的时候回尝试主动与一个同级内存块合并放到高一级链表中。而slab算法,利用一个缓冲区作为内存池的概念、将伙伴算法分配来的页表分裂成小块内存共用户快速申请释放,无需再去伙伴算法获取和释放内存块。

linux中有3种地址:逻辑地址(机器指令中说明操作数和指令的地址)、线性地址(也叫虚拟地址,在32位系统每个进程都有自己的4G地址空间课访问)、物理地址(真实的 内存地址),地址的转换通过MMU完成。

地址之间映射关系简单来说,逻辑地址包含段索引和段偏移量,通过索引可在Global Descriptior Table(GDT)找到对应段描述符指向了虚拟地址空间的一个段、而这个段上对应偏移量上的地址就是虚拟地址,而一个虚拟地址页分为页目录Dir偏移、页表Table偏移、页偏移量offset组成,利用这些信息在每个进程映射表中的找到对应页目录项中的页表table,table中的对应页地址,最后通过页地址和页偏移量定位到物理地址。

linux对进程的虚拟地址空间在32位系统地址空间有4G。低3G为用户空间,高1G为内核空间。用户细分了不同的地址段,如代码段、数据段、bss段、堆、栈、环境变量和命令行参数段。内核空间1G也分成低端内存(低896M)用于存储内核镜像和页表管理,高端内存(高128M)用于系统映射使用。

linux内存申请和释放对用户空间和内核空间不同区域申请是有差异的。

用户空间的应用程序可通过malloc、calloc、realloc申请堆上的内存、也可以使用alloc申请栈上的内存(无需释放)。内核模块可以通过Vmalloc申请大块的低端内存(可128KB以上,不保证物理地址连续、可能休眠注意不能再中断中使用)和Kmalloc申请小块如低于128KB高端内存(连续物理内存,带GFP_ATOMIC标志申请不会休眠)。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值