乐趣区

关于后端:Linux内核分析与应用4内存管理

本系列是对 陈莉君 老师 Linux 内核剖析与利用 的学习与记录。讲的十分之好,举荐观看

留此记录,走马观花, 可作抛砖引玉


4.1 Linux 内存管理机制

lscpu 命令, 相似是优化后的 cat /proc/cpuinfo

实现虚拟内存的几种机制:

当 程序一旦跑起来, 那就变成了一个过程

一个过程的用户地址空间由两个数据结构来形容, mm_structvma_area_struct , 前者对过程整个用户空间进行形容, 后者对用户空间的各个内存区进行形容

  • 内存映射区(MMR,Memory Mapping Region)
  • 虚拟内存区(VMA)

对于 mm_struct, 最新版本的内核代码定义在[mm_types.h] 这个文件中

对于vma_area_struct :

mm_struct构造是由一个个 VMA 组成的

参考 < 深刻了解 Linux 内核 > 第 8,9 章


4.2 过程用户空间管理机制

写时复制技术(copy on write)

调用 do_mmap()创立一个 ” 虚存区 ”

虚存辨别三种: 公有映射, 共享映射, 匿名映射

上图显示了该过程 各个区的 起始地址

请页机制, 实现虚存治理的重要伎俩.

当一个过程运行的时候,CPU 拜访的是用户空间的虚地址, Linux 仅把以后要应用的大量页面装入到内存, 须要时通过 请页机制 将特定的页面调入到内存; 当拜访的页不在内存时, 就产生一个页故障, 并报告故障的起因.

如果是编程引起的异样, 而且还产生在内核态, 那须要毫不含糊地杀死该过程;
如果产生在用户态, 阐明是一个有效的内存援用, 程序要进行执行;
如果是一个真正的缺页引起的异样, 而且有非法的权限, 这时会进入到缺页异样处理程序

do_page_fault()函数

用户过程拜访内存 剖析:

用户态过程独占 虚拟地址空间, 两个过程的虚拟地址空间齐全可能是雷同的. 在拜访用户态虚拟内存空间时, 如果没有映射到物理地址, 这时就须要通过 请页机制 收回缺页异样的申请, 缺页异样陷入内核, 调配物理地址空间, 与用户态虚拟地址空间就建设起了映射关系


4.3 物理内存的 调配与回收机制(上)

当咱们说一个过程在执行的时候, 咱们在说什么呢?

从操作系统角度看, 一看过程最要害的特色, 是其领有独立的虚拟地址空间.

“ 请页机制 ”: 能够为过程申请物理内存

malloc()从堆中调配一块内存, 并将首地址返回给用户.

“ 低端内存 ” 和 ” 高端内存 ”

  • 搭档算法: 负责大块间断物理内存的调配和开释, 以 页框 为根本单位. 该机制能够防止内部碎片.
  • per-CPU 页框高速缓存: 内核常常申请和开释单个页框, 该缓存蕴含事后调配的页框, 用于满足本地 CPU 收回的单一页框申请.
  • slab 缓存: 服务小块物理内存的调配, 并且它也作为高速缓存, 次要针对内核中常常调配并开释的对象.
  • vmalloc 机制: 使得内核通过间断的线性地址来拜访非间断的物理页框, 这样能够最大限度的应用高端物理内存.

slab 分配机制 — 调配小块内存


内核空间非间断内存区的调配

最初都要调用 ” 搭档算法 ”

参考 < 深刻了解 Linux 内核 > 第三版第八章

思考:

  1. 用户空间 (过程) 是否有高端内存概念?
  2. 64 位 内核中有高端内存的说法吗?
  3. 在 32 位和 64 位零碎上, 用户过程能拜访多少物理内存? 内核代码能拜访多少物理内存?

4.4 物理内存的 调配与回收机制(下)

UMA 架构与 NUMA 架构下的自旋锁(CLH 锁与 MCS 锁)

Linux 内核学习笔记:SMP、UMA、NUMA

NUMA 的构造比 SMP 的构造更有劣势,为什么当初的电脑不必 NUMA 的构造呢?

从用户态到内核态的内存调配:

当用户程序通过零碎调用, 申请内存时, 首先陷入内核, 建设虚拟地址空间的映射, 取得一块虚拟内存区 VMA. 当过程对这块虚存区进行拜访时, 如果物理内存尚未调配, 此时产生一个缺页异样, 通过 getfreepage 申请一个或者多个物理页面, 并将此物理内存和虚拟内存的映射关系写入页表.

思考:

在物理内存为 1G 的计算机中, 是否 malloc(1.6G)? 为什么?


本文由 mdnice 多平台公布

退出移动版