Linux之HugePage的原理与使用

news2024/10/23 23:30:07

Linux之HugePage的原理与使用

    • 虚拟地址与物理地址
      • 虚拟地址
      • 物理地址
      • 虚拟地址与物理地址的转换
    • HugePage的概念
    • Linux使用HugePage
      • 创建HugePage
      • 在程序中使用HugePage
    • 总结

虚拟地址与物理地址

在研究HugePage之前,首先需要明白虚拟地址和物理地址的概念。在计算机系统中,虚拟地址和物理地址是两个重要的概念。

虚拟地址

虚拟地址是由操作系统为每个进程分配的地址空间。每个进程都认为自己拥有独立的、连续的地址空间,从地址零开始。

  • 提供了一种内存保护机制。不同的进程有各自独立的虚拟地址空间,一个进程不能直接访问另一个进程的内存,从而防止了进程之间的非法访问和干扰。
  • 实现了多任务环境下的内存管理。操作系统可以在物理内存不足时,将部分暂时不用的页面存储到磁盘上,当需要时再重新加载到内存中,使得多个进程可以在有限的物理内存下同时运行。
  • 方便程序的编写和移植。程序员可以在不考虑实际物理内存布局的情况下进行编程,提高了开发效率。而且,由于虚拟地址空间的独立性,程序可以在不同的硬件平台上更容易地进行移植。

物理地址

物理地址是计算机内存中实际的存储单元地址。

  • 物理地址直接对应着内存中的实际存储位置,是数据真正存储的地方。
  • 硬件设备(如 CPU、内存控制器等)通过物理地址来访问内存中的数据。

虚拟地址与物理地址的转换

为了让进程能够正确地访问内存中的数据,操作系统需要将虚拟地址转换为物理地址。这个转换过程通常由硬件(如内存管理单元 MMU)和操作系统共同完成,并且需要MTT(内存转换表,Memory Translate Table)以及MPT(内存保护表,Memory Protect Table)。

  1. 当进程访问一个虚拟地址时,MMU 会根据页表等数据结构将虚拟地址转换为物理地址。
  2. 如果转换过程中发现所需的页面不在物理内存中,操作系统会触发页面错误,然后将所需的页面从磁盘加载到物理内存中,并更新页表,再次进行地址转换。

总之,虚拟地址和物理地址在计算机系统中起着不同的作用,虚拟地址为进程提供了独立的地址空间和内存保护,而物理地址则是实际存储数据的位置。通过虚拟地址到物理地址的转换,操作系统实现了高效的内存管理和多任务环境下的程序运行。
例如下图的转换所示:
在这里插入图片描述

HugePage的概念

Linux 会以页为单位管理内存,而默认的页面大小为 4KB,虽然部分处理器会使用 8KB、16KB 或者 64KB 作为默认的页面大小,不过 4KB 仍然是操作系统的默认页面配置的主流。这样一来,一个程序可能会使用很多的内存页面,而每个页面都需要相应的MTT(Memory Translate Table)和MPT(Memory Protect Table)来进行虚拟地址(VA)到物理地址(PA)的转换,当一个程序需要大量的内存时,由于每个页面都很小,就需要很多的MTT和MPT,从而会增加系统的开销,影响程序的性能。
为此,Linux中应用了大页(HugePage)的概念,也就是使用比较大的内存页面,2MB 一般都是 HugePages 的默认大小,在 arm64 和 x86_64 的架构上甚至支持 1GB 的大页面,是 Linux 默认页面大小的 262144 倍。这样,当一个应用程序需要大量的内存时,就可以只是使用非常少的内存页面就能够满足程序的需求,可以大大降低所需要的MTT和MPT,提升性能。
在这里插入图片描述
可以通过如下所示的命令查看有关HugePage的信息:

cat /proc/meminfo | grep Huge

例如如下的结果:
在这里插入图片描述
上图的结果表示,HugePage的大小为2048KB也就是2MB,现有的HugePage有两个,并且它们都没有被使用。

Linux使用HugePage

创建HugePage

首先需要在linux系统中创建HugePage,然后才可以去使用,创建并加载HugePage的命令如下所示,这里使用的时默认的大页(HugePage)大小,2MB:

  • 创建一定数量的HugePage
sudo sysctl -w vm.nr_hugepages=<HugePage 数量>
  • 挂载 HugePages 文件系统
sudo mkdir /mnt/huge
sudo mount -t hugetlbfs none /mnt/huge
  • 检查 HugePages 是否被正确使用
cat /proc/meminfo | grep Huge

也可以使用如下所示的命令查看已经挂载了的HugePage:

mount | grep hugetlbfs

其运行结果为:
在这里插入图片描述
可以看出,我创建并且挂载了两个大页。

在程序中使用HugePage

在linux中一般使用 mmap 或 shmget 来分配和使用大页需要在程序中明确地调用这些函数,并指定所需的标志和内存大小。
例如下面的示例代码,我们使用了等待用户输入字符这种方法,或者死循环的方法也可以,以便于使得程序运行很长的时间,从而我们就可以通过命令行来检验程序是否使用了大页:

hp.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main() {
    size_t hugepage_size = 2 * 1024 * 1024;  // 大页大小,2MB
    int fd = open("/mnt/huge/none", O_CREAT | O_RDWR, 0755);  // 打开大页文件系统路径

    if (fd < 0) {
        perror("Failed to open hugetlbfs");
        return 1;
    }

    // 使用 mmap 分配大页
    void *addr = mmap(NULL, hugepage_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS | MAP_HUGETLB, fd, 0);
    
    if (addr == MAP_FAILED) {
        perror("mmap failed");
        return 1;
    }

    // 向大页写入数据
    strcpy((char *)addr, "Hello, Huge Page!");
    printf("Huge page allocated at: %p\n", addr);
    printf("Data in huge page: %s\n", (char *)addr);  // 读取并打印数据

    // 程序运行,等待输入以退出
    printf("Press Enter to exit...");
    getchar();

    // 使用完毕后,记得释放内存
    munmap(addr, hugepage_size);
    close(fd);

    return 0;
}

对代码进行编译:

gcc -o hpt hp.c

运行程序:

sudo ./hpt

在这里插入图片描述

为了验证我们的程序是否使用了指定的大页,我们首先查看程序的进程:

ps aux | grep hpt

命令行运行之后的结果为:
在这里插入图片描述
这里需要注意,真正使用了大页的是中间那行所表示的进程号,这是由于第一行的进程号是原始的c程序的进程,在其中我们开启了一个调用大页,所以会重新开启一个进程,最后那一行的进程可以不用管,与我们的大页示例程序无关,如果非要去深究一下,那么,它实际上表示的是对应的那个大页分配给了我们的这个程序。

这里记录一下程序运行的pid,我的就是169136,后续在使用的时候需要替换为你自己的pid。

然后我们再次运行下面的命令:

cat /proc/meminfo | grep Huge

结果为:
在这里插入图片描述
可以看出来,空闲的HugePage只有一个,实际上非空闲的那个HugePage正在被我们的程序使用。

在前面我们已经得到了程序的pid,现在就使用这个pid直接去查看程序所使用的页面,命令行如下所示:

sudo cat /proc/<pid>/smaps | grep -i Private_Hugetlb

例如我的命令就是:

sudo cat /proc/169136/smaps | grep -i Private_Hugetlb

得到的结果为:
在这里插入图片描述
可以看出,的确使用了一个大小为2048KB也就是2MB的大页HugePage。

至此,我们成功使用了大页并对其进行了验证,可以关闭之前的那个程序了。

总结

本文介绍了虚拟地址、物理地址、地址转换、大页(HugePage)等概念,并在linux中创建大页,然后还使用c语言编写程序真实地使用了HugePage并且对其使用情况进行了检验和分析。希望本文对大家有所帮助和启发。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

baby_web-CTFWeb进阶wp-攻防世界14

baby_web-CTFWeb进阶wp-攻防世界14 页面显示1.php&#xff0c;可以先访问下源码和index.php&#xff0c;发现内容一致&#xff0c;再查看下cookie和header&#xff0c;看一下有没有藏flag&#xff0c;发现没。 dirsearch一下&#xff0c;发现访问index.php会重定向到1.php。抓…

想一键获取视频文案?2024年这3款好用的视频转文字工具来帮忙

嘿&#xff0c;咱们现在活在21世纪&#xff0c;这信息多得跟啥似的。视频这东西&#xff0c;不管是学东西、娱乐还是工作&#xff0c;都挺受欢迎的&#xff0c;因为它直观、生动嘛。但是&#xff0c;有时候咱们想从视频里提取点有用的信息&#xff0c;还挺费劲的。幸好啊&#…

深圳大学-Java程序设计-选实验2 类的初级应用

实验目的与要求&#xff1a; 实验目的&#xff1a;初步掌握面向对象编程中类的编写。 实验要求&#xff1a; (1).运行第4章课件中第4页、第24页、第32页和第34页中的四个程序&#xff0c;并对每一行语句加上注释。对每一行语句加上注释。在报告中附上程序截图、运行结果截图和…

zerotier安装配置

目录 1.简介1.1.基本概念1.1.1.节点1.它可以是:2.每个节点都有以下特征:3.节点的主要功能包括: 1.1.2.根服务器1.定义&#xff1a;2.功能&#xff1a;3.特点&#xff1a;4.角色&#xff1a;5.安全性&#xff1a;6.与普通节点的区别&#xff1a;7.自托管选项&#xff1a; 1.1.3.…

51单片机的智能电饭煲【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器继电器按键、LED等模块构成。适用于智能电饭锅等相似项目。 可实现功能: 1、LCD1602实时显示温度、运行模式、煮饭等模式的计时时间 2、首先选择电饭锅的模式&#xff0c;如煮饭、煮粥、蒸、煲汤&#…

React入门 9:React Router

1. 什么是路由 路由&#xff08;routing&#xff09;就是通过互联的网络把信息从源地址传输到目的地址的活动。 以上是中文维基百科对路由的解释。通俗的来讲&#xff0c;把一个地方的信息传输到他想去的目的地的过程&#xff0c;就叫路由。 2. 用代码解释路由 需求&#xff1a…

【Spring】获取Cookie和Session(@CookieValue()和@SessionAttribute())

获取 Cookie 传统获取 Cookie 这是没有 Spring 的时候&#xff0c;用 Servlet 来获取&#xff08;获取所有的 Cookie&#xff09; Spring MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;也是在 Servlet 的基础上实现的 RequestMapping("/getcookie") …

CubeMX电机驱动以及编码器计数配置

一、选型 电机MG310&#xff1a; 电机驱动板TB6612&#xff1a; STM32F407VETx&#xff1a; 二、CubeMX配置 配置外部时钟&#xff1a; GPIO口配置&#xff1a; 需要四个I/O输出口&#xff1a; PWM口配置&#xff1a; 这里使用的是定时器TIM1&#xff0c;设置预分频器71&…

使用mnist数据集和LeakyReLU高级激活函数训练神经网络示例代码

一、概述 神经网络中的激活函数是用于增加网络的非线性特性的函数&#xff0c;没有激活函数&#xff0c;神经网络将仅仅是一个线性模型&#xff0c;无法解决复杂的非线性问题。激活函数的选择对神经网络的性能有很大的影响。 基础激活函数是神经网络中使用较早、较为简单的激…

AOA定位技术在智慧停车场中的应用

‌AOA定位技术是一种基于信号到达角度的定位方法&#xff0c;通过测量无线信号到达接收器的入射角度来实现精确定位。‌ AOA定位技术的核心原理是利用接收器内的多个天线阵列来测量信号的相位差&#xff0c;从而计算出信号的到达角度&#xff0c;最终确定位置‌。 在智慧停…

SpringBoot在高校学科竞赛平台中的应用与优化

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

数据结构之旅(顺序表)

前言: Hello,各位小伙伴们我们在过去的60天里学完了C语言基本语法,由于小编在准备数学竞赛,最近没有给大家更新,并且没有及时回复大家的私信,小编在这里和大家说一声对不起!,小编这几天会及时给大家更新初阶数据结构的内容,然后我们来学习今天的内容吧! 一. 顺序表的概念和结…

鸿蒙开发案例:通过三杯猜球学习显示动画

【引言】 “三杯猜球”是一个经典的益智游戏&#xff0c;通常由一名表演者和多名参与者共同完成。表演者会将一个小球放在一个杯子下面&#xff0c;然后将三个杯子快速地交换位置&#xff0c;参与者则需要猜出最终哪个杯子下面有小球。本文将介绍如何使用HarmonyOS NEXT技术&a…

加速AI+医疗普惠:AI如何让乳腺癌筛查走进大山?

人工智能与超声技术的结合正在医疗领域引发一场新变革。 近日&#xff0c;贵州省铜仁市石阡县妇幼保健院与广州尚医网信息技术有限公司&#xff08;以下简称“尚医云”&#xff09;联合组织了一场“AI点亮女性健康未来”免费乳腺癌筛查活动&#xff0c;目前已为当地1,500名适龄…

物联网:一种有能力重塑世界的技术

物联网&#xff08;IoT&#xff09;近年来对我们的日常生活产生了如此积极的影响&#xff0c;以至于即使是不懂技术的人也开始相信它所带来的便利以及敏锐的洞察力。 物联网是一场数字技术革命&#xff0c;其意义甚至比工业革命更为重大。物联网是仍处于起步阶段的第四次工业革…

重学SpringBoot3-安装Spring Boot CLI

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-安装Spring Boot CLI 1. 什么是 Spring Boot CLI&#xff1f;2. Spring Boot CLI 的安装2.1. 通过 SDKMAN! 安装2.2. 通过 Homebrew 安装&#xff08;适…

React Query 和 React Context

React Query最佳特性之一是你可以在组件树中的任何位置使用查询&#xff1a;你的 <ProductTable> 组件可以在其需要的地方自带数据获取&#xff1a; function ProductTable() {const productQuery useProductQuery()if (productQuery.data) {return <table>...<…

AI跟踪报道第60期-新加坡内哥谈技术-本周AI新闻: Tesla展示Robotaxi和AI在企业级运用的推进

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

前端开发笔记-- 黑马程序员4

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 css 三角写法用户界面鼠标样式取消表单轮廓vertical-align文本溢出 html5 新标签多媒体标签视频标签![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d85d…

Linux升级openssl版本

Linux升级openssl版本 服务器编译依赖库检查 # yum -y install gcc gcc-c make libtool zlib zlib-devel版本检测 # openssl version OpenSSL 1.0.1e-fips 11 Feb 2013 # ssh -V OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013下载openssl 地址&#xff1a;https://www.o…