Linux内存管理

内核用page结构体表示系统的每个物理页(页框),描述当前时刻在相关物理页存放的东西

  • flag:表示状态,包括是不是脏的、是否锁定在内存中
  • _count:页的引用计数

Linux根据页的特性进行分组,划分为区

  • ZONE_DMA:<16MB的内存页框。执行DMA操作,因为DMA只能使用特定的内存地址
  • ZONE_NORMAL:≥16MB并<896MB的内存页框。能正常映射的页
  • ZONE_HIGHEM:≥896MB的内存页框。高端内存,不能永久映射到内核地址空间,因为物理内存比虚拟内存大

伙伴系统算法

一种内存分配策略

  • 伙伴:两个块有相同大小,物理地址是连续的
  • 解决外碎片问题
  • 实现:
    • 把所有空闲页框分组为11个块链表,每个链表包含20到210个连续页框
    • 请求时:
      • 合适的,取走
      • 小于需要的,寻找下一个更大的页块
      • 大于需要的,把多出来的拼接到合适的链表;如果拼接时发现是连续的页框(是伙伴),则合并拼接到更大的链表,迭代这个过程
    • 释放时:
      • 放回合适的链表
      • 如果放回时是连续的页框(是伙伴),迭代更新链表

slab机制

Linux内存管理

一种内存分配策略

  • 解决内碎片问题,小内存区的请求问题

slab实现

  • slab层把不同对象划分位高速缓存组,每个组存放不同类型的对象,比如task_struct_inod
  • slab由一个或多个物理上连续的页组成,每个组由一个或多个slab组成
  • 三种状态:slab满,就创建新slab;slab部分满,分配时先使用;slab空
  • slab避免频繁分配和释放页
    • 分配页:已发出一个分配新对象的请求;高速缓存不包含任何空闲对象,slab满
    • 释放页:slab高速缓存中有太多空闲对象;定时器确定有完全未被使用的slab

Linux内存管理

上一篇:进程相关概念


下一篇:Ubuntu开启默认桌面共享