> **本文涉及的资料全部打包放到我Github仓:**
> [https://github.com/0voice/kernel_memory_management](https://github.com/0voice/kernel_memory_management)
> **有需要的可以前去下载,或者觉得还不错,请给我Star,感谢支持!**
![img](https://pic2.zhimg.com/80/v2-8e12b3ab607de069998f8b8f79dcf4d0_720w.png)
## 📜 100篇文章
内存管理(一):硬件原理 和 分页管理
内存管理(二):内存的动态申请和释放
内存管理(三):进程的内存消耗和泄漏
内存管理(四):内存与IO的交换
内存管理(五):其他工程问题以及调优
---------内存管理系列文章---------
内存管理系列一:启动简介
内存管理系列二:创建启动阶段的页表
内存管理系列三:MMU前CPU初始化及打开MMU
内存管理系列四:setup_arch简介(内存管理初始化)
内存管理系列五:alloc_pages从伙伴系统申请空间简易流程
内存管理系列六:伙伴系统之buffered_rmqueue
内存管理系列七:slub初始化
内存管理系列八:slub创建
内存管理系列九:slub申请内存
内存管理系列十:slub回收
内存管理系列十一:slub销毁
内存管理系列十二:vmalloc内存机制
内存管理系列十三:VMA操作
内存管理系列十四:brk
内存管理系列十五:do_page_fault缺页中断
内存管理系列十六:反向映射RMAP
内存管理系列十七:内存池
内存管理系列十八:内存回收之LRU链表
内存管理系列十九:内存压缩算法
内存管理系列二十:内存压缩算法之数据同步
内存管理系列二十一:内存回收入口
内存管理系列二十二:内存回收核心流程
----------英文文章鉴赏----------
Linux: large-memory management histories
Looking at kmalloc() and the SLUB Memory Allocator
Memory Management in OS: Contiguous, Swapping, Fragmentation
Memory Management in Operating System
Operating System - Memory Management
Virtual Memory in OS: What is, Demand Paging, Advantages
----------分割线----------
Linux 内核(5.4.81)—内存管理模块源码分析
glibc2.23 ptmalloc 原理概述
多核心Linux内核路径优化的不二法门之-slab与伙伴系统
尽情阅读,技术进阶,详解mmap原理
浅谈Linux内存管理机制
Linux中的内存管理机制
C++中内存管理之new、delete
malloc和free的实现原理解析
常用寄存器总结
内存碎片之外部碎片与内部碎片
Linux虚拟内存管理,MMU机制,原来如此
一文了解,Linux内存管理,malloc、free 实现原理
内存管理之内存映射
内存管理之分页
内存管理之内核空间和用户空间
Linux 内存占用分析的几个方法,你知道几个?
深入理解 Linux 内存子系统
深入理解 glibc malloc:内存分配器实现原理
图解 Linux 内存性能优化核心思想
![img](https://pic1.zhimg.com/80/v2-652f7105ac4f93ca7d57cbd870aaf81b_720w.png)
## 📀 视频
Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈
内存管理 ---Slab | 内存映射 | kmalloc | vmalloc | 内核源码 | MM | brk
90分钟了解 Linux内存架构--- numa的优势 | slab的实现 | vmalloc的原理
内存分配与回收机制---伙伴算法|slab分析|内存映射|进程虚拟空间|请求调页|写时复制
3种内存泄漏的解决方案--hook|malloc函数|free函数|避免内存泄漏
剖析Linux内核MMU机制---页表原理|高速缓存|TLB工作原理|内存映射|不连续页原理
虚拟内存空间之VMA实战操作
Linux内核内存管理(一)---内存映射|空间管理|ARM32/64页表|slab分配器|malloc
Linux内核内存管理(二)---malloc|mmap|反向映射|缺页中断处理|回收页面|KSM实现|内存漏洞|匿名页面
Linux内核内存管理(三)---Slab机制架构|物理页面|管理区|分配/释放页面
Linux内核之内存页回收---LRU及反向映射?如何异步回收、直接回收?以及回收slab缓存
Linux内核内存管理专题训练营(一)---伙伴系统|slab分配器|vmalloc()|malloc()|TLB|虚拟内存|缺页机制
Linux内核内存管理专题训练营(二)---伙伴系统|slab分配器|vmalloc()|malloc()|TLB|虚拟内存|缺页机制
Linux内核精讲之内存管理---物理内存组织|内核引导|内存映射
Linux物理内存页面分配---kmalloc|slab/slub|页框分配机制
![img](https://pic2.zhimg.com/80/v2-3c81bd917f4f6edbfe614c5560340b05_720w.png)
## ❓ 面试题
## [**59问:内存管理**](https://github.com/0voice/kernel_memory_management/blob/main/%E2%9C%8D%20%E6%96%87%E7%AB%A0/59%E9%97%AE%EF%BC%9A%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.md)
- 如何知道计算机内存布局?内存空间有多少?
- 何时去探明内存布局?由谁去探明呢?
- kernel会加载到何处呢?由什么决定它的位置?
- kernel映像如何隐匿自己的位置?
- 探知的e820表如何处理?
- 内存是连续的吗?
- 处理完毕的e820表如何管理?
- 启动之时内存如何映射的?
- 保护模式是怎样的?相比实模式有何特点?
- 页保护模式是怎样的?
- 页面映射有何作用?都有什么好处?
- x86支持的映射模式都有哪些形式?如何分级的?
- 内核如何处理多样式的页映射?
- 面对NUMA等复杂内存环境如何处理?
- 内核页表如何建立?
- 内核态进程虚拟地址与物理内存的映射关系?
- 用户态进程虚拟内存与物理内存的关系如何?
- 内存管理框架如何构造?
- Kernel内存空间如何划分?
- 64位地址空间如何划分?
- 内存分配空间如何实现不可预测性?
- 物理内存是如何管理的?怎么分配的?
- Buddy管理算法所处的位置?在什么地方体现?
- 内存碎片化了怎么办?
- 如何为驱动应用预留大块连续内存?
- LRU如何运作?
- 内存回收是如何运作的?
- 相同的内存浪费内存空间了?
- 页面空间监测手段有什么?
- 如何降低页面分配的可预测性?
- 如何防范内存泄密?
- 如何查看Buddy管理算法下的内存类型信息?
- 小块内存空间如何分配管理?
- SLUB如何管理内存的?
- 如何查看slab信息?
- 如何防范slab空闲链表的攻击?
- SLUB分配如何防止被预判?
- kmalloc和kfree如何实现的?
- kernel的内存泄漏如何定位?
- kernel有内存检测机制吗?
- 支离破碎的内存如何得到大块连续内存?
- 如何查看vmalloc信息?
- Percpu内存空间如何管理的?
- 从proc接口还可以看到什么?
- 容器的内存如何管理?
- 内核如何防范信息外泄?
- 物理内存页面耗尽了如何处理?
- 内核代码段如何进行自我防护?
- 内核代码段如何防护注入?
- kernel程序空间能否再压榨?
- 面向用户态程序,内核提供了哪些内存分配接口?
- brk接口实现了什么?
- mmap接口实现了什么?
- 用户态内存如何管理?
- glibc对brk和mmap如何使用?
- 如何查看进程内存映射信息?
- 如何查看进程内存占用实际情况?
- 如何查看进程内存片段映射详情?
- 如何查看进程内存映射汇总信息?
![img](https://pic1.zhimg.com/80/v2-01b790260d1a25cbae68425c12ae0507_720w.png)
## 📃 100篇论文
《ARM的虚拟内存管理技术的研究》
《C语言的内存漏洞分析与研究》
《FreeRTOS内存管理方案的分析与改进》
《Linux Memory Management》
《Linux内存管理分析与研究》
《Linux内存管理的设计与实现》
《Linux内核中内存池的实现及应用》
《Linux内核中动态内存检测机制的研究》
《Linux内核伙伴系统分析》
《Linux内核内存池实现研究》
《Linux实时内存的研究与实现》
《Linux操作系统内核分析与研究》
《Memory Management 101: Introduction to Memory Management in Linux》
《Memory Management in Linux》
《Memory Management》
《NUMA架构内多个节点间访存延时平衡的内存分配策略》
《Nginx Slab算法研究》
《TCP_IP协议栈的轻量级多线程实现》
《VC中利用内存映射文件实现进程间通信的方法》
《Virtual Memory Management Techniques in 2.6 Kernel and Challenges》
《Visual C 中利用内存映射文件在进程之间共享数据》
《Linux Physical Memory Page Allocation》
《一个内存分配器的设计和实现》
《一种Linux内存管理机制》
《一种TLB结构优化方法》
《一种优化的伙伴系统存储管理算法设计》
《一种基于虚拟机的动态内存泄露检测方法》
《一种提高Linux内存管理实时性的设计方案》
《一种改进的Linux内存分配机制》
《一种改进的伙伴系统内存管理方法》
《一种跨平台内存池的设计与实现》
《一种高效的池式内存管理器的设计》
《云计算平台中多虚拟机内存协同优化策略研》
《云计算平台中多虚拟机内存协同优化策略研究》
《内存管理机制的高效实现研究》
《分页存储管理系统中内存有效访问时间的计算》
《利用内存映射连续性提高TLB地址覆盖范围的技术评测》
《动态内存分配器研究综述》
《动态存储管理机制的改进及实现》
《基于C 的高效内存池的设计与实现》
《基于C 自定义内存分配器的实现》
《基于Linux内核的动态内存管理机制的实现》
《基于Linux内核页表构建内核隔离空间的研究及实现》
《基于RDMA和NVM的大数据系统一致性协议研究》
《基于RDMA高速网络的高性能分布式系统》
《基于RelayFS的内核态内存泄露的检测和跟踪》
《基于linux用户态可自控缓冲区管理设计与实现》
《基于multimap映射的动态内存分配算法探究》
《基于云计算虚拟化平台的内存管理研究》
《基于内存池的空间数据调度算法》
《多核系统内存管理算法的研究》
《实时系统内存管理方案的设计与实现》
《对linux伙伴系统及其反碎片机制的研究》
《嵌入式实时系统动态内存分配管理器的设计与实现》
《并发数据结构及其在动态内存管理中的应用》
《应用协同的进程组内存管理支撑技术》
《支持高性能IPC的内存管理策略研究》
《有效的C 内存泄露检测方法》
《浅析伙伴系统的分配与回收》
《用户态内存管理关键技术研究》
《申威处理器页表结构Cache的优化研究与实现》
《虚拟化系统中的内存管理优化》
《面向Linux内核空间的内存分配隔离方法的研究与实现》
《页面分配器的研究与实现》
![img](https://pic2.zhimg.com/80/v2-0eaadf348c94e19b661e5db78ce92704_720w.png)
## 🌌 内存池相关
### 文章
- 18张图揭秘高性能Linux服务器内存池技术是如何实现的
- C++ 实现高性能内存池
- Nginx 内存池管理
- 性能优化:高效内存池的设计与实现
### 框架
- [userpro/MemoryPool](https://github.com/userpro/MemoryPool):一个极简内存池实现
- [DavidLiRemini/MemoryPool](https://github.com/DavidLiRemini/MemoryPool):简单有效的内存池实现
- [DGuco/shmqueue](https://github.com/DGuco/shmqueue):基于c++内存池,共享内存和信号量实现高速的进程间通信队列,单进程读单进程写无需加锁,多进程读多进程写用信号量集实现读写锁保证读写安全
- [ycsoft/pool](https://github.com/ycsoft/pool):基于ANSI C开发的内存池和线程池,性能优异
- [hansionz/ConcurrentMemoryPool](https://github.com/hansionz/ConcurrentMemoryPool):一个三级缓存的高并发内存池
- [Fang-create/memory_pool](https://github.com/Fang-create/memory_pool):内存池----仿nginx实现
- [CandyConfident/HighPerformanceConcurrentServer](https://github.com/CandyConfident/HighPerformanceConcurrentServer):基于C++11、部分C++14/17特性的一个高性能并发httpserver,包括日志、线程池、内存池、定时器、网络io、http、数据库连接等模块。
- [crspecter/ydx_slab_util](https://github.com/crspecter/ydx_slab_util):实现一个内存池,内存管理机制借鉴memcached,使用一系列链表管理不同大小的内存区块。
- [jixuduxing/CommLib](https://github.com/jixuduxing/CommLib):linux常用库,使用boost和标准库编写的常用库,包含线程池、内存池、通信、日志、时间处理、定时器
- [lrsand52m/MemoryPool](https://github.com/lrsand52m/MemoryPool):基于TLS的高并发内存池
- [tsreaper/my-allocator](一个简单而较为高效的 C++ Allocator,通过内存池实现):一个简单而较为高效的 C++ Allocator,通过内存池实现
- [lhh0461/simple_mem_pool](https://github.com/lhh0461/simple_mem_pool):简单的C++内存池模块
- [hardrong/concurrent-memory-pool](https://github.com/hardrong/concurrent-memory-pool):基于TCmalloc实现的内存池
- [ysluckly/ConcurrentMemoryPool](https://github.com/ysluckly/ConcurrentMemoryPool):基于三级缓存架构的高并发内存池
- [qixianghui123/memorypool](https://github.com/qixianghui123/memorypool):基于C++实现内存池技术 memorypool
- [lr-erics/HashIndex](https://github.com/lr-erics/HashIndex):内建内存池的内存索引结构,面向特定场景业务数据,比如在线广告业务数据
- [1289148370/negix-](https://github.com/1289148370/negix-):移植nginx内存池源码,实现简单的内存池类
- [xjhahah/MemPool](https://github.com/xjhahah/MemPool):C++项目之内存池技术
- [besmallw/ngx_palloc](https://github.com/besmallw/ngx_palloc):ngx源码分析——内存池
- [LumosN/ConcurrentMemoryPool](https://github.com/LumosN/ConcurrentMemoryPool):C++项目 | 高并发内存池
- [Lotu527/MemoryPool](https://github.com/Lotu527/MemoryPool):基于C++11实现的内存池
- [YanlinWangWang/Memory-Pool](https://github.com/YanlinWangWang/Memory-Pool):C++实现的多线程内存池
- [ADreamyj/Cache-Pool](https://github.com/ADreamyj/Cache-Pool):这是一个高并发的内存池项目,其主要解决程序员在申请内存时存在锁竞争以及内存碎片的问题。
## 🍺 内存泄露
- 5 useful tools to detect memory leaks with examples
- 内存泄漏的在线排查
## 🛠 内存管理工具
[Valgrind](https://valgrind.org/):Valgrind是一个用于构建动态分析工具的工具框架。有一些Valgrind工具可以自动检测许多内存管理和线程错误,并详细分析你的程序。您还可以使用Valgrind来构建新的工具。 Valgrind发行版目前包括7个产品质量的工具:一个内存错误检测器、两个线程错误检测器、一个缓存和分支预测分析器、一个调用图生成缓存和分支预测分析器,以及两个不同的堆分析器。它还包括一个实验性的SimPoint基本块向量生成器。
[AddressSanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizer):Google出品的内存检测工具
### 内存性能指标
![img](https://pic3.zhimg.com/80/v2-7db5866ea5b0772c0f54ec621eb698f7_720w.png)
### 指标-工具映射图
![img](https://pic1.zhimg.com/80/v2-4afdb65cf81673750b3d8418d083c6c5_720w.png)
### 工具-指标映射图
![img](https://pica.zhimg.com/80/v2-a355ab95f831c280ef1e52ff81209c0b_720w.png)
### 分析思路
a. 先用 free 和 top,查看系统整体的内存使用情况。
b. 用vmstat及pidstat查看内存变化情况,确定内存问题类型
c. 详细分析,如内存分配分析、缓存/缓冲区分析、具体进程的内存分析
有疑问加站长微信联系(非本文作者)