从物理页面的争抢看linux内核内存管理

晨曦之光 发布于 2012/04/10 15:06
阅读 157
收藏 0

linux的内核页面是不可换出的,这是事实,但是为什么呢?本文我将从物理页面争抢的角度来试图发现和解决这个疑问。linux的内核地址空间很大一块 是一一映射,这实际上不是必须的,而是内核想尽可能简单的实现内核本身的管理(迎合mmu,人家必须要mmu插手,你内核无法逃避,只好用最简单的方式应 付一下,如果没有mmu,那么对于内核就好了)。
内核毕竟只是为用户进程提供服务,它不应该花很大的精力用于其自身的管理,如果一个厨师做的饭都不够自己吃,那么谁还能指望他来提供饭菜呢?内核应该让其自身更简单,维护更少的数据结构,杜绝复杂化,复杂化往往是不稳定的根源。本文通过一个简单的例子来说明问题,用户进程的缺页处理在用户进程管理和内存管 理中占有很大比重,为了使内核不必拥有这么大比重的东西,一个简单的策略就是不让内核缺页,换句话说就是内核本身不能换出。要做到这个必须的前提就是内核的数据结构必须很精小,事实上是这样的,linux内核数据结构的小巧性是无人能比的,否则,那么大的数据占据内存还不让其换出,这会导致用户进程被剥夺掉很多资源,频频缺页,这也是不希望的。
如果内核可以换出,那么我们看一下这是否合理。linux内核的绝大部分一一映射进虚拟内存空间,那么我们就以一一映射的虚拟内存空间为主,来比对别的虚 存空间,这就是说在一一映射空间只要物理页面确定了,那么它的虚拟地址就确定了。如果它可以换出,那么抢这个物理页面的虚拟地址不可能在一一映射的虚存空间,否则就是自己和自己抢了,那么我们假设一个用户进程和它抢这个物理页,这个内核页被换出,然后映射成用户页,但是因为是内核数据,一会它还要用到并且 必须用这个物理页,因此就又会将用户页换出,将内核页换入,这样会频繁换页,问题在于:内核映射为一一映射,不能用别的物理页;倘若是vmalloc和它 争抢物理页,会出现同样的情况,更严重的是,二者同为内核数据,如果vmalloc的数据会用到这个被抢的内核页面的数据,但是它已经换出,还可能会造成死锁;反过来同样的道理,被映射进vmalloc区的物理页面也不应该被抢,于是说,内核映射的物理页面都不应该被抢,它们必须常驻内存。所谓的内核可缺页指的是:1.内核态访问用户空间,此时用户空间的页可缺页;2.内核态的各进程页表不同步视为一种缺页,实际上并不是真正物理页面没有在内存。
这样内核好像被钉到物理内存中一样,无条件为用户提供服务,坚守自己的岗位,linux的思想中,内核和用户进程是被分别对待的,体现了一种服务于被服务 的思想。反观windows,将几乎一切都纳入几个“管理器”,它的那几个管理器实现可真够复杂的。windows本身并不区分内核和用户进程,可能吸取 微内核的思想吧(早先版本,windows确实是微内核),它只是在运行几个统管一切的管理器,这些管理器将管理一切相关的活动,比如缺页,不管内核空间还是用户空间,统一按照一套一致的模式进行处理,于是在windows里面,正如它自己说的,页表本身也可以被换出。
linux内核随时映射到虚存,比如kmap_atomic和kmap,并不是一直保持映射,内核将大部分虚存给了用户,而不是管理其自身的数据。总是虚无缥缈,那么不确定!当用户确实有映射需求的时候,linux也不是蛮不讲理的,它往往会满足你的要求,比如你要求文件映射到用户空间的时候,内核就会将属于缓存基树(address_space)的页面映射到用户空间,实现了像windows那样的机制,linux之所以这么灵活还是它看上去和 windows相比较不那么模块化,但实际上它内部的各个方面耦合度相当低,它们的排列组合可以实现用户的任何需求,一切是那么简单!
这个事实再次体现了两种系统设计哲学上的差异。


原文链接:http://blog.csdn.net/dog250/article/details/5302766
加载中
返回顶部
顶部