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

Linux内核本质:操作系统的心脏与硬件资源总控中心 内核是操作系统最核心的特权级程序,运行于CPU Ring 0,为上层应用提供进程管理、内存虚拟化、文件系统抽象和设备驱动四大支柱能力。其设计基于特权级隔离(如系统调用)、硬件抽象层(HAL)和安全仲裁机制,确保多任务并发下的稳定性与安全性。理解内核即理解为什么程序不能直接操作物理内存、为何进程崩溃不致系统瘫痪、以及‘kernel panic’和‘unable to find the kernel source tree’等典型问题的技术根源。它既是硬件资源的中央银行,也是软件生态得以统一运行的底层契约。 阅读详情

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 相比较不那么模块化,但实际上它内部的各个方面耦合度相当低,它们的排列组合可以实现用户的任何需求,一切是那么简单!
    
这个事实再次体现了两种系统设计哲学上的差异。

PCL 法线定向【2025最新版】 几种法线定向方法的PCL代码实现。 阅读详情

相关推荐

【配环境】ubuntu18.04 3080ti显卡+cuda+cudnn+torch

1.打开系统设置中的software & updates点击 System Settings,选择 Additional Drivers 标签,下面会列出当前显卡可用的驱动版本。 注意:3080ti建议不要安装最新版本驱动 点击Apply Changes即可安装; 注意:3080ti只能装cuda11.x 修改软连接修改系统使用的cuda 卸载老版本cuda 重新查询看是否卸载成功 显卡驱动及CUDA Toolkit最高对应版本 查询驱动版本............

sinat_41670685的博客 3913

CORS跨域问题终极指南:原理、修复与排查实战

浏览器安全机制中的同源策略是Web开发必须掌握的基础,它决定了页面脚本能否读取跨域资源。当后端未正确返回Access-Control-Allow-Origin等CORS响应头时,就会出现常见的CORS报错。理解CORS的预检请求与简单请求流程,是配置跨域授权的核心。在实际工程中,可通过FastAPI、Spring Boot、Node.js等后端中间件、前端代理或Nginx反向代理解决跨域问题。本文系统梳理CORS原理、常见后端修复方式、开发与生产环境的代理方案,并给出OPTIONS预检被拦截、凭证携带等典型

weixin_34204722的博客 464

ENVI 5.6保姆级教程:高分七号DLC影像从打开到融合的完整流程(附避坑指南)

本文详细介绍了ENVI 5.6处理高分七号DLC影像的完整流程,包括环境准备、数据解压、正射校正、图像融合等关键步骤。特别针对国产卫星数据处理的独特挑战,提供了实用的避坑指南和优化技巧,帮助用户高效完成光学影像的预处理和质量提升。

weixin_33269743的博客 382

Linux内存管理章节一:深入浅出Linux内存管理:从物理内存到ARM32的用户与内核空间

深入浅出Linux内存管理:从物理内存到ARM32的用户与内核空间

深耕嵌入式领用多年, 致力于分享嵌入式领域技术! 1244

51单片机+HX711电子秤Proteus仿真保姆级教程(附完整源码与避坑指南)

本文详细介绍了51单片机与HX711电子秤在Proteus仿真中的全流程实战指南,包括电路设计、核心代码实现、典型问题排查及系统集成等关键步骤。特别提供了HX711驱动程序的编写技巧和称重数据处理算法,帮助开发者快速搭建高精度电子秤仿真系统,并避免常见的设计陷阱。

weixin_30752699的博客 413

Win11下USB-Blaster驱动安装全攻略:Quartus用户必看(附常见问题解决)

本文详细介绍了在Windows 11系统下为Intel FPGA开发工具Quartus安装USB-Blaster驱动的完整流程与常见问题解决方案。针对Win11更严格的驱动签名验证机制,提供了从标准安装步骤到高级故障排查(如禁用驱动强制签名、使用测试模式)的实用指南,帮助用户快速解决驱动安装失败问题,确保FPGA编程调试顺利进行。

weixin_29256771的博客 660

内核核心:Linux 内存管理万字深度详解

/ 获取指定PID进程的OOM评分// 查找目标进程if (!task) {// 锁定进程结构体,计算OOM评分// 核心评分函数// 模块示例:获取PID=1234的OOM评分上述代码中,用户态代码可直接用于运维调试(调整关键进程OOM优先级、模拟OOM场景),内核态代码展示了如何通过内核接口获取OOM评分,适合需要自定义OOM策略的内核开发场景。需注意:内核态OOM相关接口需谨慎使用,避免影响系统稳定性。

m0_73443478的博客 480

别再只插线了!用示波器‘偷看’USB-C PD协议握手全过程(附BMC/4B5B编码解析)

本文详细介绍了如何使用示波器捕获并解码USB-C PD协议的握手过程,包括BMC/4B5B编码的解析技巧。从硬件配置到波形分析,再到协议注入,为工程师提供了一套完整的实战解码手册,帮助深入理解PD协议的工作原理。

weixin_42526417的博客 402

学内核之十二:从slab内存管理想到的

学内核slab感受随便谈谈

wwwyuewww的专栏 424

HCLR-Net: 混合对比学习正则化与局部随机扰动用于水下图像增强

独特贡献在于开发了一种处理负样本的新策略,既保留了负样本的统计特性,又防止网络过度剖析这些样本中的特征信息。通过根据每个通道特征的重要性对模型进行加权,我们可以增强富含上下文信息的通道,从而获得更准确、更详细的特征表示。AHA 模块利用垂直方向上的 Avgpool 和水平方向上的 Maxpool 来捕捉远程依赖关系和准确的位置信息,从而有效确定不同方向上的特征退化。对比学习策略通常旨在最小化正样本之间的欧氏距离,使预测图像更接近理想图像,同时最大化负样本与预测图像之间的距离,使它们进一步远离非理想表征。

G-Howe的博客 1456

SAP 发货在途库存管理:POD确认差异下的2种后续调整方案对比

本文详细解析了SAP发货在途库存管理中POD确认差异后的财务调整方案,对比了移动类型417和555 T两种处理方式的适用场景及财务影响。通过实际案例说明如何优化POD流程,减少库存差异损失,提升供应链管理效率。特别适合SAP SD模块用户及供应链管理人员参考。

chiman6219的博客 394

内核空间:kmalloc vmalloc 用户空间:malloc ptmalloc

一.地址映射流程 二.内核空间 在内核空间,通过malloc类似的两个系统调用来进行内存的分配,它们分别是kmalloc和vmalloc 1.kmalloc kmalloc用于为内核空间的直接内存映射区分配内存. kmaloc以字节为分配单位,通常用于分配小块内存,并且kmalloc确保分配的页在物理地址上是连续的(虚拟地址也必然是连续的),并且kmalloc为了防止内存碎片的问题,其底层页面分配算法是基于slab分配器实现的. 2.vmalloc vmalloc用于为内核空间中的动态内存映.

HUAERBUSHI521的博客 1683

CUDA编程 - Nsight system & Nsight compute 的安装和使用 - 学习记录

在 cuda 编程中,经常会用到 Nsight system 和 Nsight compute 进行性能分析等,下面做个学习总结。本篇包括安装和常用分析思路总结,具体实践操作总结会放在下一篇博客。

点云算法工程师 1万+

上下文切换与内存碎片:Linux 内核调优的系统稳定性保障

Linux 内核调优的本质,是在吞吐量、延迟、稳定性三个维度之间找到适合业务特征的平衡点。没有"万能参数组合",只有基于实际负载特征的针对性调优。调优的前提是建立性能基线——先度量,再调优,后验证。落地步骤:第一步,部署内核性能基线采集脚本,建立当前系统的性能画像;第二步,识别瓶颈指标(高 sys CPU、高上下文切换、高缺页中断等),确定调优方向;第三步,在测试环境验证参数调整效果,使用基准测试工具(如 sysbench、wrk)量化改善幅度;

qwe0iop0的博客 5368

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux

linux虚拟内存与交换空间的机制问题详解 对于一台64位的操作系统来说,假设它有一定空间的物理内存4G,物理内存分成了很多8k位单位大小的页框,这些**页框就是我们所说的存储进程的最小单位,即为页面。 为了解决系统运行过程中不同进程之间内存合理的分配和利用(简单来说就是保证系统能够在较多的进程中能够不出错),防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏(简而言之,就是防止一旦某一进程失去控制,占用你的资源不断增大,就会将物理内存占满,并导致其他进程中端,导致服务器崩溃,这是很危险的事情),

qq_39858745的博客 277

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

从“Hello World”到“内核调试”——4个月打通Linux内核

本文摘要:本文系统介绍了Linux内核学习的四个月进阶路线。首月搭建基础:掌握操作系统原理、内核源码结构及编译环境。第二月重点攻克进程管理(task_struct、fork机制)和内存管理(Buddy系统)。第三月深入文件系统(VFS四大对象)和设备驱动开发。最后阶段通过系统调用跟踪和编写进程监控模块进行综合实战。每个阶段均配套理论讲解、源码分析及实验验证,提供从入门到实战的完整学习路径。

AI_5678的博客 481

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

linux内核源码内存管理(7)

NUMA(Non-Uniform Memory Access,非统一内存访问)架构正是为了打破这一瓶颈而诞生的。它放弃了“所有内存平等”的幻想,转而拥抱“就近原则”:将CPU分组(称为Socket或Node),每组CPU直接连接本地物理内存,形成本地内存(Local Memory),访问速度快;访问其他组的内存则需通过互联通道(如Intel QPI或AMD Infinity Fabric),形成远端内存(Remote Memory),访问速度慢且延迟高。

160

打破常规,Linux内核新的数据结构上场maple tree

Linuxkernal鬼斧神工,博大精深,让人叹为观止,拍手叫绝。然匠心独运的设计并非扑朔迷离、盘根错节,真正的匠心独运乃辞简理博、化繁为简,在简洁中昭显优雅和智慧,kfifo就是这样一种数据结构,它就是这样简约高效,匠心独运,妙不可言,下面就跟大家一起探讨学习。在外界看来,Linux内核的内部似乎变化很少,尤其是像内存管理子系统(memory-managementsubsystem)这样的子系统。然而,开发人员时常需要更换内部接口来解决某些长期存在的问题。

深度Linux 1025

Linux glibc内存管理:用户态内存分配器——ptmalloc实现原理

文章目录设计假设ArenaChunkBins内存分配、释放流程 C++ STL : SGI-STL空间配置器源码剖析 Linux 内存管理 | 物理内存管理:物理内存、内存碎片、伙伴系统、slab分配器 Linux 内存管理 | 虚拟内存管理:虚拟内存空间、虚拟内存分配 在之前的几篇博客中,我曾经介绍过STL空间配置器、BuddySystem、Slab分配器等内存管理机制,也曾经简单的提及过linux用户态内存分配的策略,这一次就来深入讲一讲在用户态进行内存分配时,到底做了什么。 设计假设 ptmall

凌桓丶的博客 2504

Linux内存相关

Linux内存管理通过分页、伙伴系统、Slab等机制平衡效率与碎片问题,但需结合场景规避常见陷阱(如泄漏、碎片、OOM)。理解NUMA、CMA、THP等特性,结合监控工具(freevmstat)和调优手段,可显著提升系统稳定性。

qq_55655082的博客 717

性能调优的尽头:Linux 内核深度观测与硬件极限压榨实践

本文深入探讨了Linux内核性能优化的关键点,指出应用层性能问题往往源于操作系统资源调度机制。文章剖析了系统负载(Load Average)的本质,揭示了CPU调度与上下文切换的开销问题,并深入分析了内存管理中的PageCache机制和虚拟内存映射。作者介绍了传统性能观测工具的局限性,重点推荐了革命性的eBPF技术,能够以极低开销实现内核级精准监控。最后提出了一套工业级性能问题排查路径:从宏观诊断到网络、磁盘分析,再到微观函数追踪。文章强调,优秀的架构师必须深入理解系统底层原理,通过消除不必要的资源浪费来提

2603_96174487的博客 253

多核心Linux内核路径优化的不二法门之-slab与伙伴系统

因为近些天有和同事,朋友讨论过这个主题,而且觉得这个主题还算比较典型,所以就作为第一篇了。其实按照操作系统理论来讲,进程管理应该更加重要些,按照我自己的兴趣来讲,IO管理以及TCP/IP协...

213

虚拟内存:从分页机制到页面置换,深入理解操作系统内存管理

内存管理是操作系统的核心功能之一,它负责高效、安全地分配和回收计算机的物理内存资源。其基本原理是通过地址映射机制,将进程使用的逻辑地址转换为实际的物理地址,从而实现多道程序并发运行时的内存隔离与保护。这项技术的核心价值在于提升了系统的稳定性、安全性,并简化了应用程序的开发模型,程序员无需直接操作复杂的物理内存。在应用层面,内存管理支撑着从桌面应用到服务器、嵌入式系统的几乎所有软件运行。本文聚焦于虚拟内存这一关键实现技术,它通过分页、页表、TLB快表等机制,结合页面置换算法,在物理内存有限的情况下,为每个进程

weixin_33922672的博客 367
上一篇: 缓存的位置
下一篇: 对BSD的新路由查找算法的理解
linuxcode_turing
博客等级 码龄17年 0粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值