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



可执行映象的许多内容都可以从映象文件中读出并且可以很容易重读出来 。例如,映象中的可执行指令不能被映象本身修改,所以决不会写到交换文件中去 。这些页面直接丢弃就可以 。当进程再次引用它们时,只需要从可执行映象文件中读入内存即可 。

一旦确定了将要被交换出去的进程,交换后台进程将搜索其整个虚拟内存区域以找到那些没有共享或者加锁的区域 。

Linux并不会将选中的进程的整个可交换页面都交换出去,它只删除一小部分页面 。

如果内存被加锁则页面不能被交换或者丢弃 。

Linux交换算法使用页面衰老算法 。每个页面有一个计数器来告诉核心交换后台进程这个页面是否值得交换出 去(此计数器包含在mem_map_t结构中) 。当页面没有使用或者没有找到时将会衰老;交换后台进程仅仅交换 出那些老页面 。缺省操作是:当页面被首次分配时,其年龄初始值为3,每次引用其年龄将加3,最大值为20 。每次核心交换后台进程运行它来使页面衰老-将年龄减1 。这个缺省操作可以改变并且由于这个原因它们被存储在swap_control数据结构中 。

如果页面变老了(age=0),则交换后台进程将进一步来处理它 。dirty页面可以被交换出去 。Linux在PTE中使 用一个硬件相关位来描叙页面的这个特性(见图3.2) 。然而不是所有的dirty页面都有必要写入到交换文件 中去 。进程的每个虚拟内存区域可能有其自身的交换操作(由vm_area_struct结构中的vm_ops指针表示),在 交换时使用的是这些方法 。否则,交换后台进程将在交换文件中分配一个页面并将页面写到设备上去 。

页面的页表入口被标志成无效但是它包含了页面在在交换文件中位置的信息,包括一个表示页面在交换文件中位置的偏移值以及使用的是哪个交换文件 。但是不管使用的是哪种交换算法,以前那个物理页面将被标志成空闲并放入free_area中 。Clean(或者not dirty)的页面可以丢弃同时放入free_area以备重新使用 。

如果有足够的可交换进程页面被交换出去或丢弃,则交换后台进程将再次睡眠 。下次它醒来时将考虑系统中 的下一个进程 。通过这种方法,交换后台进程一点一点地将每个进程的可交换或可丢弃物理页面收回知道系 统再次处于平衡状态 。这比将整个进程交换出去要公平得多 。

3.9The Swap Cache
当将页面交换到交换文件中时,Linux总是避免页面写,除非必须这样做 。当页面已经被交换出内存但是当有进程再次访问时又要将它重新调入内存 。只要页面在内存中没有被写过,则交换文件中的拷贝是有效的 。

Linux使用swap cache来跟踪这些页面 。这个swap cache是一个页表入口链表,每个对应于系统中的物理页面 。这是一个对应于交换出页面的页表入口并且描叙页面放置在哪个交换文件中以及在交换文件中的位置 。如果swap cache入口为非0值,则表示在交换文件中的这一页没有被修改 。如果此页被修改(或者写入) 。则其入口从swap cache中删除 。

当Linux需要将一个物理页面交换到交换文件时,它将检查swap cache,如果对应此页面存在有效入口,则 不必将这个页面写到交换文件中 。这是因为自从上次从交换文件中将其读出来,内存中的这个页面还没有被修改 。

swap cache中的入口是已换出页面的页表入口 。它们虽被标记为无效但是为Linux提供了页面在哪个交换文件中以及文件中的位置等信息 。


3.10页面的换入
保存在交换文件中的dirty页面可能被再次使用到,例如,当应用程序向包含在已交换出物理页面上的虚拟内存区域写入时 。对不在物理内存中的虚拟内存页面的访问将引发页面错误 。由于处理器不能将此虚拟地址转换成物理地址,处理器将通知操作系统 。由于已被交换出去,此时描叙此页面的页表入口被标记成无效 。处理器不能处理这种虚拟地址到物理地址的转换,所以它将控制传递给操作系统,同时通知操作系统页面错误的地址与原因 。这些信息的格式以及处理器如何将控制传递给操作系统与具体硬件有关 。

推荐阅读