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

简介:
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相比较不那么模块化,但实际上它内部的各个方面耦合度相当低,它们的排列组合可以实现用户的任何需求,一切是那么简单! 

这个事实再次体现了两种系统设计哲学上的差异。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1274169

相关文章
|
23天前
|
存储 安全 Linux
探索Linux操作系统的心脏:内核
在这篇文章中,我们将深入探讨Linux操作系统的核心—内核。通过简单易懂的语言和比喻,我们会发现内核是如何像心脏一样为系统提供动力,处理数据,并保持一切顺畅运行。从文件系统的管理到进程调度,再到设备驱动,我们将一探究竟,看看内核是怎样支撑起整个操作系统的大厦。无论你是计算机新手还是资深用户,这篇文章都将带你领略Linux内核的魅力,让你对这台复杂机器的内部运作有一个清晰的认识。
52 3
|
1月前
|
缓存 安全 Unix
Linux 内核黑客不可靠指南【ChatGPT】
Linux 内核黑客不可靠指南【ChatGPT】
|
1月前
|
Linux 开发者
Linux内核贡献成熟度模型 【ChatGPT】
Linux内核贡献成熟度模型 【ChatGPT】
|
1月前
|
网络协议 Ubuntu Linux
用Qemu模拟vexpress-a9 (三)--- 实现用u-boot引导Linux内核
用Qemu模拟vexpress-a9 (三)--- 实现用u-boot引导Linux内核
|
1月前
|
Linux
用clang编译Linux内核
用clang编译Linux内核
|
1月前
|
Linux API C语言
Linux 内核补丁提交的清单 【ChatGPT】
Linux 内核补丁提交的清单 【ChatGPT】
|
1月前
|
安全 Linux 开发者
Linux内核管理风格 【ChatGPT】
Linux内核管理风格 【ChatGPT】
|
1月前
|
Linux 程序员 编译器
Linux内核驱动程序接口 【ChatGPT】
Linux内核驱动程序接口 【ChatGPT】
|
1月前
|
存储 Linux 开发工具
如何进行Linux内核开发【ChatGPT】
如何进行Linux内核开发【ChatGPT】
|
1月前
|
Linux API 调度
关于在Linux内核中使用不同延迟/休眠机制 【ChatGPT】
关于在Linux内核中使用不同延迟/休眠机制 【ChatGPT】

热门文章

最新文章

下一篇
无影云桌面