💻 总结整理linux内核的内存管理的资料,包含论文,文章,视频,以及应用程序的内存泄露,内存池相关
本repo搜集整理全网Linux内核---内存管理模块相关知识。
所有数据来源于互联网。所谓取之于互联网,用之于互联网。
如果涉及版权侵犯,请邮件至 [email protected] ,我们将第一时间处理。
如果您对我们的项目表示赞同与支持,欢迎您 lssues 我们,或者邮件 [email protected] 我们,更加欢迎您 pull requests 加入我们。
感谢您的支持!
This Repo collects and organizes the whole network Linux kernel -- memory management module related knowledge.
All data comes from the Internet. The so-called take from the Internet, use for the Internet.
If copyright infringement is involved, please email [email protected] and we will deal with it as soon as possible.
If you agree to our project and support, welcome lssues, we, or email [email protected] us, More welcome pull requests to join us.
Thank you for your support.
📜 100篇文章
---------内存管理系列文章---------
内存管理系列五:alloc_pages从伙伴系统申请空间简易流程
----------英文文章鉴赏----------
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内核路径优化的不二法门之-slab与伙伴系统
一文了解,Linux内存管理,malloc、free 实现原理
📀 视频
Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈
内存管理 ---Slab | 内存映射 | kmalloc | vmalloc | 内核源码 | MM | brk
90分钟了解 Linux内存架构--- numa的优势 | slab的实现 | vmalloc的原理
内存分配与回收机制---伙伴算法|slab分析|内存映射|进程虚拟空间|请求调页|写时复制
3种内存泄漏的解决方案--hook|malloc函数|free函数|避免内存泄漏
剖析Linux内核MMU机制---页表原理|高速缓存|TLB工作原理|内存映射|不连续页原理
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|页框分配机制
Linux内存问题终极探讨---虚拟内存|内存池|内存泄漏|管理组件
-----西安交通大学内存管理(24讲)提取码1024-----
❓ 面试题
- 59问:内存管理
- 如何知道计算机内存布局?内存空间有多少?
- 何时去探明内存布局?由谁去探明呢?
- 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如何使用?
- 如何查看进程内存映射信息?
- 如何查看进程内存占用实际情况?
- 如何查看进程内存片段映射详情?
- 如何查看进程内存映射汇总信息?
📃 100篇论文
《Memory Management 101: Introduction to Memory Management in Linux》
《Virtual Memory Management Techniques in 2.6 Kernel and Challenges》
《Linux Physical Memory Page Allocation》
🌌 内存池相关
文章
框架
- userpro/MemoryPool:一个极简内存池实现
- DavidLiRemini/MemoryPool:简单有效的内存池实现
- DGuco/shmqueue:基于c++内存池,共享内存和信号量实现高速的进程间通信队列,单进程读单进程写无需加锁,多进程读多进程写用信号量集实现读写锁保证读写安全
- ycsoft/pool:基于ANSI C开发的内存池和线程池,性能优异
- hansionz/ConcurrentMemoryPool:一个三级缓存的高并发内存池
- Fang-create/memory_pool:内存池----仿nginx实现
- CandyConfident/HighPerformanceConcurrentServer:基于C++11、部分C++14/17特性的一个高性能并发httpserver,包括日志、线程池、内存池、定时器、网络io、http、数据库连接等模块。
- crspecter/ydx_slab_util:实现一个内存池,内存管理机制借鉴memcached,使用一系列链表管理不同大小的内存区块。
- jixuduxing/CommLib:linux常用库,使用boost和标准库编写的常用库,包含线程池、内存池、通信、日志、时间处理、定时器
- lrsand52m/MemoryPool:基于TLS的高并发内存池
- [tsreaper/my-allocator](一个简单而较为高效的 C++ Allocator,通过内存池实现):一个简单而较为高效的 C++ Allocator,通过内存池实现
- lhh0461/simple_mem_pool:简单的C++内存池模块
- hardrong/concurrent-memory-pool:基于TCmalloc实现的内存池
- ysluckly/ConcurrentMemoryPool:基于三级缓存架构的高并发内存池
- qixianghui123/memorypool:基于C++实现内存池技术 memorypool
- lr-erics/HashIndex:内建内存池的内存索引结构,面向特定场景业务数据,比如在线广告业务数据
- 1289148370/negix-:移植nginx内存池源码,实现简单的内存池类
- xjhahah/MemPool:C++项目之内存池技术
- besmallw/ngx_palloc:ngx源码分析——内存池
- LumosN/ConcurrentMemoryPool:C++项目 | 高并发内存池
- Lotu527/MemoryPool:基于C++11实现的内存池
- YanlinWangWang/Memory-Pool:C++实现的多线程内存池
- ADreamyj/Cache-Pool:这是一个高并发的内存池项目,其主要解决程序员在申请内存时存在锁竞争以及内存碎片的问题。
🍺 内存泄露
🛠 内存管理工具
Valgrind:Valgrind是一个用于构建动态分析工具的工具框架。有一些Valgrind工具可以自动检测许多内存管理和线程错误,并详细分析你的程序。您还可以使用Valgrind来构建新的工具。 Valgrind发行版目前包括7个产品质量的工具:一个内存错误检测器、两个线程错误检测器、一个缓存和分支预测分析器、一个调用图生成缓存和分支预测分析器,以及两个不同的堆分析器。它还包括一个实验性的SimPoint基本块向量生成器。
AddressSanitizer:Google出品的内存检测工具
内存性能指标
指标-工具映射图
工具-指标映射图
分析思路
分析的基本过程
a. 先用 free 和 top,查看系统整体的内存使用情况。
b. 用vmstat及pidstat查看内存变化情况,确定内存问题类型
c. 详细分析,如内存分配分析、缓存/缓冲区分析、具体进程的内存分析