Linux系统使用了几种涉及到高速缓存的内存管理方法。
1 缓冲区高速缓存
缓冲区高速缓存中保存着块设备驱动程序所用到的数据缓冲区。
这些缓冲区的大小固定,一般包括从块设备中读入的和将要写入到块设备中的信息块。块设备一次只能处理大小固定的数据块。硬盘就是块设备中的一种(这里指的是直接写硬盘这种块设备文件,我们平时用的是直接写普通文件,普通文件是一种文件类型,块设备文件也是一种文件类型,所以这里一定要区分清楚块设备和普通文件的区别)。缓冲区高速缓存使用设备标识符和块号作为索引来快速地查找数据块。块设备只通过缓冲区高速缓存进行存取。如果所需要的数据存在于缓冲区高速缓存中,那么就不需要从物理块设备中读取,这样存取的速度就会加快。
2 页面高速缓存
页面高速缓存用来加速磁盘中文件镜像和数据的存取。
对于已经作好了磁盘映射的文件,Linux每次读取一页,并将读取的页面存储到页面高速缓存中。
图1 0 - 5显示页面高速缓存由p a g e _ h a s h _ t a b l e组成,p a g e _ h a s h _ t a b l e是一个包含指向m e m _ m a p _ t结构指针的数组。每当从一个内存映射文件中读取一个页面时,页面都要从页面高速缓存中读取。如果页面在高速缓存中,则将一个指向m e m _ ma p _ t的指针返回给页面错误处理程序。否则,页面必须从磁盘上读入到内存中。
如果可能,L i n u x系统将会提前读取文件中的下一个页面,这样,如果文件是顺序执行的,那么下一个页面就已经在内存中了。
随着文件的读入和执行,页面高速缓存也将变得越来越大。不用的页面将被移出高速缓存。
3 交换高速缓存
交换文件中只保存那些被修改过的页面。只要在页面被写入到交换文件中后没有被修改过,那么此页面下一次从内存中交换出来时就不用再写入到交换文件中了,因为交换文件中已经有了该页面。这样,该页面就可以简单地扔掉,节省了大量的系统操作。
4 硬件高速缓存
一个常用的硬件高速缓存是在处理器中,它一般保存着页面表的入口。
内核交换守护进程kswapd
当物理内存变少时,L i n u x内存管理必须释放物理内存页。此任务由内核中的交换守护进程( k s w a p d )完成。
交换守护进程是一个内核线程。内核线程是无需使用虚拟内存的进程,它们在物理内存中运行于内核方式下。交换守护进程还有一个重要的任务是保证系统中有足够的空闲内存。
交换守护进程是由内核的初始化进程启动的,并一直等候直到内核交换计时器周期性截止。每当计时器截止时,交换守护进程都要检查系统中的空闲的页面数是否太少。它使用两个变量free_pages_high 和f r e e _ p a g e s _ l o w来决定是否需要释放一些内存。只要空闲的内存数大于f r e e _ p a g e s _ h i g h,交换守护进程就不做任何事,它将再一次进入睡眠状态直到计时器再一次截止。
检查系统中空闲页的目的是使交换守护进程可以计算出需要往交换文件中写入的页面数,此数目保存在n r _ a s y n c _ p a g e s中。
每次有页面排队准备写入到交换文件中时,n r _ a s y n c _ p a g e s的值就会增加,而当写入结束后,n r _ a s y n c _ p a g e s的值就将减少。free_pages_low 和f r e e _ p a g e s _h i g h是在系统启动时设定的,并和系统的物理页面数有关。如果系统中的空闲页面数低于f r e e _ p a g e s _ h i g h,或者甚至低于f r e e _ p a g e s _ l o w,则内核的交换守护进程将用以下三种办法减少正在使用的页面数:
• 减少缓冲区和页面高速缓存的大小。
• 把System V的共享内存页交换出系统内存。
• 交换或扔掉内存页。