Linux 核心--4.内存管理( 七 )



3.7Linux页面cache



图3.6 Linux页面Cache


Linux使用页面cache的目的是加快对磁盘上文件的访问 。内存映射文件以每次一页的方式读出并将这些页面存储在页面cache中 。图3.6表明页面cache由page_hash_table,指向mem_map_t数据结构的指针数组组成 。

Linux中的每个文件通过一个VFS inode(在文件系统一章中讲叙)数据结构来标识并且每个VFS inode都是唯一的,它可以并仅可以描叙一个文件 。页表的索引从文件的VFS inode和文件的偏移中派生出来 。

从一个内存映射文件中读出页面,例如产生换页请求时要将页面读回内存中,系统尝试从页面cache来读出 。如果页面在cache中,则返回页面失效处理过程一个指向mem_map_t数据结构;否则此页面将从包含映象的文件系统中读入内存并为之分配物理页面 。

在映象的读入与执行过程中,页面cache不断增长 。当不再需要某个页面时,即不再被任何进程使用时,它将被从页面cache中删除 。

3.8换出与丢弃页面
当系统中物理内存减少时,Linux内存管理子系统必须释放物理页面 。这个任务由核心交换后台进程(kswapd )来完成 。

核心交换后台进程是一种特殊的核心线程 。它是没有虚拟内存的进程,在物理地址空间上以核心态运行 。核心交换后台进程的名字容易使人误解,其实它完成的工作比仅仅将页面交换到系统的交换文件中要多得多 。其目标是保证系统中有足够的空闲页面来维持内存管理系统运行效率 。

此进程由核心的init进程在系统启动时运行,被核心交换定时器周期性的调用 。

当定时器到时后,交换后台进程将检查系统中的空闲页面数是否太少 。它使用两个变量:free_pages_high 和free_page_low来判断是否该释放一些页面 。只要系统中的空闲页面数大于free_pages_high,核心交换后台进程不做任何工作;它将睡眠到下一次定时器到时 。在检查中,核心交换后台进程将当前被写到交换文件中的页面数也计算在内,它使用nr_async_pages来记录这个数值;当有页面被排入准备写到交换文件队列中时,它将递增一次,同时当写入操作完成后递减一次 。如果系统中的空闲页面数在free_pages_high甚至 free_pages_low以下时,核心交换后台进程将通过三个途径来减少系统中使用的物理页面的个数:

减少缓冲与页面cache的大小,
将系统V类型的内存页面交换出去,
换出或者丢弃页面 。
如果系统中空闲页面数低于free_pages_low,核心交换后台进程将在下次运行之前释放6个页面 。否则它只释放3个 。以上三种方法将依次使用直到系统释放出足够的空闲页面 。当核心交换后台进程试图释放物理页面时它将记录使用的最后一种方法 。下一次它会首先运行上次最后成功的算法 。

当释放出足够页面后,核心交换后台进程将再次睡眠到下次定时器到时 。如果导致核心交换后台进程释放页面的原因是系统中的空闲页面数小于free_pages_low,则它只睡眠平时的一半时间 。一旦空闲页面数大于 free_pages_low则核心交换进程的睡眠时间又会延长 。

3.8.1减少Page Cache和Buffer Cache的大小
Page Cache和Buffer cache中的页面将被优先考虑释放到free_area数组中 。Page Cache中包含的是内存映射文件的页面,其中有些可能是不必要的,它们浪费了系统的内存 。而Buffer Cache中包含的是从物理设备中读写的缓冲数据,有些可能也是不必要的 。当系统中物理页面开始耗尽时,从这些cache中丢弃页面比较简单(它不需要象从内存中交换一样,无须对物理设备进行写操作) 。除了会使对物理设备及内存映射文件的访问速度降低外,页面丢弃策略没有太多的副作用 。如果策略得当,则所有进程的损失相同 。

推荐阅读