Linux内存相关名词介绍

在日常的问题排查过程中,Linux内存相关的问题也非常多,OOM、内存泄漏 都是比较头疼的而且非常常见一些问题。如下图,我们都知道Linux 内存将内存做了以下划分(如: Node、Zone、Page),这里我们先简单看一些内存相关的名词解释。
在这里插入图片描述

1. Node

什么是Node?我们先看下多路CPU是怎么工作的,如图所示是两个物理CPU,我们现在的服务器通常都会有多路CPU在一个主板上,不同的内存器件和CPU核心从属于不同的Node,每个Node都有自己的集成内存控制器。
而在Node内部,其架构类似于UMA,几个核心共享该Node的内存,并且通过IMC Bus进行不同核心之间的通信;不同Node之间则通过QPI(Quick Path Interconnect——又名CSI,Common System Interface公共系统接口,是一种可以实现芯片间直接互联的架构)进行通信。
在这里插入图片描述
Linux内核把物理内存按照CPU节点划分为不同的node, 每个node作为某个cpu结点的本地内存, 而作为其他CPU节点的远程内存, 而UMA结构下, 则任务系统中只存在一个内存node, 这样对于UMA结构来说, 内核把内存当成只有一个内存node节点的伪NUMA。
如何查看主机有多少个Node,执行numactl --hardware,我们可以看到node的情况,当前测试机只有一个node,node0 中包含0-3 总共四个核。
在这里插入图片描述

2. Zone

什么是Zone呢?其实划分Zone来管理内存也是有一定历史原因的,由于地址数据线位宽的限制,32位处理器通常最多支持4GB(未开启LPAE特性)。在4GB的地址空间中,通常内核空间只有1GB大小,因此对于大小为4GB的物理内存是无法进行一一线性映射的。Linux内核的做法就是将物理内存分成两部分,其中一部分是线性映射的。对应就是ZONE_NORMAL。剩余部分叫做高阶内存(high memory), 对应ZONE_HIGHMEM。
内存管理区的分布和架构也有关系,x86架构中,ISA设备只能访问物理内存的前16MB,所以在x86架构中会多一个ZONE_DMA的zone。在x86_64中,由于有足够大的内核空间可以线性映射物理内存,则不需要有ZONE_HIGHMEM这个zone。
常见的几个ZONE:

  1. ZONE_DMA:用于ISA设备的DMA操作,范围是0-16MB,只适用于Intel x86架构。
  2. ZONE_DMA32:用于地域4GB的内存访问的设备,如只支持32位的DMA设备。
  3. ZONE_NORMAL:4GB以后的物理内存,用于线性映射物理内存。如果内存小于4GB,则没有这个ZONE。实测低于等于4GB的时候 这个zone是有少量内存的。
  4. ZONE_HIGHMEM:用于管理高端内存。64位的系统中没有这个zone。

3. Page

虽然内存访问的最小单位是byte或者word,但MMU是以page为单位来查找页表的,page也就成了Linux中内存管理的重要单位。包括换出(swap out)、回收(relcaim)、映射等操作,都是以page为粒度的。
所以在前面提到的zone的概念中,我们可以进一步看到每个zone里面的page情况,执行 cat /proc/pagetypeinfo
这里就记录了每个Zone的page的情况,如红字对应的,从左往右依次是4kB 8kB…的page。
在这里插入图片描述

4. 内存分配

在内核中,内存的分配方式也有很多种,这里我们也简单介绍几个常用的方式,对于后面内存泄漏相关的问题的理解有一定帮助。

4.1 vmalloc

vmalloc是一个接口函数, 内核代码使用它来分配在虚拟内存中连续但在物理内存中不一定连续的内存。比如在模块加载时,由于内核模块数据一般比较多,linux系统中往往无法为其提供如此大块的连续内存块,就可以用vmalloc函数为其分配物理地址不连续的内存块。

4.2 slab

前面我们提到 Linux内存以页为单位进行内存管理,但是页的粒度还是太大,Linux下是4KB大小,也就是4096个字节,而kernel本身有很多数据结构时时刻刻都需要分配或者释放,这些数据的大小又往往小于4KB大小,一般只有几个几十个字节这样的大小。所以会造成内存的浪费。SLAB是一种分配器,目的就是用来解决上述问题的。
依托伙伴系统,slab 分配器则提供了小内存的分配能力(虽然也兼容大内存分配)。slab分配器从伙伴系统"批发"大内存,然后把大内存分隔成许多小块内存,一个小块内存块我们称为object, 最后把object "零售"给其他内核组件使用。主要API有kmalloc/kmem_cache_alloc。

4.3 allocpages

alloc_pages是内核中常用的分配物理内存页面的函数, 函数定义在[include/linux/gfp.h], 用于分配2^order 个连续的物理页。
需要注意的是,这部分是直接从伙伴系统申请内存,不像page fault这种申请内存,很多审计计数都是没有的,这也会导致一个问题,我们的/proc/meminfo是统计不到这部分内存的,也就会导致我们常用的free、top这种命令无法统计到这部分内存。
在这里插入图片描述

4.4 others

其他的内存就比如PageTable、Reserve、KernelStack。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/584838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「中标喜报」合众致达中标深圳安居乐寓智能水电表供货及安装项目

2024年4月25日,深圳合众致达科技有限公司(以下简称“我司”)成功中标安居乐寓2023盐田区保障性租赁住房改造提升项目的水电表供货与安装工程(二次)项目,此次中标标志着我司在城中村公寓出租房能源计费领域的专业实力及市场竞争力得到了进一步的认可。 我…

手搓数组栈(C语言)

stack.h #pragma once#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <stdbool.h> // 支持动态增长的栈 typedef int STDataType; typedef struct Stack {STDataType* a;int top; // 栈顶int capacity; // 容量 }Stack; //…

我们自己的芯片指令集架构——龙芯架构简介

CPU指令集架构&#xff08;ISA, Instruction Set Architecture&#xff09; CPU指令集架构是处理器硬件与软件之间的接口规范&#xff0c;它定义了一组基本指令&#xff0c;以及这些指令的操作格式、编码方式、寻址模式、寄存器组织、中断机制、异常处理等各个方面。ISA是计算…

MySQL中的并发控制,读写锁,和锁的粒度

MySQL中的并发控制&#xff0c;读写锁&#xff0c;和锁的粒度 并发控制的概述 在数据库系统中&#xff0c;并发控制是一种用于确保当多个用户同时访问数据库时&#xff0c;系统能够提供数据的一致性和隔离性的机制。MySQL支持多种并发控制技术&#xff0c;其中包括锁机制、多…

Unity镂空图像做法

问题和解决方案 现在要完成一个需求&#xff0c;即镂空中间部分的image&#xff0c;外围image可以定义颜色并可选屏蔽点击&#xff0c;而中间的image需要透明且可以穿透&#xff0c;必须不能屏蔽点击。 由此拆分成了两个问题&#xff1a; 1.定义外围image颜色&#xff0c;内…

力扣数据库题库学习(4.25日)

1484. 按日期分组销售产品 问题链接 思路与分析 编写解决方案找出每个日期、销售的不同产品的数量及其名称。 每个日期的销售产品名称应按词典序排列。 返回按 sell_date 排序的结果表。我来分析一下&#xff0c;这里的题目要求其实就是统计不同日期下的销售产品数&#xf…

什么是域名解析?域名解析的完整流程是什么?如何清理DNS缓存?(附源码)

目录 1、什么是域名&#xff1f; 2、为什么使用域名&#xff1f; 3、域名解析的完整流程 4、调用gethostbyname系统接口将域名解析成IP地址 5、为什么需要清理系统DNS缓存&#xff1f; 6、使用cmd命令清理DNS缓存 7、通过代码去清除系统DNS缓存 C软件异常排查从入门到精…

Ubuntu 24.04 LTS (Noble Numbat) 正式版发布

Ubuntu 24.04 LTS (Noble Numbat) 正式版发布 Canonical 的第 10 个长期支持版本在性能工程、企业安全和开发人员体验方面树立了新标准 请访问原文链接&#xff1a;Ubuntu 24.04 LTS (Noble Numbat) 正式版发布&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。…

Pytest切换测试环境:使用hooks函数、pytest-base-url插件

Pytest切换测试环境&#xff1a;使用hooks函数、pytest-base-url插件 1.使用hooks函数2.使用pytest-base-url插件安装pytest-base-url使用 1.使用hooks函数 # conftest.py#Initialization hooks 初始化钩子: 添加自定义命令行选项 def pytest_addoption(parser):parser.addopt…

一、OSPF基础

目录 1.路由协议的优先级 2.转发原则&#xff1a;最长匹配原则 3.负载分担 4.路由备份&#xff08;浮动路由&#xff09; 5.路由协议的分类 6.动态路由 7.距离矢量路由协议&#xff08;BGP&#xff0c;RIP&#xff09; 8.链路状态路由协议&#xff08;OSPF&#xff0c;I…

Vue3框架

Vue3框架 一.使用create-vue搭建Vue3项目二.组合式API - setup选项1.setup选项的写法和执行时机2.setup中写代码的特点3. script setup 语法糖 三.组合式API - reactive和ref函数1. reactive2. ref3. reactive 对比 ref 四.组合式API - computed五.组合式API - watch1. 侦听单个…

Flutter 有什么优异特性和革命性创新之处?

Flutter 有什么优异特性和革命性创新之处? 什么是 Flutter&#xff1f; Flutter mobile app SDK是一种新的方式来构建漂亮的原生移动应用程序&#xff0c;摆脱过去常见的“千篇一律”的应用程序。用过Flutter的人都对它赞赏有加&#xff1b; 相比较其他新型系统&#xff0c…

制作场景资源的Prefab

制作骨骼模型的Prefab 现在游戏内的使用骨骼模型是通过老版的Animator去实现控制的&#xff0c;所以需要将模型切换为Animator 第一步&#xff0c;动画类型设置为Generic&#xff0c;创建Avatar 模型里面会有对应的Avatar文件 我们还需要一个Controller文件&#xff0c;用于…

VMware虚拟机下载安装教程【超详细】

推荐大佬文章&#xff1a;VMware下载安装教程(超详细)-CSDN博客 目录 一、VMware下载 二、VMware安装 一、VMware下载 1、进入VMware官网 2、点击“Products”&#xff0c;向下滑动 --> 选择“Workstation Pro” 3、向下滑动&#xff0c;找到并选择“Download VMware Wo…

numpy+matplotlib绘制玫瑰线图案

【第10次课]实验十一数据可视化及应用】 声明&#xff1a;著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 1.简答题 本实验绘制简单图形&#xff0c;要导入numpy库函数和matplotlib.pyplot子库函数: import matplotlib.pyplot as plt impor…

【介绍下Android开发环境的搭建】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

源码编译framework.jar 并成功导入android studio 开发

一、不同安卓版本对应路径 Android N/O: 7 和 8 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar Android P/Q: 9 和 10 out/soong/.intermediates/frameworks/base/framework/android_common/combined/framework.jar Android R: 11以上 out/so…

计算机考研到双非院校的性价比分析

我选择读研为自己过渡深造&#xff0c;本科期间没有做过项目和实验&#xff0c;读研期间好好搞 很多公司更加看中的是个人硬实力...双非研究生出去找工作机会也并不少&#xff0c;只要实力够&#xff0c;学历加成一下&#xff0c;机会还是非常多的 研究生的学历算是一个门槛&…

Python数据预处理1:导入与基本操作

2024/4/30 After installing the xlrd package, you should be able to read Excel files using pandas without any issues. #需要在pyCharm命令行中下载两个包 pip install pandas pip install xlrd .xls数据导入 #数据的导入 import pandas as pd #导入EXCEL表格数据 df…

前端工程化Vue使用Node.js永久设置国内高速npm镜像源

前端工程化Vue使用Node.js永久设置国内高速npm镜像源 接续上篇错误收录&#xff0c;此篇通过简单配置永久设置国内高速npm镜像源方法 1.更换新版镜像 清空npm缓存 npm cache clean --force修改回原版镜像源或直接删除配置过的镜像源 npm config set registry https://registr…