嵌入式开发交流网论坛

标题: linux操作系统内存大串讲:段页式,slab,共享内存 [打印本页]

作者: 致命啲傷    时间: 2020-9-25 02:38
标题: linux操作系统内存大串讲:段页式,slab,共享内存
关注”技术简说“(13站同名),带你由浅入深学习linux内核源码。linux内核开发100讲免费教程,每天晚上9点准时更新,敬请收看。进我主页点”视频“栏目即可观看。

linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍 linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,linux 内核几种内存管理的方法,内存使用场景以及内存使用的那些坑。从内存的原理和结构,到内存的算法优化,再到使用场景,去探寻内存管理的机制和奥秘。
1、内存是什么?
1)内存又称主存,是 CPU 能直接寻址的存储空间,由半导体器件制成
2)内存的特点是存取速率快
[attach]52084[/attach]
2、内存的作用
1)暂时存放 cpu 的运算数据
2)硬盘等外部存储器交换的数据
3)保障 cpu 计算的稳定性和高性能
[attach]52085[/attach]
1、linux 内存地址空间 Linux 内存管理全貌
[attach]52086[/attach]
2、内存地址——用户态&内核态
[attach]52087[/attach]
3、内存地址——MMU 地址转换
[attach]52088[/attach]
4、内存地址——分段机制
1) 段选择符
2) 分段实现
5、内存地址——分页机制(32 位)
[attach]52089[/attach]
6、用户态地址空间
[attach]52090[/attach]
7、内核态地址空间
[attach]52091[/attach]
8、进程内存空间
[attach]52092[/attach]
三、 Linux 内存分配算法内存管理算法——对讨厌自己管理内存的人来说是天赐的礼物
1、内存碎片
1) 基本原理
2) 如何避免内存碎片
2、伙伴系统算法——组织结构
1) 概念
2) 外部碎片
[attach]52093[/attach]
3、伙伴系统算法——申请和回收
1) 申请算法
2) 回收算法
[attach]52094[/attach]
3) 条件
4、如何分配 4M 以上内存?
1) 为何限制大块内存分配
2) 内核中获取 4M 以上大内存的方法
5、伙伴系统——反碎片机制
1) 不可移动页
2) 可回收页
6、slab 算法——基本原理
1) 基本概念
2) 内部碎片
7、slab 分配器的结构
[attach]52095[/attach]
8、slab 高速缓存
1) 普通高速缓存
2) 专用高速缓存
9、内核态内存池
1) 基本原理
2) 内核 API
[attach]52096[/attach]
10、用户态内存池
1) C++ 实例
[attach]52097[/attach]
11、DMA 内存
1) 什么是 DMA
2) DMA 信号
[attach]52098[/attach]
四、 内存使用场景out of memory 的时代过去了吗?no,内存再充足也不可任性使用。
1、内存的使用场景
2、用户态内存分配函数
a) 如果当前连续内存块足够 realloc 的话,只是将 p 所指向的空间扩大,并返回 p 的指针地址。这个时候 q 和 p 指向的地址是一样的
b) 如果当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p 指向的内容 copy 到 q,返回 q。并将 p 所指向的内存空间删除
3、内核态内存分配函数
函数分配原理最大内存其他_get_free_pages直接对页框进行操作4MB适用于分配较大量的连续物理内存kmem_cache_alloc基于 slab 机制实现128KB适合需要频繁申请释放相同大小内存块时使用kmalloc基于 kmem_cache_alloc 实现128KB最常见的分配方式,需要小于页框大小的内存时可以使用vmalloc建立非连续物理内存到虚拟地址的映射物理不连续,适合需要大内存,但是对地址连续性没有要求的场合dma_alloc_coherent基于_alloc_pages 实现4MB适用于 DMA 操作ioremap实现已知物理地址到虚拟地址的映射适用于物理地址已知的场合,如设备驱动alloc_bootmem在启动 kernel 时,预留一段内存,内核看不见小于物理内存大小,内存管理要求较高
4、malloc 申请内存
[attach]52099[/attach]
[attach]52100[/attach]
5、缺页异常
[attach]52101[/attach]
6、用户进程访问内存分析
[attach]52102[/attach]
7、共享内存
1) 原理
[attach]52103[/attach]
2) shm 接口
五、 内存使用那些坑1、C 内存泄露
2、C 野指针
3、C 资源访问冲突
4、STL 迭代器失效
错误示例:删除当前迭代器,迭代器会失效
[attach]52104[/attach]
正确示例:迭代器 erase 时,需保存下一个迭代器
[attach]52105[/attach]
5、C++ 11 智能指针

6、C++ 11 更小更快更安全
forward_list 是单链表(std::list 是双链表),只需要顺序遍历的场合,forward_list 能更加节省内存,插入和删除的性能高于 list
[attach]52106[/attach]


To free pagecache, use echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes, use echo 3 >/proc/sys/vm/drop_caches




欢迎光临 嵌入式开发交流网论坛 (http://www.dianzixuexi.com/bbs/) Powered by Discuz! X3.2