本系列是对 陈莉君 老师 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多平台公布