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

NetBSD 内存管理系统 UVM 浅析

 2006-08-09 22:57:02 来源:WEB开发网   
核心提示: swap 管理swap 设备管理XXX: 讲清楚基本原理即可, 翻译 comment 页面换出页面换出工作由内核守护进程 pagedaemon 完成. (注: 另一个貌似处理页面换出的守护进程是 swapper, 它的任务是在系统资源紧张而某进程睡眠时间很长的时候, 将整个进程换出去, 我

swap 管理

swap 设备管理

XXX: 讲清楚基本原理即可, 翻译 comment

页面换出

页面换出工作由内核守护进程 pagedaemon 完成. (注: 另一个貌似处理页面换出的守护进程是 swapper, 它的任务是在系统资源紧张而某进程睡眠时间很长的时候, 将整个进程换出去, 我们在这里不讨论这个, 这可以算是最古老的 UNIX 系统的遗留). 代码在 uvm_pdaemon.c 中.

我们在看到, uvm_pagealloc_strat() 在遇到系统内存不足 (不一定是不足到分配不出页面) 的时候, 就会唤醒 pagedaemon 进程, 进行页面回收和换出操作.

pagedaemon 的主程序在 197 行 uvm_pageout(). 在 main loop 中, 首先判断 npages 和真正的系统 npages 有什么不同, 它有可能在 pagedaemon sleep 的时候发生改变, 运行 uvmpd_tune() 来调整参数, 在这里我们可以看到 pagedaemon 的目标 (line 182): 另 free 的页面至少在保留页面容量的 4/3.

若未达到目标, 我们就需要运行真正的换出程序 uvmpd_scan() 解决. 函数将先调用主要的 uvmpd_scan_inactive() 来完成, 我们说过 incative page list 里存放的是最近没有操作的页面, 将它们换出去是适当的. 函数首先统计更详细的需求数据, 然后遍历整个链表.

对于每个页面, 系统首先判断它是否适合换出, 如果适合 (line 488) 首先尝试所住所属的 obj 或 anon (这里不能 wait, 否则会死锁). 下面, 若这个不是由 swap 管理的页面 (不是 anon 也不是 aobj), 交给 obj 去释放这个. 否则, 函数首先采取各种办法尽量避免真正 pageout 而空出内存, 比如它是 CLEAN 的, 说明它在内存期间没做过任何操作, 无论是一个 zero fill 新页面还是从 swap 换掉内存的, 我们都可以直接释放它, 在再次需要它的时候正确提供数据. 否则 , 我们先释放其原来在 swap 中的数据, 因为已经不再适用, 然后记录新的 slot 的位置, 如果有需要, 我们继续查找可释放的页面, 而将真正的 I/O 操作推后. 最后, 我们在 719 行做真正的换出 I/O 操作.

上一页  5 6 7 8 9 10 

Tags:NetBSD 内存 管理系统

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