2.4 页分配和回收:
用来进行页分配和回收的机制和数据结构或许是维持虚拟内存子系统高
效的最关键的一点。
系统中所有物理页都用m e m _ m a p 数据结构描述,它是一个在启动时被初始化的
m e m _ m a p _ t结构的列表。每个m e m _ m a p _ t,描述系统中一个物理页。一些重要的字段有(仅对
内存管理而言):
• count 本页使用者计数。当该页被许多进程共享时计数将大于1。
• age 描述本页的年龄,用来判断该页是否为淘汰或交换的好的候选。
• map_nr men_map_t描述的物理页的页帧号。
F r e e _ a r e a向量被页分配代码用来寻找和释放页。
2.4.1 页分配:
L i n u x使用B u d d y算法2 来高效地分配和回收页块。页分配代码试图分配一个或多个物理
页的一块。页面分配是以2的幂大小的块来进行,这意味着它可能分配1页块、2页块、4页块
等。只要系统中有足够的空间页来满足请求(nr_free_pages > min_free_pages),分配代码将搜
索f r e e _ a r e e来寻找请求大小的一个页块。
分配算法首先搜索请求大小的页块。它沿f r e e _ a r e a中l i s t元素处排成队列的空闲页面链进
行。如果没有所请求大小的页块是空闲的,下一个大小的块(两倍于所请求的大小)将被查找,
这个过程一直进行到f r e e _ a r e a整个被检查过或找到一个页块。若找到的页块比请求的大,则
它必须被分开直到得到合适大小的一块。因为块大小都是2的幂,所以分块的过程很容易,只
需把块等分。空闲的块排到合适的队列中,被分配的块返回给调用者。
2.4.2 页回收:
页块的分配可能会把内存分段,把大的空闲页块分开成小的。而页回收代码在可能的时
候把页重新组合成大的空闲页块。
当一个页块被释放时,将检查相邻的或称伙伴的同样大小的块是否空闲。如果是,它和
新释放的页块被组合在一起形成一个新的下一个大小的空闲页块。每次两个页块被组合成更
大的空闲页块时,页回收代码将试图再将该块组合成还要大的块。这样,空闲页块可以任意
大,只要内存使用允许。