从物理页面的争抢看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

相关文章
|
12月前
|
安全 网络协议 Linux
深入理解Linux内核模块:加载机制、参数传递与实战开发
本文深入解析了Linux内核模块的加载机制、参数传递方式及实战开发技巧。内容涵盖模块基础概念、加载与卸载流程、生命周期管理、参数配置方法,并通过“Hello World”模块和字符设备驱动实例,带领读者逐步掌握模块开发技能。同时,介绍了调试手段、常见问题排查、开发规范及高级特性,如内核线程、模块间通信与性能优化策略。适合希望深入理解Linux内核机制、提升系统编程能力的技术人员阅读与实践。
996 1
|
Ubuntu Linux
Ubuntu 23.04 用上 Linux 6.2 内核,预计下放到 22.04 LTS 版本
Linux 6.2 带来了多项内容更新,修复了 AMD 锐龙处理器设备在启用 fTPM 后的运行卡顿问题,还增强了文件系统。
|
Ubuntu Linux
Ubuntu 23.10 现在由Linux内核6.3提供支持
如果你想在你的个人电脑上测试一下Ubuntu 23.10的最新开发快照,你可以从官方下载服务器下载最新的每日构建ISO。然而,请记住,这是一个预发布版本,所以不要在生产机器上使用或安装它。
|
传感器 监控 Ubuntu
10 月发布,Ubuntu 23.10 已升级到 Linux Kernel 6.3 内核
硬件方面,Linux 6.3 引入了在 HID 中引入了原生的 Steam Deck 控制器接口,允许罗技 G923 Xbox 版赛车方向盘在 Linux 上运行;改善 8BitDo Pro 2 有线控制器的行为;并为一系列华硕 Ryzen 主板添加传感器监控。
|
Ubuntu Linux
Ubuntu24.04LTS默认采用Linux 6.8内核,实验性版本可通过PPA获得
IT之家提醒,当下的 Ubuntu 23.10 也是一个“短期支持版本”,该版本将在今年 7 月终止支持,而今年 4 月推出的 Ubuntu 24.04 LTS 长期支持版本将获得 5 年的更新支持。
|
11月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
958 0
Linux内存问题排查命令详解
|
监控 Ubuntu Linux
什么Linux,Linux内核及Linux操作系统
上面只是简单的介绍了一下Linux操作系统的几个核心组件,其实Linux的整体架构要复杂的多。单纯从Linux内核的角度,它要管理CPU、内存、网卡、硬盘和输入输出等设备,因此内核本身分为进程调度,内存管理,虚拟文件系统,网络接口等4个核心子系统。
1093 0
|
Web App开发 缓存 Rust
|
Ubuntu 安全 Linux
Ubuntu 发行版更新 Linux 内核,修复 17 个安全漏洞
本地攻击者可以利用上述漏洞,攻击 Ubuntu 22.10、Ubuntu 22.04、Ubuntu 20.04 LTS 发行版,导致拒绝服务(系统崩溃)或执行任意代码。