LinuxLinux学习|Gentoo/Arch/FreeBSD我用 Linux

深度好文:Linux系统内存知识,看完还不会请来找我

2020-06-29  本文已影响0人  笃学私教

Linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍Linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,Linux 内核几种内存管理的方法,内存使用场景以及内存使用的那些坑。

从内存的原理和结构,到内存的算法优化,再到使用场景,去探寻内存管理的机制和奥秘。

一、走进Linux 内存

1、内存是什么?

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

2)内存的特点是存取速率快

深度好文:Linux系统内存知识,看完还不会请来找我

2、内存的作用

深度好文:Linux系统内存知识,看完还不会请来找我

二、 Linux 内存地址空间

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

深度好文:Linux系统内存知识,看完还不会请来找我

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

区别:每个进程都有完全属于自己的,独立的,不被干扰的内存空间;用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用;内核态线程共享内核地址空间;

深度好文:Linux系统内存知识,看完还不会请来找我

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

深度好文:Linux系统内存知识,看完还不会请来找我

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

  1. 段选择符
  1. 分段实现
深度好文:Linux系统内存知识,看完还不会请来找我

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

深度好文:Linux系统内存知识,看完还不会请来找我

6、用户态地址空间

深度好文:Linux系统内存知识,看完还不会请来找我

7、内核态地址空间

深度好文:Linux系统内存知识,看完还不会请来找我

8、进程内存空间

深度好文:Linux系统内存知识,看完还不会请来找我

三、 Linux 内存分配算法

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

1、内存碎片

  1. 基本原理
  1. 如何避免内存碎片

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

  1. 概念
  1. 外部碎片
深度好文:Linux系统内存知识,看完还不会请来找我

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

  1. 申请算法
  1. 回收算法
深度好文:Linux系统内存知识,看完还不会请来找我 深度好文:Linux系统内存知识,看完还不会请来找我
  1. 条件

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

  1. 为何限制大块内存分配
  1. 内核中获取 4M 以上大内存的方法

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

  1. 不可移动页
  1. 可回收页

6、slab 算法——基本原理

  1. 基本概念
  1. 内部碎片

7、slab 分配器的结构

深度好文:Linux系统内存知识,看完还不会请来找我

8、slab 高速缓存

  1. 普通高速缓存
  1. 专用高速缓存

9、内核态内存池

  1. 基本原理
  1. 内核 API
深度好文:Linux系统内存知识,看完还不会请来找我

10、用户态内存池

  1. C++ 实例
深度好文:Linux系统内存知识,看完还不会请来找我

11、DMA 内存

  1. 什么是 DMA
  1. DMA 信号
深度好文:Linux系统内存知识,看完还不会请来找我

四、 内存使用场景

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

1、内存的使用场景

2、用户态内存分配函数

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 申请内存

深度好文:Linux系统内存知识,看完还不会请来找我 深度好文:Linux系统内存知识,看完还不会请来找我

5、缺页异常

深度好文:Linux系统内存知识,看完还不会请来找我

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

深度好文:Linux系统内存知识,看完还不会请来找我

7、共享内存

  1. 原理
深度好文:Linux系统内存知识,看完还不会请来找我
  1. Shm 接口

五、 内存使用那些坑

1、C 内存泄露

2、C 野指针

3、C 资源访问冲突

4、STL 迭代器失效

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

深度好文:Linux系统内存知识,看完还不会请来找我

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

深度好文:Linux系统内存知识,看完还不会请来找我

5、C++ 11 智能指针

深度好文:Linux系统内存知识,看完还不会请来找我 深度好文:Linux系统内存知识,看完还不会请来找我 深度好文:Linux系统内存知识,看完还不会请来找我

(2)数据结构:

![](https://img.haomeiwen.com/i2184951/552cd9b834b5c878?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

(3)使用方法:a. lock() 获取所管理的对象的强引用指针 b. expired() 检测所管理的对象是否已经释放 c. get() 访问智能指针对象

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

forward_list 是单链表(std::list 是双链表),只需要顺序遍历的场合,forward_list 能更加节省内存,插入和删除的性能高于 list

深度好文:Linux系统内存知识,看完还不会请来找我 深度好文:Linux系统内存知识,看完还不会请来找我 深度好文:Linux系统内存知识,看完还不会请来找我 深度好文:Linux系统内存知识,看完还不会请来找我 深度好文:Linux系统内存知识,看完还不会请来找我
上一篇 下一篇

猜你喜欢

热点阅读