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

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

从物理页面的争抢看linux内核内存管理相关推荐

  1. 【Linux 内核 内存管理】物理分配页 ⑨ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | retry 标号代码分析 )

    文章目录 一.retry 标号代码分析 二.retry 标号完整代码 在 [Linux 内核 内存管理]物理分配页 ② ( __alloc_pages_nodemask 函数参数分析 | __allo ...

  2. 【Linux 内核 内存管理】物理分配页 ⑦ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | 判断页阶数 | 读取 mems_allowed | 分配标志位转换 )

    文章目录 一.__alloc_pages_slowpath 慢速路径调用函数 二.判断页阶数 三.读取进程 mems_allowed 成员 四.分配标志位转换 五.__alloc_pages_slow ...

  3. 【Linux 内核 内存管理】物理分配页 ⑧ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | 获取首选内存区域 | 异步回收内存页 | 最低水线也分配 | 直接分配 )

    文章目录 一.获取首选内存区域 二.异步回收内存页 三.最低水线也分配 四.直接分配内存 在 [Linux 内核 内存管理]物理分配页 ② ( __alloc_pages_nodemask 函数参数分 ...

  4. 【Linux 内核 内存管理】内存映射原理 ① ( 物理地址空间 | 外围设备寄存器 | 外围设备寄存器的物理地址 映射到 虚拟地址空间 )

    文章目录 一.物理地址空间 二.外围设备寄存器 三.外围设备寄存器物理地址 映射到 虚拟地址空间 一.物理地址空间 " 物理地址空间 " 是 CPU 处理器 在 " 总线 ...

  5. linux 内核内存管理

    物理内存 相关数据结构 page(页) Linux 内核内存管理的实现以 page 数据结构为核心,其他的内存管理设施都基于 page 数据结构,如 VMA 管理.缺页中断.RMAP.页面分配与回收等 ...

  6. Linux内核内存管理(3):kmemcheck介绍

    Linux内核内存管理 kmemcheck介绍 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 5.10.13不存在kmemcheck的概念,取代的是k ...

  7. Linux内核内存管理(1):内存块 - memblock

    Linux内核内存管理 内存块 - memblock rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 1. 简介 内存管理是操作系统内核中最复杂的部分之 ...

  8. Linux内核内存管理:地址转换和MMU

    地址转换和MMU 虚拟内存是一个概念,是给进程的一种错觉,因此它认为自己拥有巨大的.几乎无限的内存,有时甚至比系统实际拥有的内存还要多.每次访问内存位置时,由CPU将虚拟地址转换为物理地址.这种机制称 ...

  9. linux内核 -内存管理模块概图

    1.从进程(task)的角度来看内存管理 每个进程对应一个task_struct; 每个task_struct 里面包含指向mm_struct 的指针mm, mm_struct 里面的主要成员: a. ...

  10. pae扩展内存 linux,浅析linux内核内存管理之PAE

    浅析linux内核内存管理之PAE 早期Intel处理器从80386到Pentium使用32位物理地址,理论上,这样可以访问4GB的RAM.然而,大型服务器需要大于4GB的RAM来同时运行数以千计的进 ...

最新文章

  1. 大学毕业想要转行学软件测试,怎样入门比较好?
  2. LeetCode Non-overlapping Intervals(dp,greedy)
  3. python中for循环和while循环的区别_Python中for循环和while循环有什么区别?
  4. 不进行格式化将U盘快速转换为NTFS格式
  5. Java学习的5个阶段,助大家步步攀升
  6. oracle数据库主键自增序列_【oracle】oracle数据库建立序列、使用序列实现主键自增...
  7. 关于明星投票系统的作业分享
  8. C# 插入文本框到PPT幻灯片
  9. (转)一个偷食禁果的女孩--一件我亲眼目睹的真实感人故事
  10. 如何成为一个很厉害的人(时间之尺)
  11. 关于mysql数据库回表的粗浅理解
  12. win10 itunes更新ios系统异常 提示“未能恢复iPhone 发生未知错误(14)”
  13. 智能合约编写之Solidity的设计模式 | FISCO BCOS超话区块链专场(篇4)
  14. HTTP头注入漏洞测试(X-Forwarded-for)
  15. 纯手工解密几大在线js加密网站(1)
  16. vue style样式变量背景图
  17. LTDC-DMA2D液晶显示 代码详解(二)
  18. springboot 使用@Bean 好处与坏处
  19. 2015年,移动互联网进入拼“活跃度”时代
  20. 物业系统源码,智慧物业系统源码

热门文章

  1. 微信小程序之----加载中提示框loading
  2. 第四次作业(1、2小题)
  3. IO-同步、异步、阻塞、非阻塞
  4. python集成包地址 Anaconda 一键安装拥有所有包
  5. 小红书创始人瞿芳回应裁员风波:战略部署清晰 人员翻倍
  6. Script error.全面解析
  7. ado.net 实体类_数据访问类
  8. C#通过XElement写入XML文件
  9. Android - Android Studio 自动(auto)添加import 语句
  10. Confluence3.4的安装和配置