Linux 内存管理知识学习总结
2025-10-31 04:59:51阅读量:18 字体:大 中 小
现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:
地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内核态和用户态两部分,经典比例如下:

从用户态到内核态一般通过系统调用、中断来实现。用户态的内存被划分为不同的区域用于不同的目的:
当然内核态也不会无差别地使用,所以,其划分如下:
下面来仔细看这些内存是如何管理的。
地址在Linux内部的地址的映射过程为逻辑地址–>线性地址–>物理地址,物理地址最简单:地址总线中传输的数字信号,而线性地址和逻辑地址所表示的则是一种转换规则,线性地址规则如下:
这部分由MMU完成,其中涉及到主要的寄存器有CR0、CR3。机器指令中出现的是逻辑地址,逻辑地址规则如下:
在Linux中的逻辑地址等于线性地址,也就是说Inter为了兼容把事情搞得很复杂,Linux简化顺便偷个懒。
内存管理的方式在系统boot的时候会去探测内存的大小和情况,在建立复杂的结构之前,需要用一个简单的方式来管理这些内存,这就是bootmem,简单来说就是位图,不过其中也有一些优化的思路。
bootmem再怎么优化,效率都不高,在要分配内存的时候毕竟是要去遍历,buddy系统刚好能解决这个问题:在内部保存一些2的幂次大小的空闲内存片段,假如要分配3page,去4page的列表里面取一个,分配3个之后将剩下的1个放回去,内存释放的过程刚好是一个逆过程。用一个图来表示:
可以看到0、4、5、6、7都是正在使用的,那么,1、2被释放的时候,他们会合并吗?
static inline unsigned long__find_buddy_index(unsigned long page_idx, unsigned int order){return page_idx ^ (1 << order);// 更新最高位,0~1互换}从上面这段代码中可以看到,0、1是buddy,2、3是buddy,虽然1、2相邻,但他们不是。内存碎片是系统运行的大敌,伙伴系统机制可以在一定程度上防止碎片~~另外,我们可以通过cat /proc/buddyinfo获取到各order中的空闲的页面数。
伙伴系统每次分配内存都是以页(4KB)为单位的,但系统运行的时候使用的绝大部分的数据结构都是很小的,为一个小对象分配4KB显然是不划算了。Linux中使用slab来解决小对象的分配:
在运行时,slab向buddy“批发”一些内存,加工切块以后“散卖”出去。随着大规模多处理器系统和NUMA系统的广泛应用,slab终于暴露出不足:
复杂的队列管理管理数据和队列存储开销较大长时间运行partial队列可能会非常长对NUMA支持非常复杂为了解决这些高手们开发了slub:改造page结构来削减slab管理结构的开销、每个CPU都有一个本地活动的slab(kmem_cache_cpu)等。对于小型的嵌入式系统存在一个slab模拟层slob,在这种系统中它更有优势。
小内存的问题算是解决了,但还有一个大内存的问题:用伙伴系统分配10 x 4KB的数据时,会去16 x 4KB的空闲列表里面去找(这样得到的物理内存是连续的),但很有可能系统里面有内存,但是伙伴系统分配不出来,因为他们被分割成小的片段。那么,vmalloc就是要用这些碎片来拼凑出一个大内存,相当于收集一些“边角料”,组装成一个成品后“出售”:
之前的内存都是直接映射的,第一次感觉到页式管理的存在:D 另外对于高端内存,提供了kmap方法为page分配一个线性地址。
进程由不同长度的段组成:代码段、动态库的代码、全局变量和动态产生数据的堆、栈等,在Linux中为每个进程管理了一套虚拟地址空间:
在我们写代码malloc完以后,并没有马上占用那么大的物理内存,而仅仅是维护上面的虚拟地址空间而已,只有在真正需要的时候才分配物理内存,这就是COW(COPY-ON-WRITE:写时复制)技术,而物理分配的过程就是最复杂的缺页异常处理环节了,下面来看!
缺页异常在实际需要某个虚拟内存区域的数据之前,和物理内存之间的映射关系不会建立。假如进程访问的虚拟地址空间部分尚未与页帧关联,处理器自动引发一个缺页异常。在内核处理缺页异常时可以拿到的信息如下:
cr2:访问到线性地址err_code:异常发生时由控制单元压入栈中,表示发生异常的原因regs:发生异常时寄存器的值处理的流程如下:
发生缺页异常的时候,可能因为不常使用而被swap到磁盘上了,swap相关的命令如下:
命令作用swapon开启swapswapoff关闭swap/proc/sys/vm/swappiness分值越大越积极使用swap,可以修改/etc/sysctl.conf中添加vm.swappiness=xx来修改假如内存是mmap映射到内存中的,那么在读、写对应内存的时候也会产生缺页异常。
免责声明:
本文《Linux 内存管理知识学习总结》版权归原作者所有,内容不代表本站立场!
如本文内容影响到您的合法权益(含文章中内容、图片等),请及时联系本站,我们会及时删除处理。
推荐阅读

莱特币MimbleWimble协议落地:2026年267美元预测能否兑现?
数字认知网报道:Vqq数字认知网 - 区块链数字货币实时行情平台莱特币MimbleWimble协议落地:2026年267美元预测能否兑现?莱特币(Litecoin)作为加密货币领域的重要一员,自诞生以...
阅读: 32

莱特币机构抢筹暗流:从孙宇晨合作到美罗百货支付落地
数字认知网报道:LLa数字认知网 - 区块链数字货币实时行情平台在加密货币的风云变幻市场中,莱特币近期成为了备受瞩目的焦点。机构投资者们对莱特币的抢筹暗流涌动,引发了市场的广泛关注和热烈讨论。这种现象...
阅读: 45

莱特币VS瑞波币终极对决:SEC监管风暴中的支付赛道洗牌
数字认知网报道:R20数字认知网 - 区块链数字货币实时行情平台莱特币VS瑞波币终极对决:SEC监管风暴中的支付赛道洗牌在当今数字化浪潮中,加密货币作为一种新兴的支付手段正逐渐改变着传统金融格局。支付...
阅读: 51

知名NFT项目无聊猿公司Yuga Labs宣布:美国SEC调查结案 NFT不是证券
ewX数字认知网 - 区块链数字货币实时行情平台数字认知网(65901.com)讯:知名NFT项目「无聊猿(Bored Ape Yacht Club,BAYC)」背后的公司Yuga Labs宣布,美国...
阅读: 40

Doodles宣布将在Solana上发行Meme币DOOD!NFT周交易量飙至1600万美元
eHR数字认知网 - 区块链数字货币实时行情平台数字认知网(65901.com):Doodles新团队宣布会在Solana上发行$DOOD Meme币后,Doodles NFT的周交易量飙升到1,60...
阅读: 19

蓝筹NFT项目Doodles宣布发行代币DOOD!放弃以太坊先选择Solana
MWi数字认知网 - 区块链数字货币实时行情平台数字认知网(65901.com):在胖企鹅、Azuki等知名项目相继发币后,又一以太坊蓝筹NFT项目宣布发币!以太坊市值第6大NFT项目,以动画、短片以...
阅读: 51

MegaETH推出The Fluffle灵魂绑定NFT!承诺至少空投5%代币
Ztb数字认知网 - 区块链数字货币实时行情平台数字认知网(65901.com):近日获得Vitalik Buterin投资的以太坊Layer2 MegaETH宣布将发行旗舰NFT系列The Fluf...
阅读: 38

任天堂Switch2 正式亮相!可能导入元宇宙链游、NFT与冷钱包?
nnm数字认知网 - 区块链数字货币实时行情平台数字认知网(65901.com):任天堂自2017年推出Nintendo Switch游戏机后,一直是任天堂的主要销售动力,而经历多年等待,任天堂16日...
阅读: 60

区块链助力文化传承!印度铁路基于Polygon在大壶节推NFT车票
YPe数字认知网 - 区块链数字货币实时行情平台数字认知网(65901.com)讯:印度铁路餐饮和旅游公司(IRCTC)与区块链业者Chaincode Consulting携手合作,将在一年一度的宗教...
阅读: 54

美国纽约检察长向诈骗犯空投NFT传票!创司法史上新里程碑
eJf数字认知网 - 区块链数字货币实时行情平台数字认知网(65901.com):非同质化代币(NFT)创下侦办犯罪案件新用途!据纽约地检署网站公告,纽约总检察长Letitia James正在起诉一群...
阅读: 32
猜你喜欢

关于Ripple公司将托管的359亿XRP货币化的新计划的全部内容
2025-11-04

全球流动性是否正在走向枯竭?
2025-11-04

比特币2025:为何“数字黄金”未能兑现投资者期望?
2025-11-04

DeFi回购潮:信心修复能否带动市场回暖?
2025-11-04
新罕布什尔州因公众对能源和噪音的担忧暂缓加密货币挖矿法案
2025-11-04

贝莱德5亿美元抛售加密资产及欺诈丑闻引发市场崩盘担忧
2025-11-04
稳定币占据加密协议收入75%,成最赚钱领域
2025-11-04
顶级专家:XRP目标规模达万亿美元,西联汇款错失未来支付大局
2025-11-04

价格仅为0.035美元的MUTM:错过早期XRP投资者的新机遇
2025-11-04

机构加密货币采用迎来新高潮:10月39亿美元融资揭示战略机遇
2025-11-04
