由于项目需要,所以学习了一下Linux下内存映射文件的用法,在这里共享一下自己的收获,希望大家提出宝贵意见,进行交流。
简介:
内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件进行映射,就如同将整个文件从磁盘加载到内存。由此可以看出,使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。另外,实际工程中的系统往往需要在多个进程之间共享数据,如果数据量小,处理方法是灵活多变的,如果共享数据容量巨大,那么就需要借助于内存映射文件来进行。实际上,内存映射文件正是解决本地多个进程间数据共享的最有效方法。
在网上找了一些代码,自己加工之后在Linux下编译通过,可以运行实现相应功能。
memmap.h
-
#ifndef MEMMAP_H
-
#define MEMMAP_H
-
#include <stdio.h>
-
-
class MemMap
- {
-
public:
- MemMap();
- ~MemMap();
-
- bool Map(const char* szFileName);
- void UnMap();
-
- const void* GetData() const { return m_pData; }
- size_t GetSize() const { return m_uSize; }
-
-
private:
- void* m_pData;
- size_t m_uSize;
- int m_nFile;
- };
-
#endif
memmap.C
-
#include "memmap.h"
-
#include <unistd.h>
-
#include <fcntl.h>
-
#include <sys/mman.h>
-
-
- MemMap::MemMap() : m_pData(0), m_uSize(0), m_nFile(0)
- {
- }
-
- MemMap::~MemMap()
- {
- UnMap();
- }
-
-
bool MemMap::Map(const char* szFileName)
- {
- UnMap();
- m_nFile = open(szFileName, O_RDONLY);
- if (m_nFile < 0)
- {
- m_nFile = 0;
- return false;
- }
-
- struct stat status;
- fstat(m_nFile, &status);
-
- m_uSize = status.st_size;
- m_pData = mmap(0, m_uSize, PROT_READ, MAP_SHARED, m_nFile, 0);
- if (MAP_FAILED != m_pData) { return true;}
-
- close(m_nFile);
- m_pData = NULL;
- m_nFile = 0;
- m_uSize = 0;
- return false;
- }
-
-
void MemMap::UnMap()
- {
- if(m_pData)
- {
- munmap(m_pData, m_uSize);
- m_pData = NULL;
- }
-
- if(m_nFile)
- {
- close(m_nFile);
- m_nFile = 0;
- }
-
- m_uSize = 0;
- }
memmain.C
-
#include "memmap.h"
-
-
int main()
- {
- const char* szFileName = "1.txt";
- const char* szFileNew = "2.txt";
- MemMap mm;
- bool bFailed = !mm.Map(szFileName);
- if(bFailed) { return -1; }
-
- size_t uFileSize = mm.GetSize();
- const char* pData = (char*)mm.GetData();
- if(uFileSize <=0 || NULL == pData) { return -2; }
-
- FILE* pNewFile = fopen(szFileNew, "w");
- fwrite(pData, sizeof(char), uFileSize, pNewFile);
- fclose(pNewFile);
- pNewFile = NULL;
-
- return 0;
- }
分享到:
相关推荐
在Windows系统中,可以使用CreateFileMapping和MapViewOfFile函数来创建和映射文件。在Linux中,相应的系统调用是mmap。这两个API都允许程序员指定文件的哪一部分映射到内存,以及映射的大小。一旦映射完成,程序就...
内存映射文件(Memory-Mapped File)是一种在操作系统层面实现的高效文件处理技术,它允许程序将文件直接映射到进程的...通过理解和熟练运用内存映射文件,开发者能够为处理大文件和提高程序性能找到一种有效的方法。
内存映射文件是通过操作系统提供的系统调用来实现的,如在Windows系统中是`CreateFileMapping`和`MapViewOfFile`,在Linux或Unix系统中则是`mmap`函数。它将文件的逻辑地址空间与进程的物理地址空间关联,使得文件...
本文将深入探讨 `mmap` 的工作原理、参数含义及使用方法,并通过示例代码展示如何应用 `mmap`。 #### 二、mmap 基础概念 `mmap` 允许将文件或设备(如伪终端)映射到进程的虚拟内存空间,这意味着对内存的访问等同...
在Windows API中,可以使用CreateFileMapping和MapViewOfFile函数来创建和映射内存映射文件。首先,我们需要创建一个文件并填充数据,然后创建一个文件映射对象。文件映射对象是内存映射文件的核心,它定义了映射的...
封装内存映射文件的功能通常涉及以下几个关键步骤: 1. **创建映射对象**:使用系统API(如Windows上的CreateFileMapping或Linux上的mmap)创建一个内存映射对象,该对象关联到要映射的文件。这个对象提供了映射...
Linux下的内存映射机制mmap是Linux内核中的一种机制,允许进程将文件映射到自己的地址空间中,从而实现文件I/O操作。该机制是基于虚拟存储(Virtual Memory,VM)概念的,VM是Linux内核中的一种机制,用于管理进程的...
首先,内存映射的核心是操作系统提供的系统调用,如Unix/Linux下的`mmap()`,Windows下的`MapViewOfFile()`。ACE通过这些系统调用来实现跨平台的内存映射功能。`Mem_Map`类封装了这些系统调用,使得在不同的操作系统...
### 深入理解Linux内存映射机制 #### 一、绪论 现代操作系统为了有效管理和利用内存资源,采用了一种名为**虚拟内存**的技术。虚拟内存允许操作系统为每个进程分配独立的地址空间,即使实际物理内存不足也可以通过...
Linux下的内存映射函数mmap详解及示例代码.pdf 本文档将详细介绍Linux下的内存映射函数mmap,包括其概念、实现机制、示例代码等方面的内容。 mmap概念 mmap是Linux操作系统中的一种内存映射机制,可以将文件映射...
在Windows和Linux等操作系统中,内存映射允许程序将文件的部分或全部内容直接映射到进程的虚拟内存空间,使得文件数据可以直接像访问内存一样进行读写操作。这种方法极大地提高了大文件访问的效率,因为它减少了对...
2. **open**:使用`OpenFileMapping`(Windows)或`shm_open`(Linux)打开已存在的映射文件,并获取其句柄。 3. **deleteMap**:调用`CloseHandle`(Windows)或`close`(Linux)关闭文件句柄,然后使用`...
以上就是使用内存映射方式在Linux下进行V4L2视频数据采集的基本流程和原理。这种方式可以有效地应用于视频流的采集和处理,尤其是在对实时性要求较高的场景下。而在实际应用中,通常还需要配合数据压缩编码等处理,...
通过以上步骤,我们可以看到如何在Linux环境下使用V4L2 API和内存映射技术来实现视频数据的采集和处理。这种方式不仅大大提高了数据处理的效率,还简化了应用程序的设计。对于需要实时处理视频数据的应用而言,内存...
内存映射则允许程序直接访问文件在内存中的位置,提高了效率。 其次,书中可能介绍了Linux内核的内存分配器,如slab分配器和伙伴系统。Slab分配器用于缓存对象,提高了小内存块的分配和回收效率;伙伴系统则处理大...
4. **内存映射**:`mmap`函数允许将文件或设备映射到进程的地址空间,这在易语言的内存操作中可能有应用,比如加载二进制文件到内存执行。 5. **内存对齐**:为了提高性能和兼容性,内存分配通常需要满足特定的对齐...
总之,"文件映射封装类"是为了简化跨平台的文件映射操作而设计的,它将复杂的系统调用封装在易于使用的类中,使得开发者可以更高效、安全地利用文件映射功能。通过理解mymmapw.cpp、mymmapu.cpp、mymmapu.h和mymmapw...
本资料集“Linux内存管理”深入探讨了Linux内核如何高效地管理内存资源,包括物理内存、虚拟内存、交换空间等多个方面。以下是关于Linux内存管理的关键知识点: 1. 物理内存:在Linux中,物理内存是指计算机硬件中...
内存映射为盘符,即RAMDisk技术,是一种利用计算机内存作为临时存储空间的方法,将内存区域模拟成硬盘驱动器,使得操作系统能够将其识别并分配一个盘符,从而实现如同物理磁盘一样的读写操作。这种技术在某些特定...
本文将深入探讨嵌入式Linux内存使用与性能优化的相关知识点,帮助开发者更好地理解和改进其程序性能。 首先,理解Linux内存模型是优化的基础。Linux内核采用虚拟内存管理,包括物理内存(RAM)和交换空间(Swap)。...