内存映射文件

ESP32天线阵列实现Wi-Fi空间成像与无直视定位 Wi-Fi信道状态信息(CSI)是OFDM系统中表征多径传播特性的基础物理层参数,其复数值包含幅度与相位,可反映无线环境的空间特征。基于CSI的射频感知技术,通过提取子载波级信道响应,结合阵列信号处理,实现到达角(AoA)估计与深度映射,本质是将通信链路重构为空间域传感器。该技术无需专用雷达硬件,具备低成本、被动式、隐私友好等工程优势,在室内定位、行为识别、仓储导航等场景具有广泛落地价值。本文聚焦ESP32平台,详解多芯片相位同步、CSI零拷贝采集、嵌入式MUSIC算法及信道图谱轻量化部署等关键实现。 阅读详情

与虚拟内存一样,内存映射文件可以用来保留一个地址空间的区域,一旦该文件被映射,就可以访问它,就像整个文件已经加载内存一样。

  内存映射文件可以用于3个不同的目的:

   1. 系统使用内存映射文件,以便加载和执行exe 和dll文件,这可以大大节省页文件空间和应用程序启动运行所需的时间。
   2.可以使用内存映射文件来访问磁盘上的数据文件,这使你可以不必对文件执行I/O操作,并且可以不必对文件内容进行缓存。
   3.可以使用内存映射文件,使同一台计算机上运行的多个进程能够相互之间共享数据,Windows确实提供了其他一些方法,以便在进程之间进行数据通信,但是这些方法都是使用内存映射文件来实现的,这使得内存映射文件成为单个计算机上多个进程互相进行同行的最有效的方法。

一.内存映射文件的函数包括

CreateFileMapping , OpenFileMapping, MapViewOfFile, UnmapViewOfFile 和 FlushViewOfFile 。

用法如下:

1 . HANDLE CreateFileMapping(

  HANDLE                  hFile,              // 一个文件句柄

  LPSECURITY_ATTRIBUTE  lpAttributes,         // 定义内存映射文件对象是否可以被承

  DWORD                   flProtect,           // 该内存映射文件的保护类型

  DWORD                   dwMaximumSizeHigh,// 内存映射文件的长度

  DWORD                   dwMaximumSizeLow, //

  LPCTSTR                  lpName             // 内存映射文件的名字

)

hFile       指定要映射的文件的句柄,如果这是一个已经打开的文件的句柄( CreateFile 函数的返回值),那么将建立这个文件的内存映射文件,如果这个参数为 -1 ,则建立共享内存。

lpAttribute  安全属性,一般设为 NULL

flProtect    指定映射文件的保护类型,它的取值可以是 PAGE_READONLY (内存页面只读) 或 PAGE_READWRITE (内存页面可读写)。

dwMaximumSizeHigh 和 dwMaximumSizeLow 参数组合指定了一个 64 位的内存映射文件的长度。一种简单的方法是将这两个参数全部设置为 0 ,那么内存映射文件的大小将与磁盘文件大小一致。

2 . HANDLE OpenFileMapping(

      DWORD               dwDesiredAccess,    // 指定保护类型

      BOOL                  bIsInheritHandle,     // 返回的句柄是否可以被继承

      LPCSTR                lpName             // 创建对象时使用的名字

     )

如果创建的是共享内存,其他进程不能再使用 CreateFileMapping 函数去创建同名的内存映射文件对象,而要使用 OpenFileMapping 函数打开已创建好的对象。

dwDesiredAcess   指定保护类型有 FILE_MAP_WRITE 或 FILE_MAP_READ

3 . LPVOID  MapViewOfFile(

      HANDLE  hFileMappingObject,    // 前两个函数返回的内存映射文件的句柄

      DWORD  dwDesiredAcess,      // 保护类型 FILE_MAP_READ ,FILE_MAP_WRITE

      DWORD  dwFileOffsetHight,     // 从文件的那个地址开始映射

      DWORD  dwFileOffsetLow,

      SIZE_T   dwNumberOfBytesToMap // 要映射的字节数,为 0 则映射整个文件

)

4 . BOOL  UnmapViewOfFile( LPCVOID  lpBaseAddress )

当不再使用内存映射文件时,可以通过 UmmapViewOfFile 函数撤销映射并使用 CloseHandle 函数关闭内存映射文件的句柄。

5 . BOOL  FlushViewOfFile(

       LPCVOID   lpBaseAddress,  // 开始的地址

       SIZE_T     dwNumberOfBytesToFlush // 数据块的大小

  )

  如果修改了映射视图中的内存,系统会在试图撤销映射或文件映射对象被删除时自动将数据写到磁盘上,但程序也可以根据需要将视图中的数据立即写到磁盘上。

二.使用步骤

1.  使用 CreateFileMapping 创建一个内存映射文件内核对象,告诉操作系统内存映射文件需要的物理内存大小,这个步骤决定了内存映射文件的用途――究竟是为磁盘上的文件建立内存映射还是为多个进程共享数据建立共享内存。或者使用 OpenFileMapping 打开映射文件内核对象。

2.  映射文件映射对象的全部或一部分到进程的地址空间,可以认为该操作是为文件中的内容分配线型地址空间,并将线型地址和文件内容对应起来,完成该操作的函数是 MapViewOfFile 。

 

三.使用内存映射文件读文件的具体过程可以这样:

(1)        调用 CreateFile 函数打开想要映射的文件,得到文件句柄 hFile 。

(2)        调用 CreateFileMapping 函数,并传入文件句柄 hFile ,为该文件创建一个内存映射内核对象,得到内存映射文件的句柄 hMap 。

(3)        调用 MapViewOfFile 函数映射整个文件或一部分到进程的虚拟地址空间。该函数返回文件映射到内存后的起始地址。使用指向这个地址的指针就可以读取文件的内容了。

(4)        调用 UnmapViewOfFile 函数来解除文件映射。

(5)        调用 CloseHandle 函数关闭文件对象,必须传入内存映射文件句柄 hMap

(6)        调用 CloseHandle 函数关闭文件对象,必须传入文件句柄 hFile 。

 

四.进程间共享内存:

共享内存主要是通过映射机制实现的。 Windows 下进程的地址空间是相互隔离的,但在物理上却是重叠的。所谓的重叠是指同一块内存区域可能被多个进程同时使用。当调用 CreateFileMapping 创建命名的内存映射文件对象时, Windows 即在物理内存中申请了一块指定大小的内存区域,返回文件映射对象的新句柄 hMap 。为了能够访问这块区域必须调 MapViewOfiFile 函数,促使 Windows 将此内存空间映射到进程的地址空间中。当在其他进程中访问这块区域时,则必须使用 OpenFileMapping 函数来取得对象句柄 hMap ,并调用 MapViewOfFile 函数得到此内存空间的一个映射。这样一来,系统就把同一块内存区域映射到了不同进程的地址空间中,从而达到共享内存的目的。

一段实例代码:

 BOOL     bRet      =  TRUE;
    HANDLE   hMapFile 
=  NULL;
    FILEMAP
*  pFileMap  =  NULL;

    g_hFileMap 
=  ::CreateFileMapping(INVALID_HANDLE_VALUE,
        NULL, 
        PAGE_READWRITE, 
        
0 , 
        
sizeof (FILEMAP), 
        g_FileMapFlag);

    
if  (g_hFileMap  &&  ERROR_ALREADY_EXISTS  ==  ::GetLastError())
    {
        pFileMap 
=  (FILEMAP * )::MapViewOfFile(g_hFileMap, FILE_MAP_READ,  0 ,  0 ,  0 );
        
if  (pFileMap)
        {
            ATLASSERT(::IsWindow(pFileMap
-> hForegroundWnd));

            ::PostMessage(pFileMap
-> hForegroundWnd, WM_SYSCOMMAND, SC_RESTORE,  0 );
            ::SetForegroundWindow(pFileMap
-> hForegroundWnd);
            bRet 
=  FALSE;
        }

        ::UnmapViewOfFile(pFileMap);
    }

 

原文地址 http://www.zxbc.cn/html/20080524/51094.html

Caffeine:为每个元素动态设置过期时间 Caffeine利用expireAfter方法实现为每个元素动态设置过期时间 阅读详情

相关推荐

不止于修改器:用Cheat Engine(CE)的Lua脚本和D3D Hook打造你的游戏辅助界面

本文深入探讨了Cheat Engine(CE)的高级功能,包括Lua脚本自动化和D3D Hook技术,帮助用户从基础内存扫描升级到开发具有专业图形界面的游戏辅助工具。通过实战示例和优化策略,展示了如何创建高效、稳定的游戏辅助系统,并打包为独立训练器。

weixin_28700411的博客 316

操作系统 | 内存文件映射 —— 文件到内存的映射

这么做是为了减少磁盘的IO操作,为了提高性能而考虑的,程序访问一般都带有局部性,局部性原理,在这里主要是指的空间局部性,即我们访问了文件的某一段数据,那么接下去很可能还会访问接下去的一段数据,由于磁盘IO操作的速度比直接访问内存慢了好几个数量级,所以OS根据局部性原理会在一次 read()系统调用过程中预读更多的文件数据缓存在内核IO缓冲区中,当继续访问的文件数据在缓冲区中时便直接拷贝数据到进程私有空间,避免了再次的低效率磁盘IO操作。(页表由页号和块号组成)进程看到的所有地址组成的空间,就是虚拟空间。

"You are worthy! You can do it!" 1万+

从零构建Elasticsearch MCP代理:自然语言查询背后的技术揭秘

本文深入解析如何从零构建Elasticsearch MCP代理,实现自然语言查询的技术架构与实战应用。通过MCP协议与Elasticsearch的结合,系统能够将自然语言转换为精确的DSL查询,提升非技术用户的数据查询效率。文章详细介绍了核心架构、DSL生成引擎、端到端系统搭建及生产环境最佳实践,为开发者提供全面的技术指南。

lll78的博客 877

Linux- 内存映射文件(Memory-Mapped File)

内存映射文件(Memory-Mapped File)是⼀种将文件内容映射到内存中的机制,允许程序直接访问文件数据,就好像这些数据已经被加载到了内存⼀样。这个机制允许文件的内容被映射到⼀个进程的地址空间,从而允许程序以⼀种更高效的方式读取或写入文件数据,同时,多个进程可以映射同⼀个文件,从而实现进程间的数据共享。这对于进程间通信非常有用。

青衫客36的博客 2628

字节跳动高频111道核心前端面试题解析,web开发增强

但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。自定义指令(v-check、v-focus)的方法有哪些?v-model是什么?

2401_84094620的博客 1200

STM32按键中断切换红绿蓝灯

通过以上步骤,我们实现了使用STM32的按键中断来切换红绿蓝LED灯的功能。在实际应用中,可能还需要考虑更多的细节,如按键消抖、更精确的延时实现等。但上述代码提供了一个基本的框架和思路,可以根据具体需求进行扩展和优化。希望这篇博客对您有所帮助!

2301_79865940的博客 952

如何进行内存映射和文件映射操作?

内存映射是一种将文件或其他可存取的对象映射到程序的地址空间中的技术。这意味着文件的内容(或其他对象)被映射到程序的内存中,使得程序可以像访问内存一样访问文件的内容。内存映射将文件内容与内存缓冲区相关联,实现了对文件的高效访问。内存映射通常与虚拟内存系统一起使用,操作系统会根据需要将文件的部分或全部内容加载到物理内存中,以便程序能够快速读取或写入数据。内存映射还允许多个进程共享相同的内存映射区域,这在一些特定的应用程序中非常有用。内存映射和文件映射是强大的技术,用于在C语言中实现高效的文件操作和共享数据。

weixin_68551689的博客 2184

fMRI原始数据分割的笔记

好记性不如烂笔头_fMRI小白入门笔记

ZY_brain的博客 2896

内存学习(四):内存映射1

**内存映射是在进程的虚拟地址空间中创建一个映射,分为以下两种。** + (1)文件映射:**文件支持的内存映射,把文件的一个区间映射到进程的虚拟地址空间**,数据源是存储设备上的文件。 + (2)匿名映射:**没有文件支持的内存映射,把物理内存映射到进程的虚拟地址空间**,没有数据源。 通常**把文件映射的物理页称为文件页**,**把匿名映射的物理页称为匿名页。**

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 2984

PIMPL 模式 以及Q_DECLARE_PUBLIC 与 Q_DECLARE_PRIVATE

在 C++ 中,PIMPL 模式通常通过将类的私有数据和实现放在一个单独的类中,然后在类的公共接口中使用指向该私有实现类的指针来实现。宏可以帮助在 Qt 的 PIMPL 模式中实现类的私有实现和公共接口的分离,提高代码的封装性和可维护性。宏的结合使用,我们可以实现类的私有性和封装,避免暴露私有实现的细节,同时提高类的可维护性和灵活性。:这一行声明了一个友元类,使得类的公共接口可以访问私有实现类的私有成员。:这一行声明了一个友元类,使得类的私有实现可以访问类的私有成员。是两个宏,用于实现 PIMPL 模式。

追赶时代的博客 845

Codesys入门-新建工程+任务调用+编译+调试

程序组织单元(Program Organization Unit, POU)由声明区和代码区组成,是用户程序的最小软件单元,它相当于传统编程系统中的块(Block),按功能程序组织单元(POU)可分为函数(FUN)、功能块(FB)、程序(PRG)。:Codesys采用多任务的方式来执行用户程序的“任务”,而每个“任务”分配了不同的执行周期,有些全局变量可能要在不同的POU之间被访问和修改,于是需要对全局变量进行交互同步,也是在任务的“时间对准点”进行的,实例:声明了INT类型,变量名为输入;

刺客 1万+

内存映射文件(Memory-Mapped Files)在Java中的应用详解

内存映射文件是一种将文件的全部或部分内容映射到应用程序的内存地址空间的技术。通过这种映射,程序可以像操作内存一样直接访问文件内容,而不需要显式地调用read或write方法。这种操作方式不仅可以简化代码,还能显著提升文件I/O的性能,特别是在处理大文件或频繁访问文件内容的场景中。在Java中,内存映射文件的实现主要依赖于java.nio包中的类。通过的map方法,可以将文件的内容映射到内存中,并通过对文件内容进行读写操作。

乙壳虫的博客 2313

RK3568平台(网络篇)WIFI模块RTL8821CU调试

RTL8821CU是瑞昱半导体推出的usb接口的wifi,下面的教程将介绍如何将RTL8821CU移植到rk3588的平台上。移植usb wifi需要修改的文件Android hal层需要修改的文件//kernel需要修改的文件kernel/arch/arm64/boot/dts/rockchip/rk3399-tve1030g.dtsi //除去板上的sdio的wifi。

weixin_49303682的博客 3905

内存映射文件原理探索

首先,“映射”这个词,就和数学课上说的“一一映射”是一个意思,就是建立一种一一对应关系,在这里主要是只硬盘上文件的位置与进程逻辑地址空间中一块大小相同的区域之间的一一对应,如图1中过程1所示。这种对应关系纯属是逻辑上的概念,物理上是不存在的,原因是进程的逻辑地址空间本身就是不存在的。在内存映射的过程中,并没有实际的数据拷贝,文件没有被载入内存,只是逻辑上被放入了内存,具体到代码,就是建立并初始化了相关的数据结构(struct address_space),这个过程有系统调用mmap()实现,所以建立内存映射

我可能长大了 5万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

内存映射文件原理

一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了。。。下面,我先解释一下我对映射这个词的理解,再区分一下几个容易混淆的概念,之后,什么是内存映射就很明朗了。   原理 首先,“映射”这个词,就和数学课上说的“一一映射”是一个意思,就是建立一种一一对应关系,在这里主要是只 硬盘上文件 的位置与进程 逻辑地址空间中 一块大

Crazy_Bear 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

c语言 内存映射文件,内存映射文件

内存映射文件03/30/2017本文内容内存映射文件包含虚拟内存中文件的内容。 借助文件和内存空间之间的这种映射,应用(包括多个进程)可以直接对内存执行读取和写入操作,从而修改文件。 可以使用托管代码访问内存映射文件,就像本机 Windows 函数访问内存映射文件(如管理内存映射文件中所述)一样。内存映射文件分为两种类型:持久化内存映射文件持久化文件是与磁盘上的源文件相关联的内存映射文件。 当最后...

weixin_32550525的博客 1430

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Windows使用内存映射文件

内存映射文件主要用于以下三种情况:系统使用内存映射文件,以便加载和执行. exe和DLL文件。这可以大大节省页文件空间和应用程序启动运行所需的时间。可以使用内存映射文件来访问磁盘上的数据文件。这使你可以不必对文件执行I/O操作,并且可以不必对文件内容进行缓存。可以使用内存映射文件,使同一台计算机上运行的多个进程能够相互之间共享数据。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 3416

操作系统——内存映射文件

内存映射文件 1.定义: 内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用

weixin_44847698的博客 2520

C#内存映射文件学习

内存映射文件是由一个文件到进程地址空间的映射。         C#提供了允许应用程序把文件映射到一个进程的函(MemoryMappedFile.CreateOrOpen)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件

onejune的博客 7917

Windows之内存映射文件

=====================Windows之内存映射文件=====================几乎每个应用程序都要处理文件,但要处理好并不容易。应用程序到底是先应该打开文件、再读取文件,最后关闭文件呢,还是应该先打开文件,再用一个缓存算法来读取和写入文件的不同部分?Windows为我们提供了一个两全其美的解决方案---内存映射文件。内存映射文件允许开发人员预订一块地址

liuchangyu23的专栏 2773

IPC之Posix内存映射文件详解

1.什么是内存映射文件     内存映射文件,就是把磁盘上的物理文件映射至进程地址空间中,使用内存映射文件的特性是,所有的I/O都是在内核掩盖下完成,我们只需编写存取内存映射区中各个值的代码,也就是不需要调用read/write/lseek。   如图示:    2.内存映射文件与read文件时物理内存占用区别   需要了解物理内存和进程空间地址的映射关系。   可以通过 top -p...

daiyudong2020的博客 2058
上一篇: C++中的字节对齐
下一篇: CListCtrl控件使用
barech
博客等级 码龄21年 137粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值