内存交换

内存交换 2014-02-22 16:32:51

分类: LINUX

当物理内存出现不足时,Linux 内存管理子系统需要释放部分物理内存页。这一任务由内核的交换守护进程 kswaped 完成,该内核守护进程实际是一个内核线程,它的任务就是保证系统中具有足够的空闲页,从而使内存管理子系统能够有效运行。
在系统启动时,这一守护进程由内核的 init 进程启动。当内核的交换定时器到期时,该进程开始运行。如果 kswaped 发现系统中的空闲页很少,该进程将按照下面的三种方法减少系统使用的物理页:
1. 减少缓冲区和页高速缓存的大小。页高速缓存中包含(装入虚拟内存空间的内存映射文件)的页,可能包含一些系统不再需要的页,类似地,缓冲区高速缓存中也可能包含从物理设备中读取的或写入物理设备的数据,这些缓冲区也可能不再需要,因此,这两个高速缓存可用来释放出空闲页。但是,同时处于这两个高速缓存中的页是不能丢弃的。Linux 利用“时钟”算法从系统中选择要丢弃的页,也即每次循环检查 mem_map 页向量中不同的页块,象时钟的分针循环转动一样。时钟算法的原理见图 10-7。每次内核的交换进程运行时,根据对物理内存的需求而选择不同页块大小的 mem_map 向量进行检查。如果发现某页块处于上述两个高速缓存中,则释放相应的缓冲区,并将页块重新收入 free_area 结构。
2. 将System V 共享内存页交换出物理内存。System V 共享内存页实际是一种进程间通讯机制,系统通过将共享内存页交换到交换文件而释放物理内存。Linux 同样使用时钟算法选择要交换出物理内存的页。
3. 将页交换出物理内存或丢弃。kswaped 首先选择可交换的进程,或其中某些页可从内存中交换出或丢弃的进程。可执行映象的大部分内容可从磁盘映象中获取,因此,这些页可丢弃。选定要交换的进程之后,Linux 将把该进程的一小部分页交换出内存,而大部分不会被交换,另外,被锁定的页也不会被交换。Linux 利用页的寿命信息选择要交换的页,也即所谓“最近最少使用(LRU)”算法。
页的寿命信息保存在 mem_map_t 结构中。最初分配某个页时,页的寿命为 3,每次该页被访问,其寿命增加 3,直到 20 为至;而当内核的交换进程运行时,页寿命减 1。如果某个页的寿命为 0,则该页可作为交换候选页。如果是“脏”页(该信息保存在页表项中),则可将该页交换出物理内存。但是,进程的虚拟内存区域可具有自己的交换操作例程(定义在虚拟内存操作集中),这时,将利用该例程执行交换操作,否则,交换守护进程在交换文件中分配页,并将该页写入交换文件。
当某物理页交换到交换文件之后,该页对应的页表项被标志为无效,同时包换该页在交换文件中的位置信息;而被释放出的物理页则被收回到 free_area 数据结构中。
根据被释放的页数目,kswaped 会自动调节交换定时器的间隔,以便能够有足够的时间释放更多的页而保证足够的空闲页。
交换文件中的页是经过修改的页(通过在页表项中设置相应的位而标志该页为“脏”页),则当进程再次访问该页时,操作系统必须从交换文件中将该页交换到物理内存。

你可能感兴趣的:(内存交换)