Linux内核分析与应用4-内存管理

简介: Linux内核分析与应用4-内存管理

本系列是对 陈莉君 老师 Linux 内核分析与应用 的学习与记录。讲的非常之好,推荐观看

留此记录,蜻蜓点水,可作抛砖引玉

image.png

4.1 Linux内存管理机制

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

微信截图_20230926010328.png

微信截图_20230926010336.png

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

微信截图_20230926010416.png

微信截图_20230926010426.png

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

一个进程的用户地址空间由两个数据结构来描述, mm_struct和  vma_area_struct ,前者对进程整个用户空间进行描述,后者对用户空间的各个内存区进行描述

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


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

微信截图_20230926010440.png

微信截图_20230926010447.png

对于vma_area_struct :

image.png

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

微信截图_20230926010644.png

参考<深入理解Linux内核>第8,9章




4.2 进程用户空间管理机制


写时复制技术(copy on write)

调用do_mmap()创建一个"虚存区"

虚存区分三种: 私有映射,共享映射,匿名映射

微信截图_20230926010747.png

微信截图_20230926010754.png

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

微信截图_20230926010806.png

请页机制,实现虚存管理的重要手段.

当一个进程运行的时候,CPU访问的是用户空间的虚地址, Linux仅把当前要使用的少量页面装入到内存, 需要时通过请页机制将特定的页面调入到内存;当访问的页不在内存时,就产生一个页故障,并报告故障的原因.

image.png

如果是编程引起的异常,而且还发生在内核态,那需要毫不含糊地杀死该进程; 如果发生在用户态,说明是一个无效的内存引用,程序要停止执行; 如果是一个真正的缺页引起的异常,而且有合法的权限,这时会进入到缺页异常处理程序

微信截图_20230926010900.png

do_page_fault()函数


用户进程访问内存 分析:

用户态进程独占 虚拟地址空间,两个进程的虚拟地址空间完全可能是相同的. 在访问用户态虚拟内存空间时,如果没有映射到物理地址,这时就需要通过请页机制发出缺页异常的请求, 缺页异常陷入内核,分配物理地址空间,与用户态虚拟地址空间就建立起了映射关系

微信截图_20230926010937.png

微信截图_20230926010945.png

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


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

从操作系统角度看,一看进程最关键的特征,是其拥有独立的虚拟地址空间.

微信截图_20230926011001.png

微信截图_20230926011008.png

微信截图_20230926011022.png

微信截图_20230926011032.png

"请页机制":可以为进程请求物理内存

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

微信截图_20230926011131.png

"低端内存"和"高端内存"

微信截图_20230926011142.png

微信截图_20230926011152.png

  • 伙伴算法: 负责大块连续物理内存的分配和释放,以页框为基本单位. 该机制可以避免外部碎片.
  • per-CPU页框高速缓存: 内核经常请求和释放单个页框,该缓存包含预先分配的页框,用于满足本地CPU发出的单一页框请求.
  • slab缓存: 服务小块物理内存的分配,并且它也作为高速缓存,主要针对内核中经常分配并释放的对象.
  • vmalloc机制: 使得内核通过连续的线性地址来访问非连续的物理页框,这样可以最大限度的使用高端物理内存.


slab分配机制 -- 分配小块内存

微信截图_20230926011235.png

微信截图_20230926011242.png

内核空间非连续内存区的分配

微信截图_20230926011257.png

微信截图_20230926011304.png

微信截图_20230926011314.png

最后都要调用"伙伴算法"


参考<深入理解Linux内核>第三版第八章


思考:

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


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

微信截图_20230926011415.png

image.png

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

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

NUMA 的结构比 SMP 的结构更有优势,为什么现在的电脑不用 NUMA 的结构呢?

微信截图_20230926011439.png

微信截图_20230926011447.png

微信截图_20230926011455.png

微信截图_20230926011503.png

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


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


思考:

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


目录
相关文章
|
15天前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
119 67
|
4天前
|
存储 Linux
Linux内核中的current机制解析
总的来说,current机制是Linux内核中进程管理的基础,它通过获取当前进程的task_struct结构的地址,可以方便地获取和修改进程的信息。这个机制在内核中的使用非常广泛,对于理解Linux内核的工作原理有着重要的意义。
26 11
|
24天前
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
108 27
|
24天前
|
监控 Linux
Linux基础:文件和目录类命令分析。
总的来说,这些基础命令,像是Linux中藏匿的小矮人,每一次我们使用他们,他们就把我们的指令准确的传递给Linux,让我们的指令变为现实。所以,现在就开始你的Linux之旅,挥动你的命令之剑,探索这个充满神秘而又奇妙的世界吧!
70 19
|
1月前
|
自然语言处理 监控 Linux
Linux 内核源码分析---proc 文件系统
`proc`文件系统是Linux内核中一个灵活而强大的工具,提供了一个与内核数据结构交互的接口。通过本文的分析,我们深入探讨了 `proc`文件系统的实现原理,包括其初始化、文件的创建与操作、动态内容生成等方面。通过对这些内容的理解,开发者可以更好地利用 `proc`文件系统来监控和调试内核,同时也为系统管理提供了便利的工具。
71 16
|
2月前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
149 48
|
2月前
|
缓存 网络协议 Linux
PCIe 以太网芯片 RTL8125B 的 spec 和 Linux driver 分析备忘
本文详细介绍了 Realtek RTL8125B PCIe 以太网芯片的规格以及在 Linux 中的驱动安装和配置方法。通过深入分析驱动源码,可以更好地理解其工作原理和优化方法。在实际应用中,合理配置和优化驱动程序可以显著提升网络性能和稳定性。希望本文能帮助您更好地使用和管理 RTL8125B,以满足各种网络应用需求。
192 33
|
1月前
|
存储 Java
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
|
1月前
|
Java 编译器 Go
go的内存逃逸分析
内存逃逸分析是Go编译器在编译期间根据变量的类型和作用域,确定变量分配在堆上还是栈上的过程。如果变量需要分配在堆上,则称作内存逃逸。Go语言有自动内存管理(GC),开发者无需手动释放内存,但编译器需准确分配内存以优化性能。常见的内存逃逸场景包括返回局部变量的指针、使用`interface{}`动态类型、栈空间不足和闭包等。内存逃逸会影响性能,因为操作堆比栈慢,且增加GC压力。合理使用内存逃逸分析工具(如`-gcflags=-m`)有助于编写高效代码。
|
2月前
|
数据管理 Linux iOS开发
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
39 0
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析

热门文章

最新文章