WEB开发网
开发学院软件开发VC NetBSD 内存管理系统 UVM 浅析 阅读

NetBSD 内存管理系统 UVM 浅析

 2006-08-09 22:57:02 来源:WEB开发网   
核心提示: 观察 uvm 结构中与页面分配相关的表项, 我们可以知道其基本原理: page_free 指向若干个 (1 - 2 个, i386 的取值是 2) 个 hash pool, 用于管理空闲的页面, page_active 和 page_inactive 双向列表管理在用的 page. 细看

观察 uvm 结构中与页面分配相关的表项, 我们可以知道其基本原理: page_free 指向若干个 (1 - 2 个, i386 的取值是 2) 个 hash pool, 用于管理空闲的页面, page_active 和 page_inactive 双向列表管理在用的 page.

细看 pgfreelist, 它包含若干的 bucket 用于hash, 而每个 bucket 里有两条链表而不是通常的一条. 一条用于存放未知状态页面, 一条用于组织些空白的页面, 这样能显著加快 zero fill page 的分配速度, 而我们知道, 这样的 zero fill page 在系统中大量存在 (程序的 BSS 段), 因此这是个很大的优化.

我们接着分析最常用的接口 uvm_pagealloc() 和 uvm_pagefree(), uvm_pagealloc() 是 uvm_pagealloc_strat() 的包装宏, 我们直接分析 uvm_pagealloc_strat().

uvm_pagealloc_strat()

函数确定本次分配所用的 bucket 号 (所谓 color). 调用 UVM_KICK_PDAEMON, 该宏在内存紧张的时候唤醒 pagedeamon (真形象) 试图增加空闲内存. 然后确定使用真正的分配函数 uvm_pagealloc_pgfl() 的行为, 然后调用 uvm_pagealloc_pgfl() 获取页面.

uvm_pagealloc_pgfl() 相当简单, 根据当前 color (bucket 号) 试图分配, 不行的话找下一个 bucket, 找到后更新一下审计数据. 完毕.

如果 uvm_pagealloc_strat() 顺利获得页面, 就填写下一次分配时使用的 color, 就将参数提供的信息填入之, 之后反向处理 anon 或 obj 的情况, obj 需要将页面链接进 obj 的页面链表, 最后处理空白页面情况即可完成.

uvm_pagefree()

该函数操作更为简单, (XXX: 先忽略掉 loan 的情况先). 需要注意的是 1412 行, 这里是真正用到 hash 函数的地方, 这是一个根据页面的物理地址做的 hash.

上一页  4 5 6 7 8 9 10  下一页

Tags:NetBSD 内存 管理系统

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接