内存管理:一文读懂Linux内存组织结构及页面布局

内存管理:一文读懂Linux内存组织结构及页面布局,第1张

1、内存是什么?

1) 内存又称主存,是 CPU 能直接寻址的存储空间,由半导体器件制成;

2) 内存的特点是存取速率快,断电一般不保存数据,非持久化设备;

2、内存的作用

1) 暂时存放 cpu 的运算数据

2) 硬盘等外部存储器交换的数据

3) 保障 cpu 计算机的稳定性和高性能

1、linux 内存地址空间 Linux 内存管理全貌

2、内存地址——用户态&内核态

3、内存地址——MMU 地址转换

4、内存地址——分段机制

1) 段选择符

更多Linux内核视频教程文档资料免费领取后台私信【 内核 】自行获取。

内核学习网站:

Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂

2) 分段实现

5、内存地址——分页机制(32 位)

6、用户态地址空间

7、内核态地址空间

8、进程内存空间

内存管理算法 ——对讨厌自己管理内存的人来说是天赐的礼物

1、内存碎片

1) 基本原理

2) 如何避免内存碎片

2、伙伴系统算法——组织结构

1) 概念

2) 外部碎片

3、伙伴系统算法——申请和回收

1) 申请算法

2) 回收算法

3) 条件

4、如何分配 4M 以上内存?

1) 为何限制大块内存分配

2) 内核中获取 4M 以上大内存的方法

5、伙伴系统——反碎片机制

1) 不可移动页

2) 可回收页

6、slab 算法——基本原理

1) 基本概念

2) 内部碎片

7、slab 分配器的结构

详细参考:

经典|图解Linux内存性能优化核心思想

8、slab 高速缓存

1) 普通高速缓存

2) 专用高速缓存

9、内核态内存池

1) 基本原理

2) 内核 API

10、用户态内存池

1) C++ 实例

11、DMA 内存

1) 什么是 DMA

2) DMA 信号

out of memory 的时代过去了吗?no,内存再充足也不可任性使用。

1、内存的使用场景

2、用户态内存分配函数

a) 如果当前连续内存块足够 realloc 的话,只是将 p 所指向的空间扩大,并返回 p 的指针地址。这个时候 q 和 p 指向的地址是一样的

b) 如果当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p 指向的内容 copy 到 q,返回 q。并将 p 所指向的内存空间删除

3、内核态内存分配函数

4、malloc 申请内存

5、缺页异常

6、用户进程访问内存分析

7、共享内存

1) 原理

2) shm 接口

1、C 内存泄露

2、C 野指针

3、C 资源访问冲突

4、STL 迭代器失效

错误示例:删除当前迭代器,迭代器会失效

正确示例:迭代器 erase 时,需保存下一个迭代器

5、C++ 11 智能指针

(1)原理分析:

(2)数据结构:

(3)使用方法:

6、C++ 11 更小更快更安全

六、 如何查看内存

可以通过 cat /proc/slabinfo 命令查看

可以通过 /proc/sys/vm/drop_caches来释放

Linux系统提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。在Linux系统中,进程的4GB内存空间被分为两个部分——用户空间与内核空间。用户空间的地址一般分布为0~3GB(即PAGE_OFFSET,在Ox86中它等于OxC0000000),这样,剩下的3~4GB为内核空间,用户进程通常只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。用户进程只有通过系统调用(代表用户进程在内核态执行)等方式才可以访问到内核空间。每个进程的用户空间都是完全独立、互不相干的,用户进程各自有不同的页表。而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。内核空间的虚拟地址到物理地址映射是被所有进程共享的,内核的虚拟空间独立于其他程序。Linux中1GB的内核地址空间又被划分为物理内存映射区、虚拟内存分配区、高端页面映射区、专用页面映射区和系统保留映射区这几个区域。对于x86系统而言,一般情况下,物理内存映射区最大长度为896MB,系统的物理内存被顺序映射在内核空间的这个区域中。当系统物理内存大于896MB时,超过物理内存映射区的那部分内存称为高端内存(而未超过物理内存映射区的内存通常被称为常规内存),内核在存取高端内存时必须将它们映射到高端页面映射区。Linux保留内核空间最顶部FIXADDR_TOP~4GB的区域作为保留区。当系统物理内存超过4GB时,必须使用CPU的扩展分页(PAE)模式所提供的64位页目录项才能存取到4GB以上的物理内存,这需要CPU的支持。加入了PAE功能的Intel Pentium Pro及以后的CPU允许内存最大可配置到64GB,它们具备36位物理地址空间寻址能力。由此可见,对于32位的x86而言,在3~4GB之间的内核空间中,从低地址到高地址依次为:物理内存映射区隔离带vmalloc虚拟内存分配器区隔离带高端内存映射区专用页面映射区保留区。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7289957.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存