本系列是对 陈莉君 老师 Linux 内核剖析与利用 的学习与记录。讲的十分之好,举荐观看
留此记录,走马观花, 可作抛砖引玉
4.1 Linux 内存管理机制
lscpu 命令, 相似是优化后的 cat /proc/cpuinfo
实现虚拟内存的几种机制:
当 程序一旦跑起来, 那就变成了一个过程
一个过程的用户地址空间由两个数据结构来形容, mm_struct
和 vma_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 内核 > 第三版第八章
思考:
- 用户空间 (过程) 是否有高端内存概念?
- 64 位 内核中有高端内存的说法吗?
- 在 32 位和 64 位零碎上, 用户过程能拜访多少物理内存? 内核代码能拜访多少物理内存?
4.4 物理内存的 调配与回收机制(下)
UMA 架构与 NUMA 架构下的自旋锁(CLH 锁与 MCS 锁)
Linux 内核学习笔记:SMP、UMA、NUMA
NUMA 的构造比 SMP 的构造更有劣势,为什么当初的电脑不必 NUMA 的构造呢?
从用户态到内核态的内存调配:
当用户程序通过零碎调用, 申请内存时, 首先陷入内核, 建设虚拟地址空间的映射, 取得一块虚拟内存区 VMA. 当过程对这块虚存区进行拜访时, 如果物理内存尚未调配, 此时产生一个缺页异样, 通过 getfreepage 申请一个或者多个物理页面, 并将此物理内存和虚拟内存的映射关系写入页表.
思考:
在物理内存为 1G 的计算机中, 是否 malloc(1.6G)? 为什么?
本文由 mdnice 多平台公布