广告
返回顶部
首页 > 资讯 > 操作系统 >详解Linux内核内存管理架构
  • 362
分享到

详解Linux内核内存管理架构

Linux内存架构 2022-06-04 22:06:06 362人浏览 独家记忆
摘要

内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,而且对性能也有很高的要求。本文从内存管理硬

内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,而且对性能也有很高的要求。本文从内存管理硬件架构、地址空间划分和内存管理软件架构三个方面入手,尝试对内存管理的软硬件架构做一些宏观上的分析总结

内存管理硬件架构

因为内存管理是内核最为核心的一个功能,针对内存管理性能优化,除了软件优化,硬件架构也做了很多的优化设计。下图是一个目前主流处理器上的存储器层次结构设计方案。

从图中可以看出,对于读写内存,硬件设计了3条优化路径。

1)首先L1 cache支持虚拟地址寻址,保证CPU出来的虚拟地址(VA)不需要转换成物理地址(PA)就可以用来直接查找L1 cache,提高cache查找效率。当然用VA查找cache,有安全等缺陷,这需要CPU做一些特别的设计来进行弥补,具体可以阅读《计算机体系结构:量化研究方法》了解相关细节。

2)如果L1 cache没有命中,这就需要进行地址转换,把VA转换成PA。linux的内存映射管理是通过页表来实现的,但是页表是放在内存中的,如果每次地址转换过程都需要访问一次内存,其效率是十分低下的。这里CPU通过TLB硬件单元来加速地址转换。

3)获得PA后,在L2 cache中再查找缓存数据。L2 cache一般比L1 cache大一个数量级,其查找命中率也更高。如果命中获得数据,则可避免去访问内存,提高访问效率。

可见,为了优化内存访问效率,现代处理器引入多级cache、TLB等硬件模块(如下图是一款8核MIPS处理器硬件框图)。每个硬件模块内部还有大量的设计细节,这里不再深入,如有兴趣可以阅读《计算机体系结构:量化研究方法》等书籍进一步了解。

内存映射空间划分

根据不同的内存使用方式和使用场景需要,内核把内存映射地址空间划分成多个部分,每个划分空间都有自己的起止地址、分配接口和使用场景。下图是一个常见的32位地址空间划分结构。

  • DMA内存动态分配地址空间:一些DMA设备因为其自身寻址能力的限制,不能访问所有内存空间。如早期的ISA设备只能在24位地址空间执行DMA,即只能访问前16MB内存。所以需要划分出DMA内存动态分配空间,即DMA zone。其分配通过加上GFP_ATOMIC控制符的kmalloc接口来申请。
  • 直接内存动态分配地址空间:因为访问效率等原因,内核对内存采用简单的线性映射,但是因为32位CPU的寻址能力(4G大小)和内核地址空间起始的设置(3G开始),会导致内核的地址空间资源不足,当内存大于1GB时,就无法直接映射所有内存。无法直接映射的地址空间部分,即highmem zone。在DMA zone和highmem zone中间的区域即nORMal zone,主要用于内核的动态内存分配。其分配通过kmalloc接口来申请。
  • 高端内存动态分配地址空间:高端内存分配的内存是虚拟地址连续而物理地址不连续的内存,一般用于内核动态加载的模块和驱动,因为内核可能运行了很久,内存页面碎片情况严重,如果要申请大的连续地址的内存页会比较困难,容易导致分配失败。根据应用需要,高端内存分配提供多个接口:
  • vmalloc:指定分配大小,page位置和虚拟地址隐式分配;
  • vmap:指定page位置数组,虚拟地址隐式分配;
  • ioremap:指定物理地址和大小,虚拟地址隐式分配。
  • 持久映射地址空间:内核上下文切换会伴随着TLB刷新,这会导致性能下降。但一些使用高端内存的模块对性能也有很高要求。持久映射空间在内核上下文切换时,其TLB不刷新,所以它们映射的高端地址空间寻址效率较高。其分配通过kmap接口来申请。kmap与vmap的区别是:vmap可以映射一组page,即page不连续,但虚拟地址连续,而kmap只能映射一个page到虚拟地址空间。kmap主要用于fs、net等对高端内存访问有较高性能要求的模块中。
  • 固定映射地址空间:持久映射的问题是可能会休眠,在中断上下文、自旋临界区等不能阻塞的场景中不可用。为了解决这个问题,内核又划分出固定映射,其接口不会休眠。固定映射空间通过kmap_atomic接口来映射。kmap_atomic的使用场景与kmap较为相似,主要用于mm、fs、net等对高端内存访问有较高性能要求而且不能休眠的模块中。

不同的CPU体系架构在地址空间划分上不尽相同,但为了保证CPU体系差异对外部模块不可见,内存地址空间的分配接口的语义是一致的。

因为64位CPU一般都不需要高端内存(当然也可以支持),在地址空间划分上与32位CPU的差异较大,下图是一个MIPS64 CPU的内核地址空间划分图。

内存管理软件架构

内核内存管理的核心工作就是内存的分配回收管理,其内部分为2个体系:页管理和对象管理。页管理体系是一个两级的层次结构,对象管理体系是一个三级的层次结构,分配成本和操作对CPU cache和TLB的负面影响,从上而下逐渐pfhrMW升高。

页管理层次结构:由冷热缓存、伙伴系统组成的两级结构。负责内存页的缓存、分配、回收。

对象管理层次结构:由per-cpu高速缓存、slab缓存、伙伴系统组成的三级结构。负责对象的缓存、分配、回收。这里的对象指小于一页大小的内存块。

除了内存分配,内存释放也是按照此层次结构操作。如释放对象,先释放到per-cpu缓存,再释放到slab缓存,最后再释放到伙伴系统。

框图中有三个主要模块,即伙伴系统、slab分配器和per-cpu(冷热)缓存。他们的对比分析如下。

--结束END--

本文标题: 详解Linux内核内存管理架构

本文链接: https://www.lsjlt.com/news/19755.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Linux内核内存管理架构
    内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,而且对性能也有很高的要求。本文从内存管理硬...
    99+
    2022-06-04
    Linux 内存 架构
  • SQLServer的内存管理架构详解
    目录一、Windows的虚拟内存管理器二、SQL Server 内存体系结构2.1、传统(虚拟)内存2.2、地址窗口扩展 (AWE) 内存三、从 SQL Server 2012 (11.x) 开始发生的改变3.1、对内存...
    99+
    2023-04-19
    SQLServer的内存管理架构 SQL Server内存管理 SQL内存架构
  • 如何解析Linux系统架构中的内核
    如何解析Linux系统架构中的内核,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。概述Linux系统一般有4个主要部分组成,内核、shell、文件系统和应用程序。内核、shell...
    99+
    2023-06-16
  • Linux内核设备驱动之内存管理笔记整理
    到目前为止,内存管理是unix内核中最复杂的活动。我们简单介绍一下内存管理,并通过实例说明如何在内核态获得内存。 (1)各种地址 对于x86处理器,需要区分以下三种地址: *逻辑地址(logical addres...
    99+
    2022-06-04
    linux内存 linux内存管理 linux内核设备驱动
  • SQLServer的内存管理架构是什么
    本文小编为大家详细介绍“SQLServer的内存管理架构是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“SQLServer的内存管理架构是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、Windows...
    99+
    2023-07-06
  • JVM内存管理之JAVA语言的内存管理详解
    引言内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑。不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题。可怕的事情还不只...
    99+
    2023-05-31
    jvm 内存管理 java
  • react底层的四大核心内容架构详解
    目录reactreact-domreact-reconcilerscheduler总结react 提供定义 react 组件(ReactElement)的必要函数, 一般来说需要和渲...
    99+
    2022-11-13
  • 怎么解决Linux内核内存泄漏
    这篇文章主要讲解了“怎么解决Linux内核内存泄漏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决Linux内核内存泄漏”吧!什么是内存泄漏:程序向系统申请内存,使用完不需要之后,不释...
    99+
    2023-06-15
  • 详解C/C++内存管理
    目录C/C++内存分布C语言中动态内存管理方式C++中动态内存管理方式new和delete操作内置类型new和delete操作自定义类型operator new和operator d...
    99+
    2022-11-12
  • 详解Swift的内存管理
    目录内存管理weak循环引用闭包的循环引用self的循环引用内存访问冲突指针指针分类获得变量的指针创建指针指针之间的转换内存管理 和OC一样, 在Swift中也是采用基于引用计数的A...
    99+
    2022-11-12
  • 如何理解Linux内核及其相关架构的依赖关系
    这篇文章主要介绍“如何理解Linux内核及其相关架构的依赖关系”,在日常操作中,相信很多人在如何理解Linux内核及其相关架构的依赖关系问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Linux内核及其...
    99+
    2023-06-12
  • MSSQL内存架构及管理是怎样的
    本篇文章给大家分享的是有关MSSQL内存架构及管理是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 1.  MSS...
    99+
    2022-10-19
  • C++动态内存管理详解
    目录1.C/C++程序地址空间2.C语言动态内存管理(1)malloc(2)calloc(3)realloc(4)free3.C++动态内存管理(1)C++为什么要设计一套自己专属的...
    99+
    2022-11-12
  • Java内存区域管理详解
    目录1 关于自动内存管理2 运行时数据区域2.1 程序计数器2.2 虚拟机栈2.2.1 局部变量表2.2.2 操作数栈2.3 本地方法栈2.4 堆2.5 方法区2.5.1 运行时常量...
    99+
    2022-11-13
  • C++内存管理详细解析
    目录一、C++内存管理1、 new/delete表达式2、new/delete重载3、类内自定义allocator(per-class allocator) 二、多线程内存分配器1、...
    99+
    2022-11-12
  • 怎么进行Linux系统内核架构分析
    这期内容当中小编将会给大家带来有关怎么进行Linux系统内核架构分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Linux系统中内核是一个非常重要的一部分,那么Linux内核具体是什么样子呢?下面本篇文...
    99+
    2023-06-28
  • Linux内核设备驱动之内核的时间管理笔记整理
    (1)内核中的时间概念 时间管理在linux内核中占有非常重要的作用。 相对于事件驱动而言,内核中有大量函数是基于时间驱动的。 有些函数是周期执行的,比如每10毫秒刷新一次屏幕; 有些函数是推后一定时间执行的,比...
    99+
    2022-06-04
    linux内核的时间管理 linux内核设备驱动
  • Linux内核宏Container_Of的详细解释
    目录1. 结构体在内存中是如何存储的2. container_of宏3. typeof4. (((type *)0)->member)5. const typeof(((type * )0) ->member...
    99+
    2022-06-04
    Linux内核宏中Container_Of Linux内核宏 Container_Of
  • C++的内存管理详细解释
    目录一、C/C++内存分布二、C语言中动态内存管理方式:1、malloc/calloc/realloc区别:三、C++中动态内存管理:new/delete四、实现原理五、面试常问问题...
    99+
    2022-11-12
  • Python中的内存管理之python list内存使用详解
    前言 使用 Python 的时候,我们知道 list 是一个长度可变对的数组, 可以通过 insert,append 和 extend 轻易的拓展其中的元素个数。 也可以使用运算符 ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作