C++中的内存锁定

      内存锁定(memory locking)是确保进程保留在主内存中并且免于分页的一种方法。在实时环境中,系统必须能够保证将进程锁定在内存中,以减少数据访问、指令获取、进程之间的缓冲区传递等的延迟。锁定内存中进程的地址空间有助于确保应用程序的响应时间满足实时要求。作为一般规则,时间关键的进程(time-critical process)应该被锁定到内存中。
      虚拟地址空间(virtual address space)被划分为固定大小的单元(fixed-sized unit),称为页(page)。每个进程通常占用多个页,这些页在进程执行时独立地移入和移出主内存。通常,当进程执行时,进程页的子集驻留在主内存(primary memory)中。
      由于可用的主内存量是有限的,因此分页通常会牺牲一些页即要移入页,必须移出其他页。如果要替换的页在执行期间被修改,则该页将被写入文件区域。该页根据需要被带回主内存,并且在内核检索该页时延迟执行。
      分页通常对当前进程是透明的通过增加物理内存的大小或将页锁定到内存中可以减少分页量。但是,如果进程非常大或者页频繁调入和调出,则调页所需的系统开销可能会降低效率。
      对于实时应用程序来说,拥有足够的内存比非实时应用程序更重要。实时应用程序必须确保进程被锁定到内存中,并且有足够的内存可供实时进程和系统使用。对于关键的实时任务来说,由于分页引起的延迟通常是不可接受的。
      内存锁定适用于进程的地址空间。只有映射到进程地址空间的页才能被锁定到内存中。当进程退出时,页将从地址空间中删除,并且锁也被删除。
      内存锁定有两个主要应用:实时算法和高安全性数据处理。
      页锁定内存无法从RAM移动到交换文件,确保该内存始终驻留在物理内存中。与传统内存相比,它提高了GPU的PCI-Express(CPU和GPU之间的总线) I/O速度。
      NVIDIA的GPU是一个协处理器(co-processor),GPU内核启动、数据初始化和传输均由CPU进行.
      CUDA中有四种类型的内存分配
      1.Pageable memory(可分页内存):主机中分配的内存默认是可分页内存。该内存位置的数据可供主机使用。为了将此数据传输到设备,CUDA运行时会将此内存拷贝到临时固定内存,然后传输到设备内存。因此,存在两次内存传输。因此,这种类型的内存分配和传输速度很慢。GPU无法直接从可分页主机内存访问数据。涉及的函数:malloc, cudaMalloc, cudaMemcpy
      2.Pinned memory(固定内存):也称为页锁定,数据可以直接在主机固定存储器中初始化。与malloc分配的常规可分页主机内存相反。通过这样做,我们可以避免像可分页内存中那样的两次数据传输。这将使该过程更快,但会牺牲主机性能。当数据在固定存储器中初始化时,主机处理的存储器可用性会降低。涉及的函数:cudaMallocHost, cudaMalloc, cudaMemcpy
      优点:
      (1).对于某些设备,页锁定主机内存和设备内存之间的拷贝可以与内核执行同时执行。
      (2).在某些设备上,页锁定主机内存可以映射到设备的地址空间,从而无需将其拷贝到设备内存或从设备内存中拷贝。
      (3).在具有前端总线(front-side bus)的系统上,如果主机内存被分配为页锁定,则主机内存和设备内存之间的带宽(bandwidth)会更高。
      注:页锁定主机内存不会缓存在非I/O一致Tegra设备上。此外,非I/O一致Tegra设备不支持cudaHostRegister。
      3.Mapped memory(映射内存)或Zero copy memory(零拷贝内存):零拷贝内存是映射到设备地址空间的固定内存。主机和设备都可以直接访问该内存。涉及的函数:cudaHostAlloc, cudaHostGetDevicePointer
      优点:
      (1).当设备内存不足时,可以利用主机内存。
      (2).可以避免主机和设备之间显式的数据传输。
      (3).提高PCI-Express传输速率。
      缺点:由于它被映射到设备地址空间,因此数据不会被拷贝到设备内存中。传输将在执行期间发生,这将大大增加处理时间。
      4.Unified memory(统一内存):这将创建一个托管内存池,其中来自该内存池的每个分配都可以在主机和设备上使用相同的地址或指针进行访问。底层系统将数据迁移到主机和设备。涉及的函数:cudaMallocManaged
      优点:无需为所需的设备显式分配和恢复内存。这降低了编程复杂性。
      缺点:在内存管理方面添加了额外的指令.
      RAM(Random Access Memory):随机存取存储器,是一种计算机存储器,它用于临时存储数据和指令,以便在计算机运行时快速访问。RAM可以随时读取和写入数据,而且读取和写入的速度非常快。相比之下,硬盘、闪存等存储设备的数据访问速度要慢得多。RAM通常用于计算机的主存(内存),以便CPU可以快速访问指令和数据。它也用于缓存和其他高速存储设备,以加快数据访问速度。
      linux下的用于内存锁定的函数mlock/mlockall, munlock/munlockall声明如下:

int mlock(const void *addr, size_t len);
int munlock(const void *addr, size_t len);
int mlockall(int flags);
int munlockall(void);

      mlock:锁定从addr开始并持续len字节的地址范围内的页。当调用成功返回时,所有包含指定地址范围的页都保证驻留在RAM中,直到稍后解锁。
      munlock:解锁从addr开始并持续len字节的地址范围内的页。在此调用之后,包含指定内存范围的所有页都可以由内核再次移动到外部交换空间。
      mlockall:锁定映射到调用进程的地址空间的所有页。This includes the pages of the code, data and stack segment, as well as shared libraries, user space kernel data, shared memory, and memory-mapped files. 当调用成功返回时,所有映射的页都保证驻留在RAM中,直到稍后解锁。
      munlockall:解锁映射到调用进程地址空间的所有页.
      mlock和mlockall函数分别将调用进程的部分或全部虚拟地址空间(virtual address space)锁定到RAM中,防止该内存被分页到交换区域(preventing that memory from being paged to the swap area)。munlock和munlockall执行相反的操作,分别解锁调用进程的部分或全部虚拟地址空间,以便在内核内存管理器(kernel memory manager)需要时可以再次交换指定虚拟地址范围内的分页。
      内存锁定和解锁以整页(whole page)为单位进行
      这些函数调用成功时返回0;失败时返回-1,设置errno来指出错误。
      注意
      1.内存锁定不会被通过fork创建的子进程继承(注:现代的Unix系统可能并非这样)。
      2.如果通过munmap取消映射,则会自动删除地址范围(address range)上的内存锁定。
      3.如果锁定了非常多的内存,有些程序可能会因为缺少内存(real memory)而根本无法运行,或者导致系统运行速度更慢。
      4.内存锁定不堆叠(memory locks do not stack),不能两次锁定特定页。
      5.内存锁定持续存在,直到进程退出或应用程序调用相应的munlock或munlockall函数解锁它为止。
      以上内存主要整理自:

      1.https://man7.org/linux/man-pages/man2/mlock.2.html
      2.https://medium.com/analytics-vidhya/cuda-memory-model-823f02cef0bf
      3.https://www3.physnet.uni-hamburg.de/physnet/Tru64-Unix/HTML/APS33DTE/DOCU_005.HTM
      4.https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#page-locked-host-memory

      在Windows上可使用VirtualAlloc、VirtualLock、VirtualUnlock、VirtualFree函数进行内存锁定。

     以下为测试代码:

int test_memory_locking()
{constexpr size_t size{ 1024 };
#ifdef _MSC_VER// 1. allocate memoryauto p = VirtualAlloc(nullptr, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);if (p == nullptr) {std::cerr << "Error: VirtualAlloc: " << GetLastError() << "\n";return -1;}// 2. lock memory pageif (!VirtualLock(p, size)) {std::cerr << "Error: VirtualLock: " << GetLastError() << "\n";return -1;}// 3. use lock memory// 4. unlock memory pageif (!VirtualUnlock(p, size)) {std::cerr << "Error: VirtualUnlock: " << GetLastError() << "\n";return -1;}// 5. free memoryif (!VirtualFree(p, 0, MEM_RELEASE)) {std::cerr << "Error: VirtualFree: " << GetLastError() << "\n";return -1;}
#elsechar data[size];// 1. get configuration information at run timeauto page_size = sysconf(_SC_PAGE_SIZE);if (page_size == -1) {std::cerr << "Error: sysconf: " << strerror(errno) << "\n";return -1;}std::cout << "page size: " << page_size << "\n";// 2. lock memory pageif (mlock(data, size) == -1) {std::cerr << "Error: mlock: " << strerror(errno) << "\n";return -1;}// 3. use lock memory// 4. unlock memory pageif (munlock(data, size) == -1) {std::cerr << "Error: munlock: " << strerror(errno) << "\n";return -1;}
#endifreturn 0;
}

      执行结果如下图所示:

      GitHub:https://github.com/fengbingchun/Messy_Test

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

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

相关文章

OCP NVME SSD规范解读-1

OCP&#xff08;Open Compute Project&#xff09;是一个由Facebook于2011年发起的开源项目。其目标是重新设计和优化数据中心的硬件&#xff0c;包括服务器、存储、网络设备等&#xff0c;以提高效率&#xff0c;降低运营成本&#xff0c;并推动技术的创新和标准化。 在OCP中&…

C++ Qt开发:Charts绘制各类图表详解

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍TreeWidget与QCharts的常用方法及灵活运用。 …

部署谷歌的Gemini大模型

前言 本文将介绍如何使用Docker、Docker-Compose私有化部署谷歌的Gemini大模型&#xff0c;以及没有服务器的情况下如何使用Vercel来部署。 Demo: 使用新加坡云服务器部署&#xff1a;Gemini Pro Chat (snowice.eu.org) 使用Vercel部署&#xff1a;Gemini Pro Chat (snowice.eu…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-5比例积分控制器Proportional-Intefral Controller

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-5比例积分控制器Proportional-Intefral Controller 消除稳态误差——设计新的控制器

AspectJ入门(一)

AspectJ是一个面向切面的框架&#xff0c;扩展了Java语言。有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。Spring的AOP底层也是用了这个框架。 AOP可以拦截指定的方法并对方法增强&#xff0c;而且无需侵入到业务代码中&#xff0c;使业务与非业务处理逻辑分离…

机器学习之实验过程01

import pandas as pd import numpy as np import matplotlib.pyplot as plt data_path /home/py/Work/labs/data/SD.csv # 请确保您的数据文件路径是正确的 df pd.read_csv(data_path) df.head() # 创建散点图 # 创建散点图 plt.figure(figsize(10, 6)) plt.scatter…

MySQL 数据库系列课程 05:MySQL命令行工具的配置

一、Windows启动命令行工具 &#xff08;1&#xff09;打开 Windows 的开始菜单&#xff0c;找到安装好的 MySQL&#xff0c;点击MySQL 8.0 Command Line Client - Unicode&#xff0c;这个带有 Unicode 的&#xff0c;是支持中文的&#xff0c;允许在命令行中敲中文。 &…

三网合一建设方案

一、什么是三网融合&#xff1f; 三网合一&#xff08;即三网融合&#xff09;&#xff0c;是指电信网、广播电视网和互联网的相互渗透、互相兼容、并逐步整合成为统一的信息通信网络&#xff0c;其中互联网是核心。只需要引入三个网络中的一个&#xff0c;就能实现电视、互联…

Java架构师系统架构需求分析实战

目录 1 导语2 需求分析实战3 核心方法论-架构立方体4 功能性模型-模块定义5 功能性模型-模块关系图6 功能性模型-模块细化 想学习架构师构建流程请跳转&#xff1a;Java架构师系统架构设计 1 导语 架构设计的实战和思维方法的讨论&#xff0c;主要聚焦于需求分析的重要性和方…

openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表172.1 分析表172.2 表自动分析

文章目录 openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表172.1 分析表172.2 表自动分析 openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表 执行计划生成器需要使用表的统计信息&#xff0c;以生成最有效的查询执行计划&#…

c# OpenCvSharp 检测(斑点检测、边缘检测、轮廓检测)(五)

在C#中使用OpenCV进行图像处理时&#xff0c;可以使用不同的算法和函数来实现斑点检测、边缘检测和轮廓检测。 斑点检测边缘检测轮廓检测 一、斑点检测&#xff08;Blob&#xff09; 斑点检测是指在图像中找到明亮或暗的小区域&#xff08;通常表示为斑点&#xff09;&#…

电子科大软件系统架构设计——设计模式

设计模式概述 设计模式的背景 设计面向对象软件比较困难&#xff0c;而设计可以复用的面向对象软件更加困难不是解决任何问题都需要从头做起&#xff0c;最好能复用以往的设计方案经验面向对象软件设计经验需要有一定的模式记录下来&#xff0c;以提供给其他设计者使用&#…

搭建Nginx文件下载站点

一、下载Nginx 首先&#xff0c;确保你的服务器上已经安装了Nginx&#xff0c;使用编译安装&#xff0c;下载最新版Nginx。 wget https://nginx.org/download/nginx-1.25.3.tar.gz tar -xf nginx-1.25.3.tar.gz二、安装Fancyindex和Nginx-Fancyindex-Theme模块 # 下载Fancyin…

如何使用 YOLOv8 做对象检测

介绍 对象检测是一项计算机视觉任务&#xff0c;涉及识别和定位图像或视频中的对象。它是许多应用的重要组成部分&#xff0c;例如自动驾驶汽车、机器人和视频监控。 多年来&#xff0c;已经开发了许多方法和算法来查找图像中的对象及其位置。卷积神经网络对于此类任务有着非…

uni-app 工程目录结构介绍

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

[kubernetes]控制平面ETCD

什么是ETCD CoreOS基于Raft开发的分布式key-value存储&#xff0c;可用于服务发现、共享配置以及一致性保障&#xff08;如数据库选主、分布式锁等&#xff09;etcd像是专门为集群环境的服务发现和注册而设计&#xff0c;它提供了数据TTL失效、数据改变监视、多值、目录监听、…

MyBatis:Generator

MyBatis Generator附批量操作分页查询存储过程 Generator 介绍网址&#xff1a;Introduction to MyBatis Generator Generator &#xff0c;一个用于 MyBatis 的代码生成工具&#xff0c;可以根据数据库表结构自动生成对应的实体类、DAO 接口和 SQL 映射文件&#xff0c;提高…

智能优化算法应用:基于协作搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于协作搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于协作搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.协作搜索算法4.实验参数设定5.算法结果6.…

自媒体实战篇:剪辑软件应用与实操

剪辑软件应用与实操 剪映基础界面认识 素材面板 导入本地素材,剪映自带素材库,音频,文本等素材合集面板播放预览 预览本地素材,,剪映自带素材库以及时间线面板中的素材的实时效果时间线面板 对素材进行基础的编辑操作,调整素材轨道等素材功能面板 可对素材或者文本等精细…

智能优化算法应用:基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工蜂鸟算法4.实验参数设定5.算法结果6.…