精华内容
下载资源
问答
  • 内容索引:VC/C++源码,系统相关,内存映射 VC++通过内存映射在程序间交换数据,通过这个小实例,你会了解到以下技巧:在内存映像中创建对象,将文件视图映射到一个进程的地址空间上、返回LPVOID类型的内存指针、给...
  • 内存映射,进程间通过. 可以实现进程间的数据传输.
  • 两个EXE之间共享内存传递数据,喜欢的DELPHI的朋友可以下载学习下
  • 内存映射文件的应用

    千次阅读 2019-06-08 11:31:35
    内存映射文件的应用一,操作系统加载EXE和DLL二,读写大文件三,进程间通信      内存映射文件是windows开发下常用的一种技术,既可以用来读写磁盘上的大文件,也可以用来实现进程间的...

         内存映射文件是windows开发下常用的一种技术,既可以用来读写磁盘上的大文件,也可以用来实现进程间的通信,本文主要对内存映射的几大用途做一个简述。

    一,操作系统加载EXE和DLL

         当一个应用程序启动时,操作系统首先会调用CreateFile来打开磁盘上的.exe文件。接着系统会调用CreateFileMapping来创建文件映射对象。最后系统会以新创建的进程的名义调用MapViewOfFileEx(),这样就把.exe文件映射到了进程的地址空间中。这里使用MapViewOfFileEx的原因是为了将文件映射到进程的指定基地址处(32位程序默认基地址为0x400000)。然后系统创建进程的主线程,在映射得到的视图中取得可执行代码的第一个字节的地址,把该地址放到线程的指令指针中,最后CPU执行其中的代码。

         这时再启动该应用程序的第二个实例,操作系统会发现该.exe文件已经有一个文件映射对象,那么系统会将该文件映射对象视图映射到新创建的进程的地址空间中。显然,由于物理内存中包含.exe文件可执行代码的那些页面为两个进程(或多个进程)所共享,因此内存的使用率更高。

         但是由于该.exe的所有实例都是共享同一个内存映射,那么如果其中一个实例修改了数据页面中的一些全局变量,其他实例也会被修改,当然,操作系统也考虑到了这一点,通过内存管理系统的写时复制特性来防止这种情况的发生。任何时候当应用程序试图写入内存映射文件的时候,系统首先会截获到这类尝试,接着为应用程序试图写入的内存页面分配一块新的内存,然后复制页面内容,最后让应用程序写入到刚分配的内存块。这样,其他实例不会受到任何影响。
    在这里插入图片描述

    二,读写大文件

         C++中提供了类似fopen,fstream等函数来操作文件,这些函数的原理都是直接对文件进行IO读取和缓存,当处理的文件只有几k,几十k,或者几百k的时候,使用这些函数都没有问题。但是如果处理的文件是几百兆,几G的大小,频繁的IO操作会很耗时,甚至由于需要把这么大的数据都加载到程序缓存中,还会影响到程序的内存,因此,我们采用共享内存的方式来解决这个问题。

         共享内存读取大文件主要有以下几个步骤:
    1, 创建或打开一个文件内核对象,该对象标识了我们想要用作内存映射文件的那个磁盘文件。
    2, 创建一个文件映射内核对象,来告诉操作系统文件的大小以及我们打算如何访问文件。
    3, 告诉操作系统把文件映射对象的部分或全部映射到进程的地址空间中。

    代码示例如下:

    int Func()
    {
    	clock_t cStart, cEnd;
    	cStart = clock();
    
    	//打开一个文件内核对象
    	HANDLE hFile = CreateFile(L"test.txt",	//文件名称
    		GENERIC_WRITE | GENERIC_READ,	//访问文件的方式(可读可写)
    		0,								//此文件共享的方式(0表示其他任何试图打开文件的操作都会失败)
    		NULL,							//指向SECURITY_ATTRIBUTES的指针,用以指示安全信息以及句柄继承等属性
    		OPEN_EXISTING,					//指定打开文件的标志(OPEN_EXISTING表示打开已有的文件,如果不存在则打开失败)
    		FILE_ATTRIBUTE_NORMAL,			//文件属性,默认
    		NULL							//文件句柄传空,如果非空,则忽略上面那个参数,使用当前文件句柄的属性
    	);
    	if (INVALID_HANDLE_VALUE == hFile)
    	{
    		printf("CreateFile Failed!\n");
    		return 0;
    	}
    
    	//获取文件大小
    	DWORD dwFileSize = GetFileSize(hFile, NULL);
    
    	//创建文件映射内核对象
    	HANDLE hFileMap = CreateFileMapping(hFile,	//文件内核对象句柄
    		NULL,									//指向SECURITY_ATTRIBUTES的指针,用以指示安全信息以及句柄继承等属性
    		PAGE_READWRITE,							//文件保护属性(可读可写)
    		0,										//文件大小高位值,如果文件小于4G,则填0
    		dwFileSize + 1,							//文件大小低位值,PAGE_READ属性可以直接填0,PAGE_READWRITE的话要>=实际文件大小
    		L"FileMapTest"							//文件映射对象的名称
    	);
    	if (INVALID_HANDLE_VALUE == hFileMap)
    	{
    		printf("CreateFile Failed!\n");
    		return 0;
    	}
    
    	//将文件的数据映射到进程的地址空间中
    	PVOID pvFile = MapViewOfFile(hFileMap,
    		FILE_MAP_WRITE, 0, 0, 0);
    
    	//操作pvFile来遍历数据
    	char *pData = (char*)pvFile;
    	for (int i = 0; i < dwFileSize; i++)
    	{
    		
    	}
    
    	cEnd = clock();
    	printf("MapViewOfFile: %.6f\n", double(cEnd - cStart) / CLOCKS_PER_SEC);
    
    	//释放资源
    	UnmapViewOfFile(pvFile);
    
    	CloseHandle(hFileMap);
    
    	CloseHandle(hFile);
    }
    
    

    三,进程间通信

         Windows提供了多种机制可以使得应用程序之间可以快速地,方便地共享数据和信息,包括剪切板,套接字,windows消息(尤其是WM_COPYDATA),DDE,RPCDEN等。在windows系统中,在同一台机器上共享数据的最底层的机制就是内存映射文件,刚才提到的那些进程间通信方式归根结底都会用到内存映射文件。因此如果要求低开销和高性能,内存映射文件无疑是同一台机器上的多进程通信最好的方法。

         举例说明,有一个管理客户端,有一个专门处理业务的后台进程,后台进程处理业务的数据量(比如行情数据量,代码数据量,查询笔数等信息)需要同步到管理端界面显示,这两个进程之间的通信就是通过内存映射来实现。由于这个例子不涉及到多个进程同时写数据,所以不需要考虑到加锁,如果存在多进程写的情况,需要加内核对象锁。

         管理客户端代码:

    //创建文件映射对象
    	char szMapFileName[MAX_PATH] = { 0 };
    	if (NULL == m_hMapHandle)
    	{
    		_snprintf(szMapFileName, sizeof(szMapFileName) - 1, "statistic_map_%s.dat", g_cHqissueName);
    		m_hMapHandle = CreateFileMapping(
    			(HANDLE)INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(STATISTIC_DATA), szMapFileName);
    		if (m_hMapHandle == NULL)
    		{
    			return -1;
    		}
    	}
    
    	//将文件映射到程序的内存地址
    	if (NULL == m_pStatisticData)
    	{
    		m_pStatisticData = (STATISTIC_DATA *)MapViewOfFile(m_hMapHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    		if (m_pStatisticData == NULL)
    		{
    			CloseHandle(m_hMapHandle);
    			m_hMapHandle = NULL;
    			return -2;
    		}
    
    		memset(m_pStatisticData, 0, sizeof(STATISTIC_DATA));
    		m_pStatisticData->nSize = sizeof(STATISTIC_DATA);
    		m_pStatisticData->dwProcessID = GetCurrentProcessId();
    	}
    
    

         其中STATISTIC_DATA是我们共享的数据结构。m_pStatisticData也就是映射到当前进程中的地址,直接对其进行访问赋值。
         后台进程代码:

    m_hMapHandle = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, "statistic_map_hqissue1.dat");
    		if (!m_hMapHandle)
    		{
    			return;
    		}
    
    		m_pStatisticData = (STATISTIC_DATA*)MapViewOfFile(m_hMapHandle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
    		if (!m_pStatisticData)
    		{
    			return;
    		}
    
    

         直接打开命名的内存映射文件,映射到当前进程中,访问m_pStatisticData即可取值。

    展开全文
  • 内存映射

    2010-07-16 13:14:00
    系统通过内存映射文件,可以方便的加载和执行可执行文件(.exe)和动态链接库(.dll)文件。这样就可以大大的节省应用程序启动时所需的时间和页文件空间。 3. 可以提供内存映射文件,使在同一台计算机上运行的...

    内存映射文件一般用于以下三种不同的目的:

     

    1. 可以使用内存映射文件来访问磁盘上的数据文件,这样就不必对文件进行IO操作,因此就不必对文件内容进行缓存。

    2. 系统通过内存映射文件,可以方便的加载和执行可执行文件(.exe)和动态链接库(.dll)文件。这样就可以大大的节省应用程序启动时所需的时间和页文件空间。

    3. 可以提供内存映射文件,使在同一台计算机上运行的多个进程可以共享数据资源。内存映射文件已经成为了一台计算机上多个进程之间相互通信的最有效的方法。

     

     

    建议在软件的开发过程中,如果需要进行大容量的文件读写操作,申请开通大容量的虚拟地址空间,或者需要在几个不同的进程之间通信,最好采用内存映射文件技术。

     

    在wince5.0 中,如果想要打开一个供内存映射技术访问的文件:

    1. 首先要调用CreateFileForMapping()打开或创建一个供内存映射技术访问的文件。

    2. 通过CreateFileMapping为指定的内存映射文件创建一个文件映射对象。

    3. 通过MapViewOfFile将文件对象映射到地址空间。

    4. 进行相应的读写操作。

    5. 通过UnmapViewofFile结束整个操作。

     

    展开全文
  • 使用windows内存-内存映射文件

    千次阅读 2016-01-03 19:19:56
    内存映射文件 和虚拟内存一样,内存映射文件可以用来保留一个进程地址区域;但是,与虚拟内存不同,它提交的不是物理内存或是虚拟页文件,而是硬盘上的文件。将文件映射成内存,我们可以像使用内存一样使用文件....

    内存映射文件

    和虚拟内存一样,内存映射文件可以用来保留一个进程地址区域;但是,与虚拟内存不同,它提交的不是物理内存或是虚拟页文件,而是硬盘上的文件。将文件映射成内存,我们可以像使用内存一样使用文件.

      使用场合

    它有三个主要用途:

    系统加载EXE和DLL文件

    操作系统就是用它来加载exe和dll文件建立进程,运行exe。这样可以节省页文件和启动时间。

    访问大数据文件

    如果文件太大,比如超过了进程用户区2G,用fopen是不能对文件进行操作的。这时,可用内存映射文件。对于大数据文件可以不必对文件执行I/O操作,不必对所有文件内容进行缓存。

    进程共享机制

    内存映射文件是多个进程共享数据的一种较高性能的有效方式,它也是操作系统进程通信机制的底层实现方法。RPC、COM、OLE、DDE、窗口消息、剪贴板、管道、Socket等都是使用内存映射文件实现的。


    相关函数介绍


    CreateFile(文件名,访问属性,共享模式,…) 

    作用:创建文件内核对象API

    其中,访问属性有:

    0 不能读写 (用它可以访问文件属性)

    GENERIC_READ

    GENERIC_WRITE

    GENERIC_READ|GENERIC_WRITE;

    共享模式:

    0 独享文件,其他应用程序无法打开

    FILE_SHARE_WRITE

    FILE_SHARE_READ|FILE_SHARE_WRITE

    这个属性依赖于访问属性,必须和访问属性不冲突。

    当创建失败时,返回INVALID_HANDLE_VALUE。


    HANDLE CreateFileMapping(Handle 文件,PSECURITY_ATTRIBUTES 安全属性,DWORD 保护属性,DWORD 文件大小高32位,DWORD 文件大小低32位,PCTSTR  映射名称)

    作用:创建文件映射内核对象

    “文件”是上面创建的句柄;

    “安全属性”是内核对象需要的,NULL表示使用系统默认的安全属性;“保护属性”是当将存储器提交给进程空间时,需要的页面属性:PAGE_READONLY, PAGE_READWRITE和PAGE_WRITECOPY。这个属性不能和文件对象的访问属性冲突。除了这三个外,还有两个属性可以和它们连接使用(|)。当更新文件内容时,不提供缓存,直接写入文件,可用SEC_NOCACHE;当文件是可执行文件时,系统会根据节赋予不同的页面属性,可用SEC_IMAGE。另外,SEC_RESERVE和SEC_COMMIT用于稀疏提交的文件映射,详细介绍请参考下文。

    “文件大小高32位”和“文件大小低32位”联合起来告诉系统,这个映射所能支持的文件大小(操作系统支持264B文件大小);当这个值大于实际的文件大小时,系统会扩大文件到这个值,因为系统需要保证进程空间能完全被映射。值为0默认为文件的大小,这时候如果文件大小为0,创建失败。

    “映射名称”是给用户标识此内核对象,供各进程共享,如果为NULL,则不能共享。

    对象创建失败时返回NULL。

    创建成功后,系统仍未为文件保留进程空间。


    PVOID MAPViewOfFile(HANDLE 映射对象,DWORD访问属性,DWORD 偏移量高32位,DWORD 偏移量低32位,SIZE_T 字节数)

    作用:文件映射内核对象映射到进程空间

    “映射对象”是前面建立的对象;

    “访问属性”可以是下面的值:FILE_MAP_WRITE(读和写)、FILE_MAP_READ、FILE_MAP_ALL_ACCESS(读和写)、FILE_MAP_COPY。当使用FILE_MAP_COPY时,系统分配虚拟页文件,当有写操作时,系统会拷贝数据到这些页面,并赋予PAGE_READWRITE属性。

    可以看到,每一步都需要设置这类属性,是为了可以多点控制,试想,如果在这一步想有多种不同的属性操作文件的不同部分,就比较有用。

    “偏移高32位”和“偏移低32位”联合起来标识映射的开始字节(地址是分配粒度的倍数);

    “字节数”指映射的字节数,默认0为到文件尾。

     

    当你需要指定映射到哪里时,你可以使用:

    PVOID MAPViewOfFile(HANDLE 映射对象,DWORD访问属性,DWORD 偏移量高32位,DWORD 偏移量低32位,SIZE_T 字节数,PVOID 基地址)

    “基地址”是映射到进程空间的首地址,必须是分配粒度的倍数。


    BOOL FlushViewOfFile(PVOID 进程空间地址,SIZE_T 字节数)

    作用:保存文件修改, 为了提高速度,更改文件时可能只更改到了系统缓存,这时,需要强制保存更改到硬盘,特别是撤销映射前。

    “进程空间地址”指的是需要更改的第一个字节地址,系统会变成页面的地址;

    “字节数”,系统会变成页面大小的倍数。

    写入磁盘后,函数返回,对于网络硬盘,如果希望写入网络硬盘后才返回的话,需要将FILE_FLAG_WRITE_THROUGH参数传给CreateFile。

     

    当使用FILE_MAP_COPY建立映射时,由于对数据的更改只是对虚拟页文件的修改而不是硬盘文件的修改,当撤销映射时,会丢失所做的修改。如果要保存,怎么办?

    你可以用FILE_MAP_WRITE建立另外一个映射,它映射到进程的另外一段空间;扫描第一个映射的PAGE_READWRITE页面(因为属性被更改),如果页面改变,用MoveMemory或其他拷贝函数将页面内容拷贝到第二次映射的空间里,然后再调用FlushViewOfFile。当然,你要记录哪个页面被更改。


    BOOL  UnmapViewOfFile(PVOID pvBaseAddress)

    作用:撤销映射, pvBaseAddress  这个地址必须与MapViewOfFile返回值相同。


    CloseHandle(HANDLE)

    作用:关闭内核对象

    在不需要内核对象时,尽早将其释放,防止内存泄露。由于它们是内核对象,调用CloseHandle(HANDLE)就可以了。

    在CreateFileMapping后马上关闭文件句柄;

    在MapViewOfFile后马上关闭内存映射句柄;

    最后再撤销映射。



    内存映射文件的使用步骤

        2.1 创建或打开一个文件
        CreateFile
        2.2 创建内存映射文件
          HANDLE CreateFileMapping(
      HANDLE hFile, //文件句柄
          LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
                                 //安全属性
          DWORD flProtect, //保护模式
          DWORD dwMaximumSizeHigh,//大小的高32位
          DWORD dwMaximumSizeLow,    //大小的低32位
          LPCTSTR lpName ); //文件映射内核对象的名称
        2.3 映射成内存地址
        LPVOID MapViewOfFile(
           HANDLE hFileMappingObject, //文件映射句柄
           DWORD dwDesiredAccess, //访问模式
           DWORD dwFileOffsetHigh, //地址偏移高32位
           DWORD dwFileOffsetLow,//地址偏移低32位
           DWORD dwNumberOfBytesToMap ); //要映射的字节数


        2.4 使用内存

     对于大文件,可以用多次映射的方法达到访问的目的。有点像AWE技术。

     Windows只保证同一文件映射内核对象的多次映射的数据一致性,比如,当有两次映射同一对象到二个进程空间时,一个进程空间的数据改变后,另一个进程空间的数据也会跟着改变;不保证不同映射内核对象的多次映射的一致性。所以,使用文件映射时,最好在CreateFile时将共享模型设置为0独享,当然,对于只读文件没这个必要。


        2.5 卸载映射
           BOOL UnmapViewOfFile(
       LPCVOID lpBaseAddress //卸载的地址
           );
        2.6 关闭内存映射文件
           CloseHandle
        2.7 文件关闭
           CloseHandle


    示例代码:

    #include "stdafx.h"
    #include "windows.h"
    
    void Map( )
    {	
    	//创建文件
    	HANDLE hFile = CreateFile( "C:\\map.dat",
    		GENERIC_READ|GENERIC_WRITE,
    		0, NULL, CREATE_ALWAYS,
    		FILE_ATTRIBUTE_NORMAL, NULL );
    	//创建文件映射
    	HANDLE hMap = CreateFileMapping( hFile, NULL,
    		PAGE_READWRITE, 0, 1024 * 1024, NULL );
    	//映射地址
    	CHAR * pszText = (CHAR *)MapViewOfFile( 
    		hMap, FILE_MAP_ALL_ACCESS,
    		0, 0, 1024 * 1024 );
    	//使用内存
    	strcpy( pszText, "Hello File Mapping" );
    	printf( "%s\n", pszText );
    	//卸载地址
    	UnmapViewOfFile( pszText );
    	//关闭文件映射
    	CloseHandle( hMap );
    	//关闭文件
    	CloseHandle( hFile );
    }
    
    int main(int argc, char* argv[])
    {
    	Map( );
    	return 0;
    }
    


    展开全文
  • 内存映射文件

    2015-05-08 16:21:04
    内存映射文件 内存映射文件的概念:内存映射文件提供了一组独立的函数,使应用程序能够通过内存指针像访问内存一样访问磁盘上的文件。通过内存映射文件函数可以将磁盘上的文件全部或者部分映射到进程的虚拟...
    内存映射文件
    内存映射文件的概念内存映射文件提供了一组独立的函数,使应用程序能够通过内存指针像访问内存一样访问磁盘上的文件。通过内存映射文件函数可以将磁盘上的文件全部或者部分映射到进程的虚拟地址空间的某个位置。一旦完成映射,对磁盘文件的访问就可以像访问内存文件一样便捷。
    (看样子内存CPU操作内存映射文件并不需要经过物理内存RAM啊,CPU指令能支持这样的访问吗?看到有人说是加载到CPU的高速缓存中,未证实!)

    使用内存映射文件的好处
    a系统使用内存映射文件,以便加载和执行.exeDLL文件。这可以大大节省页文件空间和应用程序启动运行所需的时间。
    b可以使用内存映射文件来访问磁盘上的数据文件。这使你可以不必对文件执行I/O操作,并且可以不必对文件内容进行缓存。
    c可以使用内存映射文件,使同一台计算机上运行的多个进程能够相互之间共享数据。注:使用内存映射文件数据传输是通过4k大小的数据页面实现的。
    内存映射文件的实现原理
    先来看看windows的页式虚拟存储管理,在windows中,每一个页面在一个时刻都是处于一下三种情况之一:空闲的,挂起的还有已经提交的。
    当某个页面不需要的时候windows可以将其从内存中调换出来,需要的时候页面可以重新再次从物理存储器读入内存。内存映射文件的实现原理与此相似,内存映射文件也保留了一个地址空间的区域,并根据需要将物理存储器提交到该区域。
    区别是:内存映射文件存取一个磁盘文件时,它提交的物理存储器就是来自该文件~!

    内存映射文件函数包括:  
    CreatFileMapping, OpenFileMapping, MapViewOfFile, UnmapViewOfFileFlushViewOfFile.
    使用内存映射文件的步骤分两步
    使用CreatFileMapping 创建一个内存映射文件对象
    Invoke CreatFileMapping,hFile,lpFilemappingAttributes, flProtect,dwMaximumSizeHigh,\
    dwMaximumSizeLow ,lpName
    .if eax
    mov hFileMap,eax
    .endif
    这个函数确定了映射文件的用途:
    在磁盘文件建立内存映射文件还是在内存页面上建立进程间共享的映射。
    通过设置第一个参数 hFile 的值可以实现上面的功能。如果 hFile 句柄是属于一个已经打开的文件,那么映射文件就在这个文件上建立。如果想建立存在于内存文件中内存映射文件供不同进程共享,则将 hFile 指定为 -1
    lpFilemappingAttributes
    :内存映射文件对象是否可以被继承。不被继承使用 NULL
    flProtect
     内存映射文件的保护方式,注意要在用CreatFile函数打开文件获得hFile句柄的时候必须指定相应的标志flProtect
    dwMaximumSizeHigh/dwMaximumSizeLow: :指定 64 位内存映射文件的长度。将这两参数设置为零,系统会自动将内存映射文件的大小调整到磁盘文件的大小。
    lpName
    内存映射文件的名字。用于进程共享的时候映射文件必须起名字。

    使用 OpenFileMapping  打开已经建立的用于进程共享的内存映射文件。  
           Invoke   OpenFileMapping,dwDesiredAccess,bInheritHandle, lpName
           .if    eax
                    Mov hFileMap, eax
           .endif
    dwDesiredAccess
    :指定保护类型。
    lpName            
    创建对象时使用的名字。
    bInheritHandle 
     继承文件的句柄。

    2  创建内存映射文件的一个视图。相当于给内存映射文件分配线形地址空间,并将线形地址与文件的内容相关联。这样应用程序可以通过存取线形地址来存取文件。
    Invoke   MapViewOfFile,hFileMap,dwDesiredAccess,dwFileOffsetHigh,dwFileOffsetLow,\
                 dwNumberOfBytesToMap
    .if eax
             Mov ipMemory,eax
    .endif
    不多说了这个函数的参数很简单。
    取消映射文件: invoke UnmapViewOfFile,lpMemory
    关闭映射文件: invoke CloseHandle,hFileMap
    将对文件的修改立即写到磁盘上是调用这个函数实现的  Invoke FlushViewOfFile, lpMemory, dwFileSize 
    现在总结一下
    使用内存映射文件进行读写文件的步骤:
    1
    调用  CreatFile  打开想要映射的文件,获得 hFile
    2
    调用  CreatFileMapping  函数生成一个建立在 CreatFile 函数创建的文件对象基础上的内存映射对象,得到 hFileMap
    3
    调用  MapViewOfFile  函数把整个文件的一个区域或者整个区域映射到内存中,得到指向映射到内存的第一个字节的指针  lpMemory
    4
    用该指针来读写文件
    5
    调用  UnmapViewOfFile  来解除文件映射,传入参数为  lpMemory
    6
    调用  CloseHandle  来关闭内存映射文件,传入参数为  hFileMap
    7
    调用  CloseHandle  来关闭文件,传入函数为  hFile
    展开全文
  • windows内存映射文件

    2012-11-30 09:36:59
    内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行的多个进程之间共享数据。 • 内存堆栈,最适合用来管理大量的小对象。 内存映射文件 内存映射文件与数据视图的相关性 页文件...
  • 谈谈内存映射文件

    千次阅读 2014-11-24 22:26:29
    内存映射文件允许开发人员预订一块地址空间并为该区域调拨物理存储器,与虚拟内存不同的是,内存映射文件的物理存储器来自磁盘中的文件,而非系统的页交换文件。将文件映射到内存中后,我们就可以在内存中操作他们了...
  • 内存映射技术相关知识  内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统...
  • Java nio之内存映射

    2016-08-07 22:57:34
    Java nio之内存映射介绍内存映射文件非常特别,它允许Java程序直接从内存中读取文件内容,通过将整个或部分文件映射到内存,由操作系统来处理加载请求和写入文件,应用只需要和内存打交道,这使得IO操作非常快。...
  • windows 内存映射文件

    2015-11-28 09:54:31
    • 内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行的多个进程之间共享数据。  • 内存堆栈,最适合用来管理大量的小对象。     内存映射文件 内存映射文件与数据视图的...
  • 【面经笔记】内存映射、共享内存

    千次阅读 2017-09-05 17:05:29
    系统使用内存映射文件载入EXE,DLL文件。这节省了大量页交换文件的空间以及程序启动时间。 开发人员使用内存映射文件来访问磁盘上的数据文件,这使得我们避免直接对文件I/O操作和文件内容的缓存 通过使用内存映射文件...
  • 内存映射文件”可以将硬盘上的文件映射到虚拟地址空间,这样就不需要将所有东西都放入到页交换文件中,比如系统有许多程序同时运行时,如果将这些程序文件都加载到页交换文件中,页交换文件将会变得非常大。...
  • Org: ...通过内存映射文件函数可以将磁盘上文件的全部和部分映射到进程虚拟地址空间的某个位置,一旦完成了映射,对文件内容的访问就如同在该地址区域内直接对内存访问一样简单。这

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,295
精华内容 17,718
关键字:

exe内存映射