内存映射和普通文件访问的区别

合集下载

内存映射原理

内存映射原理

内存映射原理
内存映射是一种将磁盘文件映射到内存的操作。

在内存中建立一个虚拟地址空间,该空间与磁盘文件相对应,使得我们可以像访问内存一样访问磁盘文件的内容。

内存映射的原理是通过将磁盘文件的内容映射到内存的一段连续地址空间中。

在内存中指定一个缓冲区,当对这个缓冲区进行读写操作时,实际上是在对磁盘文件进行读写操作。

读取该内存区域的数据时,由于数据已经在内存中,所以读取速度非常快。

内存映射的过程主要包括以下几个步骤:
1. 打开文件:使用文件操作相关的API函数打开需要映射到内存的文件。

2. 创建映射区域:使用内存映射相关的API函数,创建一个映射区域。

将文件的某个区域映射到内存。

3. 访问映射区域:获得映射到内存中的虚拟地址,可以直接对其进行读写操作,就像操作内存一样。

4. 保存修改:如果对映射区域进行了修改,需要使用相关的API函数将修改的内容保存回磁盘文件。

通过内存映射,可以实现大文件的快速读写,提高文件的访问速度。

此外,多个进程可以通过映射同一个文件,实现共享内
存的功能,简化进程间通信的实现。

但需要注意的是,对于大文件的内存映射可能会消耗大量的系统内存,需要进行适当的调优和管理。

内存映射的概念

内存映射的概念

内存映射的概念内存映射是计算机科学中的重要概念之一,它在操作系统和编程中扮演着重要的角色。

内存映射可以将磁盘上的文件映射到进程的地址空间中,使得进程可以像访问内存一样访问文件的内容。

这种机制对于处理大型文件、共享内存和提高性能具有很大的好处。

本文将详细探讨内存映射的概念、原理、应用和一些常见问题。

内存映射的原理内存映射的原理可以简要描述为将文件中的数据映射到进程的虚拟内存空间中。

通过这种映射,进程可以直接读取和写入文件的内容,而不需要通过标准的文件操作函数。

内存映射使用的是虚拟内存和分页机制。

操作系统将文件的某个区域映射到进程的虚拟地址空间中的一个或多个页上,当进程访问这些页时,操作系统会根据需要将数据载入内存或写回磁盘,实现文件和内存之间的快速访问。

内存映射的优势内存映射相比传统的文件操作函数有许多优势。

首先,内存映射消除了用户空间和内核空间之间的数据拷贝,减少了不必要的系统调用,提高了性能。

其次,内存映射可以提供更快的随机访问速度,因为访问文件数据就如同访问内存一样,无需寻道和读取整个文件。

此外,多个进程可以共享同一个文件的内存映射,这在处理大型数据集、共享内存和进程间通信等方面非常有用。

内存映射的应用1. 大型文件处理内存映射非常适用于处理大型文件,如视频文件、数据库文件等。

通过内存映射,可以将整个文件映射到内存中,然后使用指针和偏移量来访问文件的不同部分。

这样可以避免反复读取文件和分配缓冲区的开销,而且读写操作更高效。

2. 共享内存内存映射还常被用于进程间共享内存。

多个进程可以将同一个文件的某个区域映射到各自的内存空间中,这样它们就可以通过读写内存来进行通信。

这种方式比较高效,可以提供更快的数据传输速度和更简单的编程接口。

3. 动态链接库加载在操作系统中,内存映射也常用于动态链接库的加载和执行。

当一个进程需要调用某个动态链接库中的函数时,操作系统会将该库的某个区域映射到进程的地址空间中,这样进程就可以直接访问库中的代码和数据。

内存映射文件的作用功能介绍

内存映射文件的作用功能介绍

内存映射文件的作用功能介绍内存映射文件的主要用途:1.操作大文件 2.进程间大量数据共享,下面分别介绍如下:VC++中使用内存映射文件处理大文件引言文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。

一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB、几百GB、乃至几TB的海量存储,再以通常的文件处理方法进行处理显然是行不通的。

目前,对于上述这种大文件的操作一般是以内存映射文件的方式来加以处理的,本文下面将针对这种Windows核心编程技术展开讨论。

内存映射文件内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件进行映射,就如同将整个文件从磁盘加载到内存。

由此可以看出,使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。

另外,实际工程中的系统往往需要在多个进程之间共享数据,如果数据量小,处理方法是灵活多变的,如果共享数据容量巨大,那么就需要借助于内存映射文件来进行。

实际上,内存映射文件正是解决本地多个进程间数据共享的最有效方法。

内存映射文件并不是简单的文件I/O操作,实际用到了Windows的核心编程技术--内存管理。

所以,如果想对内存映射文件有更深刻的认识,必须对Windows操作系统的内存管理机制有清楚的认识,内存管理的相关知识非常复杂,超出了本文的讨论范畴,在此就不再赘述,感兴趣的读者可以参阅其他相关书籍。

内存映射文件

内存映射文件

内存映射文件:内存映射文件有三种,第一种是可执行文件的映射,第二种是数据文件的映射,第三种是借助页面交换文件的内存映射.应用程序本身可以使用后两种内存映射.1.可执行文件映射:Windows在执行一个Win32应用程序时使用的是内存映射文件技术.系统先在进程地址空间的0x00400000以上保留一个足够大的虚拟地址空间(0x00400000以下是由系统管理的),然后把应用程序所在的磁盘空间作为虚拟内存提交到这个保留的地址空间中去(我的理解也就是说,虚拟内存是由物理内存和磁盘上的页面文件组成的,现在应用程序所在的磁盘空间就成了虚拟地址的页面文件).做好这些准备后,系统开始执行这个应用程序,由于这个应用程序的代码不在内存中(在页面文件中),所以在执行第一条指令的时候会产生一个页面错误(页面错误也就是说,系统所访问的数据不在内存中),系统分配一块内存把它映射到0x00400000处,把实际的代码或数据读入其中(系统分配一块内存区域,把它要访问的在页面文件中的数据读入到这块内存中,需在注意是系统读入代码或数据是一页一页读入的),然后可以继续执行了.当以后要访问的数据不在内存中时,就可以通过前面的机制访问数据.对于Win32DLL的映射也是同样,不过DLL文件应该是被Win32进程共享的(我想应该被映射到x80000000以后,因为0x80000000-0xBFFFFFFF是被共享的空间).当系统在另一个进程中执行这个应用程序时,系统知道这个程序已经有了一个实例,程序的代码和数据已被读到内存中,所以系统只需把这块内存在映射到新进程的地址空间即可,这样不就实现了在多个进程间共享数据了吗!然而这种共享数据只是针对只读数据,如果进程改写了其中的代码和数据,操作系统就会把修改的数据所在的页面复制一份到改写的进程中(我的理解也就是说共享的数据没有改变,进程改写的数据只是共享数据的一份拷贝,其它进程在需要共享数据时还是共享没有改写的数据),这样就可以避免多个进程之间的相互干扰.2.数据文件的内存映射:数据文件的内存映射原理与可执行文件内存映射原理一样.先把数据文件的一部分映射到虚拟地址空间的0x80000000 - 0xBFFFFFFF,但没有提交实际内存(也就是说作为页面文件),当有指令要存取这段内存时同样会产生页面错误异常.操作系统捕获到这个异常后,分配一页内存,映射内存到发生异常的位置,然后把要访问的数据读入到这块内存,继续执行刚才产生异常的指令(这里我理解的意思是把刚才产生异常的指令在执行一次,这次由于数据已经映射到内存中,指令就可以顺利执行过去),由上面的分析可知,应用程序访问虚拟地址空间时由操作系统管理数据在读入等内容,应用程序本身不需要调用文件的I/O函数(这点我觉得很重要,也就是为什么使用内存映射文件技术对内存的访问就象是对磁盘上的文件访问一样).3.基于页面交换文件的内存映射:内存映射的第三种情况是基于页面交换文件的.一个Win32进程利用内存映射文件可以在进程共享的地址空间保留一块区域(0x8000000 - 0xBFFFFFFF),这块区域与系统的页面交换文件相联系.我们可以用这块区域来存储临时数据,但更常见的做法是利用这块区域与其他进程通信(因为0x80000000以上是系统空间,进程切换只是私有地址空间,系统空间是所有进程共同使用的),这样多进程间就可以实现通信了.事实上Win32多进程间通信都是使用的内存映射文件技术,如PostMessage(),SentMessage()函数,在内部都使用内存映射文件技术.使用内存映射文件的方法:1.利用内存映射文件进行文件I/O操作:CreateFile()-->CreateFileMapping()-->MapViewOfFile()......2.利用内存映射文件实现Win32进程间通信:我只介绍两种常用的方法:第一种方法:两个进程使用同一个文件映射核心对象,打开各自的视图,或者父进程把自己创建的文件映射核心对象继承给子进程使用.这种方法比较安全有效.第二种方法:基于页面交换文件的内存映射对象.在调用CreateFileMapping()函数时,传递的文件句柄为0xFFFFFFFF,系统就从页面交换文件中提交物理内存,然后进程之间按照第一种方法进程通信.这种方法不用事先准备一个特殊的文件(也就是说不用事先调用CreateFile()返回一个文件的句柄),非常方便.。

内存映射文件(专门读写大文件)

内存映射文件(专门读写大文件)

内存映射⽂件(专门读写⼤⽂件)引⾔ ⽂件操作是应⽤程序最为基本的功能之⼀,Win32 API和MFC均提供有⽀持⽂件处理的函数和类,常⽤的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。

⼀般来说,以上这些函数可以满⾜⼤多数场合的要求,但是对于某些特殊应⽤领域所需要的动辄⼏⼗GB、⼏百GB、乃⾄⼏TB的海量存储,再以通常的⽂件处理⽅法进⾏处理显然是⾏不通的。

⽬前,对于上述这种⼤⽂件的操作⼀般是以内存映射⽂件的⽅式来加以处理的,本⽂下⾯将针对这种Windows核⼼编程技术展开讨论。

内存映射⽂件概述 内存⽂件映射也是Windows的⼀种内存管理⽅法,提供了⼀个统⼀的内存管理特征,使应⽤程序可以通过内存指针对磁盘上的⽂件进⾏访问,其过程就如同对加载了⽂件的内存的访问。

通过⽂件映射这种使磁盘⽂件的全部或部分内容与进程虚拟地址空间的某个区域建⽴映射关联的能⼒,可以直接对被映射的⽂件进⾏访问,⽽不必执⾏⽂件I/O操作也⽆需对⽂件内容进⾏缓冲处理。

内存⽂件映射的这种特性是⾮常适合于⽤来管理⼤尺⼨⽂件的。

在使⽤内存映射⽂件进⾏I/O处理时,系统对数据的传输按页⾯来进⾏。

⾄于内部的所有内存页⾯则是由虚拟内存管理器来负责管理,由其来决定内存页⾯何时被分页到磁盘,哪些页⾯应该被释放以便为其它进程提供空闲空间,以及每个进程可以拥有超出实际分配物理内存之外的多少个页⾯空间等等。

由于虚拟内存管理器是以⼀种统⼀的⽅式来处理所有磁盘I/O的(以页⾯为单位对内存数据进⾏读写),因此这种优化使其有能⼒以⾜够快的速度来处理内存操作。

使⽤内存映射⽂件时所进⾏的任何实际I/O交互都是在内存中进⾏并以标准的内存地址形式来访问。

磁盘的周期性分页也是由操作系统在后台隐蔽实现的,对应⽤程序⽽⾔是完全透明的。

内存映射⽂件的这种特性在进⾏⼤⽂件的磁盘事务操作时将获得很⾼的效益。

内存映射文件与共享内存的区别

内存映射文件与共享内存的区别

内存映射文件与共享内存的区别
内存映射文件和共享内存都是用来实现进程间通信的技术,但它们之间存在着
一些重要的区别。

首先,内存映射文件是将一个文件映射到进程的地址空间中,使得整个文件可以像内存一样被访问,而共享内存则是将一段物理内存映射到多个进程的地址空间中,以实现进程间数据的共享。

其次,内存映射文件是一种将文件内容映射到内存的技术,通过将文件映射到
内存中,可以避免频繁的磁盘IO操作,提高访问文件内容的速度。

而共享内存则
是一段物理内存空间,在不同进程中访问共享内存可以实现进程间的数据共享,比如可以通过共享内存传递数据或共享某些资源。

另外,内存映射文件是一种通过对文件进行映射来实现内存访问的技术,对文
件的修改会实时反映到文件中,但内存映射文件不支持对文件进行完全随机的访问和修改。

而共享内存是一种直接访问物理内存的方式,对共享内存的操作会直接影响到进程间的通信。

此外,内存映射文件更适用于对文件进行读写操作,特别是适合大文件的处理,而共享内存更适用于简单的数据共享,比如进程之间传递一些共享的数据结构或缓冲区。

综上所述,内存映射文件和共享内存都是实现进程间通信的方式,但它们在实
现机制、适用场景和操作方式上存在一些区别。

开发者可以根据具体的需求选择合适的技术来实现进程间通信,提高程序的性能和效率。

内存映射文件原理

内存映射文件原理

内存映射文件原理内存映射文件原理1. 概述•内存映射文件是一种将文件内容映射到内存地址空间的技术。

•它可以让我们像访问内存一样访问文件,提供了快速读写文件的方法。

2. 原理介绍1.内存映射文件通过建立虚拟内存与磁盘文件之间的映射关系实现。

2.当我们将一个文件映射到内存中时,操作系统会为该文件分配一块虚拟内存空间。

3.虚拟内存空间被划分为多个固定大小的页,而文件也被划分为相同大小的页。

4.当访问虚拟内存空间中的某个页时,操作系统会将对应的磁盘页加载到内存中。

5.文件中的数据和内存中的数据是共享的,对内存中的数据的修改会直接写回到文件中。

3. 优点•快速读写:内存映射文件利用了操作系统的虚拟内存机制,可以直接访问文件数据,避免了频繁的磁盘读写操作,提高了读写性能。

•方便操作:将文件映射到内存后,我们可以像操作内存一样访问文件,使用指针访问数据更加方便和高效。

•共享数据:多个进程可以将同一个文件映射到各自的内存空间中,实现共享数据的目的,方便进程间的通信。

4. 使用步骤1.打开文件:使用指定的文件路径打开需要映射的文件。

2.获取文件大小:通过系统调用或API函数获取文件的大小。

3.创建映射对象:使用系统调用或API函数创建一个映射对象,指定文件句柄、大小等信息。

4.映射到内存:将映射对象映射到内存中,得到一个指向映射区域的指针。

5.访问数据:可以通过指针对映射区域中的数据进行读写操作。

6.取消映射:使用系统调用或API函数取消内存与文件的映射关系。

7.关闭文件:使用系统调用或API函数关闭文件。

5. 使用场景•大文件处理:内存映射文件可以有效地处理大文件,减少了磁盘读写的次数,提高了处理效率。

•数据共享:多个进程可以通过内存映射文件实现数据的共享,方便了进程间的通信和数据交换。

•高性能数据库:许多高性能数据库系统使用内存映射文件来提高数据的读写速度和响应时间。

6. 注意事项•内存映射文件使用较多的内存资源,需注意管理内存的使用情况,避免内存泄漏等问题。

文件内存映射原理

文件内存映射原理

文件内存映射原理
文件内存映射是一种将磁盘文件映射到进程地址空间的技术,使得文件在内存中的数据可以像访问内存一样被读取和写入。

文件内存映射可以提供对文件的连续访问和修改,而不需要通过读写函数来操作文件。

文件内存映射的原理是通过调用操作系统提供的函数,将文件映射到进程的虚拟地址空间。

在调用映射函数时,操作系统会在进程的虚拟地址空间中创建一个映射区域,该映射区域与文件的一部分或全部内容相对应。

当映射建立完成后,进程可以像访问内存一样直接读取和写入映射区域的数据。

对映射区域的读写操作会被直接转化为对相应文件位置的读写操作,无需通过系统调用和文件缓冲区的数据拷贝。

文件内存映射的优点是提供了更快的访问速度和简化操作的接口。

由于文件的数据可以直接映射到内存中,所以读取和写入文件数据的速度通常比使用传统的读写函数更快。

此外,文件内存映射也提供了更为简单的编程接口,可以直接对内存数据进行操作,而无需关心底层的文件读写细节。

不过,文件内存映射也有一些注意事项。

首先,文件内存映射通常用于处理较大的文件,因为映射整个文件可能会占用大量的内存空间。

其次,对映射区域的修改并不会立即写入文件,而是在操作系统认为合适的时候进行同步操作。

因此,在对映射区域进行写入操作后,需要通过调用相应的同步函数来确保
数据已经写入文件。

总的来说,文件内存映射是一种高效的文件访问技术,它可以加速对文件数据的读写操作,并简化编程接口。

不过,在使用文件内存映射时需要注意适当控制内存占用和及时同步数据的操作。

mmap原理

mmap原理

mmap原理Mmap原理。

Mmap是一种内存映射文件的技术,它允许文件被映射到进程的地址空间,使得文件可以直接在内存中进行读写操作。

在Unix和类Unix系统中,mmap是一种常见的系统调用,它为程序员提供了一种方便、高效的文件访问方式。

本文将介绍mmap的原理及其在实际应用中的一些常见用法。

一、内存映射文件的基本原理。

内存映射文件是通过将文件映射到进程的虚拟内存空间来实现的。

当一个文件被映射到进程的地址空间后,进程就可以像访问内存一样访问文件,而不需要通过read和write等系统调用来进行读写操作。

这样做的好处是可以减少系统调用的次数,提高文件访问的效率。

在内存映射文件的实现中,操作系统会为文件映射到进程的地址空间中的一段连续的虚拟内存区域,这段虚拟内存区域可以是文件的整个内容,也可以是文件的部分内容。

当程序访问这段虚拟内存区域时,操作系统会根据程序的访问行为来进行相应的处理,比如将文件的内容加载到内存中,或者将内存中的内容写回到文件中。

二、mmap的常见用法。

1. 读取文件内容。

使用mmap可以方便地将文件映射到进程的地址空间中,从而可以直接通过指针来访问文件的内容。

这种方式相比于传统的read系统调用来说,可以减少数据在内核空间和用户空间之间的拷贝次数,提高了文件读取的效率。

2. 修改文件内容。

通过mmap映射文件后,程序可以直接修改文件在内存中的内容,而不需要通过write系统调用来进行写操作。

这种方式可以减少系统调用的次数,提高了文件写入的效率。

3. 共享内存。

除了映射文件外,mmap还可以用来创建共享内存区域,使得不同的进程可以共享同一段内存空间。

这种方式可以方便进程之间进行通信和数据共享。

三、mmap的注意事项。

1. 内存保护。

在使用mmap映射文件时,需要注意对映射内存区域的保护。

可以通过设置内存保护标志来限制对映射内存区域的访问权限,比如只读、可写、执行等。

2. 文件同步。

在使用mmap修改文件内容时,需要注意文件同步的问题。

内存映射文件的工作原理及使用方法

内存映射文件的工作原理及使用方法

内存映射文件的工作原理及使用方法内存映射文件(Memory-mapped files)是一种将文件映射到内存的机制,它允许应用程序直接访问磁盘上的文件,而无需进行显式的读写操作。

在内存映射文件中,操作系统将文件的一些区域映射到了进程的虚拟内存空间,从而让应用程序可以像访问内存一样访问文件的内容。

内存映射文件的工作原理及使用方法如下:工作原理:1. 打开文件:应用程序首先使用标准的文件操作函数(如open()打开需要映射的文件。

在打开文件时,操作系统会为该文件维护一个文件描述符(File Descriptor)以及其他相关信息。

2. 创建映射:应用程序使用操作系统提供的内存映射函数(如mmap()将文件的一些区域映射到进程的虚拟内存空间中。

该区域通常以页为单位进行映射,即一个或多个连续的页被映射为一段连续的虚拟内存区域。

3.访问文件:一旦映射创建成功,应用程序就可以像访问内存一样访问文件的内容。

读文件时,应用程序直接读取虚拟内存中的数据,操作系统会自动将数据从磁盘读取到内存中;写文件时,应用程序直接修改虚拟内存中的数据,操作系统也会自动将数据写回磁盘。

4.同步数据:内存映射文件中的数据是与磁盘文件保持同步的。

当应用程序对映射区域进行修改时,操作系统会将数据缓存到内存中,并在适当的时机进行写回磁盘,以保证文件的一致性。

使用方法:1. 准备文件:首先需要准备一个需要映射的文件。

可以通过标准的文件操作函数(如open(、write()创建或修改文件。

2. 打开映射:使用内存映射函数(如mmap()将文件的一些区域映射到虚拟内存中。

需要指定映射的起始位置、映射的长度、映射的权限等参数。

3.访问文件:通过访问虚拟内存中的映射区域,可以读写文件的内容。

可以使用指针操作、数组操作或其他方式来访问映射区域中的数据。

4. 同步数据:在需要时,可以使用内存同步函数(如msync()将内存中修改的数据写回磁盘,以保证文件的一致性。

linux 内存映射 mmap用法

linux 内存映射 mmap用法

linux 内存映射mmap用法一mmap系统调用1.内存映射所谓的内存映射就是把物理内存映射到进程的地址空间之内,这些应用程序就可以直接使用输入输出的地址空间,从而提高读写的效率。

Linux 提供了mmap()函数,用来映射物理内存。

在驱动程序中,应用程序以设备文件为对象,调用mmap()函数,内核进行内存映射的准备工作,生成vm_area_struct结构体,然后调用设备驱动程序中定义的mmap 函数。

2.mmap系统调用mmap将一个文件或者其它对象映射进内存。

文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。

munmap执行相反的操作,删除特定地址区域的对象映射。

当使用mmap映=映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用.但需注意,直接对该段内存写时不会写入超过当前文件大小的内容采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。

对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。

实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。

而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。

共享内存中的内容往往是在解除映射时才写回文件的。

因此,采用共享内存的通信方式效率是非常高的。

基于文件的映射,在mmap和munmap执行过程的任何时刻,被映射文件的st_atime可能被更新。

如果st_atime字段在前述的情况下没有得到更新,首次对映射区的第一个页索引时会更新该字段的值。

用PROT_WRITE 和MAP_SHARED标志建立起来的文件映射,其st_ctime 和st_mtime在对映射区写入之后,但在msync()通过MS_SYNC 和MS_ASYNC两个标志调用之前会被更新。

C#.Net多进程同步通信共享内存内存映射文件MemoryMapped

C#.Net多进程同步通信共享内存内存映射文件MemoryMapped

C#.Net多进程同步通信共享内存内存映射⽂件MemoryMapped 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。

内存映射⽂件对于托管世界的开发⼈员来说似乎很陌⽣,但它确实已经是很远古的技术了,⽽且在操作系统中地位相当。

实际上,任何想要共享数据的通信模型都会在幕后使⽤它。

内存映射⽂件究竟是个什么?内存映射⽂件允许你保留⼀块地址空间,然后将该物理存储映射到这块内存空间中进⾏操作。

物理存储是⽂件管理,⽽内存映射⽂件是操作系统级内存管理。

优势:1.访问磁盘⽂件上的数据不需执⾏I/O操作和缓存操作(当访问⽂件数据时,作⽤尤其显著);2.让运⾏在同⼀台机器上的多个进程共享数据(单机多进程间数据通信效率最⾼);利⽤⽂件与内存空间之间的映射,应⽤程序(包括多个进程)可以通过直接在内存中进⾏读写来修改⽂件。

.NET Framework 4 ⽤托管代码按照本机Windows函数访问内存映射⽂件的⽅式来访问内存映射⽂件,。

有两种类型的内存映射⽂件:持久内存映射⽂件持久⽂件是与磁盘上的源⽂件关联的内存映射⽂件。

在最后⼀个进程使⽤完此⽂件后,数据将保存到磁盘上的源⽂件中。

这些内存映射⽂件适合⽤来处理⾮常⼤的源⽂件。

⾮持久内存映射⽂件⾮持久⽂件是未与磁盘上的源⽂件关联的内存映射⽂件。

当最后⼀个进程使⽤完此⽂件后,数据将丢失,并且垃圾回收功能将回收此⽂件。

这些⽂件适⽤于为进程间通信 (IPC) 创建共享内存。

1)在多个进程之间进⾏共享(进程可通过使⽤由创建同⼀内存映射⽂件的进程所指派的公⽤名来映射到此⽂件)。

2)若要使⽤⼀个内存映射⽂件,则必须创建该内存映射⽂件的完整视图或部分视图。

还可以创建内存映射⽂件的同⼀部分的多个视图,进⽽创建并发内存。

为了使两个视图能够并发,必须基于同⼀内存映射⽂件创建这两个视图。

3)如果⽂件⼤于应⽤程序⽤于内存映射的逻辑内存空间(在 32 位计算机上为2GB),则还需要使⽤多个视图。

内存映射文件使用方法

内存映射文件使用方法

内存映射文件使用方法随着计算机技术的不断发展,内存映射文件成为了一种重要的文件处理方式。

内存映射文件可以将文件直接映射到内存中,提供了一种高效、方便的文件操作方式。

本文将介绍内存映射文件的使用方法,匡助读者更好地理解和应用这一技术。

一、什么是内存映射文件内存映射文件是一种将文件映射到内存的技术。

通过内存映射文件,我们可以像操作内存一样操作文件,而不需要频繁地进行磁盘读写操作。

内存映射文件可以提高文件的读写效率,并且简化了文件操作的代码。

二、内存映射文件的创建在使用内存映射文件之前,我们需要创建一个内存映射文件对象。

下面是一个简单的内存映射文件的创建示例:```pythonimport mmapfile = open('example.txt', 'r+b')mmap_obj = mmap.mmap(file.fileno(), 0)```在上述示例中,我们首先打开了一个文件,并以读写模式打开。

然后,通过`mmap.mmap`函数创建了一个内存映射文件对象`mmap_obj`。

这样,我们就可以通过`mmap_obj`来操作文件了。

三、内存映射文件的读写操作内存映射文件对象提供了一系列方法来进行读写操作。

下面是一些常用的方法:1. `read(size)`:从内存映射文件中读取指定大小的数据,并返回一个字节对象。

2. `write(data)`:将指定的数据写入到内存映射文件中。

3. `seek(offset[, whence])`:将文件指针挪移到指定的位置。

`offset`表示偏移量,`whence`表示偏移的起始位置,默认为0。

4. `size()`:返回内存映射文件的大小。

通过这些方法,我们可以方便地对内存映射文件进行读写操作。

例如,我们可以使用`read`方法读取文件的内容,并使用`write`方法将数据写入到文件中。

四、内存映射文件的应用场景内存映射文件在实际开辟中有着广泛的应用场景。

内存映射文件MemoryMappedFile使用

内存映射文件MemoryMappedFile使用

内存映射⽂件MemoryMappedFile使⽤所谓内存映射⽂件,其实就是在内存中开辟出⼀块存放数据的专⽤区域,这区域往往与硬盘上特定的⽂件相对应。

进程将这块内存区域映射到⾃⼰的地址空间中,访问它就象是访问普通的内存⼀样。

在.NET中,使⽤MemoryMappedFile对象表⽰⼀个内存映射⽂件,通过它的CreateFromFile()⽅法根据磁盘现有⽂件创建内存映射⽂件,调⽤这⼀⽅法需要提供⼀个与磁盘现有⽂件相对应的FileStream对象。

需要保存的类:[Serializable]public class MyImg{public Image img;public string name;}View CodeMMF定义:public class MMF{private MemoryMappedFile file = null;private MemoryMappedViewStream strem = null;private MemoryMappedViewAccessor acces = null;public MMF(){file = MemoryMappedFile.CreateOrOpen("myMMF", 1024 * 1024, MemoryMappedFileAccess.ReadWrite);strem = file.CreateViewStream();acces = file.CreateViewAccessor();}public void Write(int value){acces.Write(0, value);}public int Read(){int value;acces.Read(0, out value);return value;}public void WriteClass(MyImg img){IFormatter format = new BinaryFormatter();format.Serialize(strem, img);}public MyImg ReadClass(){IFormatter format = new BinaryFormatter();return format.Deserialize(strem) as MyImg;}}View Code界⾯代码:private void button1_Click(object sender, EventArgs e){using (OpenFileDialog dlg = new OpenFileDialog()){dlg.Filter = "*.png|*.png";if (dlg.ShowDialog() == DialogResult.OK){this.pictureBox1.Image = Image.FromFile(dlg.FileName);bel1.Text = Path.GetFileNameWithoutExtension(dlg.FileName);}}}private void button2_Click(object sender, EventArgs e){MyImg img = new MyImg() { img = this.pictureBox1.Image, name = bel1.Text }; myFile.WriteClass(img);}private void button3_Click(object sender, EventArgs e){MyImg img = myFile.ReadClass();this.pictureBox1.Image = img.img;bel1.Text = ;}private void button4_Click(object sender, EventArgs e){label2.Text = myFile.Read().ToString();}private void button5_Click(object sender, EventArgs e){myFile.Write(int.Parse(this.textBox1.Text));}View Code。

内存扩展技术原理

内存扩展技术原理

内存扩展技术原理
内存扩展技术是指通过各种方式将计算机的内存容量进行扩展,从而提高计算机的处理能力。

常见的内存扩展技术有虚拟内存、内存映射、内存缓存、内存互联等。

1. 虚拟内存:虚拟内存是一种利用硬盘作为辅助存储器的内存管理技术。

它通过将计算机内存分成若干个大小相等的页面或帧,将进程的逻辑地址空间映射到物理地址空间中的某个页面或帧上。

当进程访问的页面不在内存中时,系统会将需要的页面从硬盘读取到内存中,以满足进程的需求。

这样,虚拟内存能够使得计算机具有比物理内存更大的容量,提高计算机的处理能力。

2. 内存映射:内存映射是指将外部设备的寄存器或存储器映射到计算机的内存地址空间中。

通过内存映射,计算机可以像访问内存一样访问外部设备,从而简化了对外部设备的访问操作。

内存映射技术可以扩展计算机的内存容量,将外部设备的存储空间作为计算机的一部分来使用。

3. 内存缓存:内存缓存是指在CPU和内存之间插入高速的缓
存存储器,用来提高数据访问的速度。

内存缓存可以存储最近被访问过的数据块,当CPU访问内存时,先在缓存中查找数据,如果找到则直接返回,否则才访问主存。

内存缓存能够减少CPU与内存之间的数据传输次数,加快数据的读取和写入
速度,提高计算机的运行效率。

4. 内存互联:内存互联是指通过互联技术将多台计算机的内存
连接起来,共同组成一个更大的内存空间。

内存互联可以通过网络、总线等方式实现,通过将多台计算机的内存进行集成,扩展了计算机的内存容量,提高计算机的处理能力。

内存映射的概念

内存映射的概念

内存映射的概念内存映射是一种将文件或其他设备映射到进程地址空间的技术。

在内存映射中,进程可以像访问内存一样访问文件或设备,而不必使用传统的读写操作。

这种技术可以提高程序的性能和可靠性,同时也可以简化代码的编写。

内存映射的基本原理是将文件或设备的内容映射到进程的虚拟地址空间中。

这样,进程就可以直接访问文件或设备的内容,而不必使用传统的读写操作。

内存映射可以分为两种类型:匿名映射和文件映射。

匿名映射是一种将一段虚拟地址空间映射到物理内存中的技术。

在匿名映射中,进程可以直接访问映射的内存区域,而不必使用传统的分配和释放内存的操作。

匿名映射通常用于进程间通信或共享内存。

文件映射是一种将文件映射到进程地址空间的技术。

在文件映射中,进程可以像访问内存一样访问文件的内容,而不必使用传统的读写操作。

文件映射可以提高程序的性能和可靠性,同时也可以简化代码的编写。

文件映射通常用于大文件的读写操作或多进程共享文件。

内存映射的优点是可以提高程序的性能和可靠性。

内存映射可以减少读写操作的次数,从而提高程序的效率。

内存映射还可以减少程序的错误处理代码,从而提高程序的可靠性。

内存映射还可以简化代码的编写,从而提高程序的可读性和可维护性。

内存映射的缺点是可能会占用大量的内存空间。

内存映射需要将文件或设备的内容映射到进程地址空间中,这可能会占用大量的内存空间。

内存映射还可能会导致内存泄漏或内存溢出等问题,从而影响程序的稳定性。

总之,内存映射是一种将文件或设备映射到进程地址空间的技术。

内存映射可以提高程序的性能和可靠性,同时也可以简化代码的编写。

内存映射的缺点是可能会占用大量的内存空间,从而影响程序的稳定性。

因此,在使用内存映射时,需要注意内存的使用情况,以确保程序的稳定性和可靠性。

内存映射的方式

内存映射的方式

内存映射的方式内存映射是一种将文件或其他设备映射到程序的内存空间的方式,使得程序可以直接读取或写入内存中的数据,而无需通过繁琐的文件读写操作。

常见的内存映射方式有以下几种:1.文件映射:文件映射是将一个文件的内容映射到内存中,使得程序可以直接访问文件的内容。

文件映射可以分为读映射和写映射两种方式。

读映射意味着程序可以直接从内存中读取文件的内容,而无需通过文件读取操作;写映射则允许程序直接将数据写入到内存中,而无需通过文件写入操作。

文件映射可以提高文件的读写性能,减少了文件操作的开销。

2.共享内存映射:共享内存映射是一种特殊的内存映射方式,它允许多个进程之间共享同一段内存空间。

这种方式可以通过建立映射关系,使得多个进程可以直接读写映射到内存中的数据,实现数据共享和通信。

共享内存映射可以提高进程间通信的效率,避免了复制数据的开销。

3.设备映射:设备映射是将设备的寄存器或者是设备对应的内存空间映射到程序的内存空间中,使得程序可以直接操作设备。

这种方式可以提高对设备的访问效率,并且简化了对设备的操作流程。

提高读写性能:因为内存映射可以减少文件读写操作的次数,直接在内存中进行读写操作,因此可以提高读写性能,特别是对于大文件的读写。

简化操作流程:通过内存映射,程序可以直接访问内存中的数据,而无需通过繁琐的文件读写操作或者设备操作,减少了操作的复杂性和开销。

实现数据共享和通信:共享内存映射可以实现不同进程之间的数据共享和通信,提高了进程间通信的效率。

内存限制:程序的内存空间是有限的,如果映射的文件或设备太大,可能会导致内存不足的问题。

并发访问:如果多个进程或线程同时访问同一段内存映射空间,可能会发生竞争条件和数据一致性问题,需要进行相应的同步和互斥处理。

安全性:内存映射方式对于系统的安全性也有一定的影响,需要特别注意对映射区域的保护和权限控制,防止恶意访问和篡改。

总的来说,内存映射是一种高效简便的数据访问方式,可以提高读写性能,简化操作流程,并实现数据共享和通信。

操作系统中的内存映射与文件映射技术

操作系统中的内存映射与文件映射技术

操作系统中的内存映射与文件映射技术内存映射和文件映射是操作系统中常用的技术之一。

它们允许操作系统将磁盘上的文件直接映射到内存,使得对文件的访问操作可以像对内存一样快速和方便。

本文将分别介绍内存映射和文件映射的原理、应用场景以及它们的优缺点。

一、内存映射1.内存映射的原理内存映射是操作系统中一种将磁盘上的文件映射到进程地址空间的技术。

具体而言,操作系统会为文件在虚拟内存地址空间中分配一段连续的地址,并将文件内容从磁盘读取到这段内存中。

这样,对该文件的访问操作就可以直接在内存中进行,而不需要再通过文件读写系统调用。

2.内存映射的应用场景内存映射在操作系统中有着广泛的应用场景。

其中最常见的应用场景包括:-文件访问:将文件映射到内存中可以避免频繁的磁盘读写操作,从而提高文件访问速度。

这在处理大型文件或需要频繁访问的文件时特别有用。

-共享内存:多个进程可以将同一个文件映射到各自的地址空间中,从而实现共享内存的目的。

这在并发编程和进程间通信中常用,可以提高进程间的数据交换效率。

-动态链接库加载:操作系统可以将动态链接库文件映射到进程地址空间中,实现动态库的加载和使用。

这可以提高程序的可扩展性和灵活性。

3.内存映射的优缺点内存映射技术有着以下优点:-提高访问速度:内存映射将磁盘上的文件映射到内存中,避免了频繁的磁盘读写操作,从而提高了访问速度。

-简化编程:内存映射使得对文件的访问可以像访问内存一样简单,不需要使用繁琐的文件读写系统调用。

-共享数据:多个进程可以通过映射同一文件实现共享内存,从而在进程间交换数据,并实现进程间的通信。

然而,内存映射技术也有以下缺点:-浪费内存:内存映射会为文件在进程地址空间中分配一段内存,如果映射了大型文件,会导致内存的浪费。

-安全性问题:如果多个进程都可以访问同一个文件的映射内存,那么需要注意对共享内存的保护,避免数据损坏或非法访问。

-文件大小限制:由于内存有限,操作系统对单个文件的映射大小通常存在限制,不能超过操作系统的地址空间大小。

mmap和普通文件读写的区别和比较mmap的注意点

mmap和普通文件读写的区别和比较mmap的注意点

mmap和普通⽂件读写的区别和⽐较mmap的注意点参考对linux⽂件系统不了解的朋友,请参阅我之前写的博⽂《》,我们⾸先简单的回顾⼀下常规⽂件系统操作(调⽤read/fread等类函数)中,函数的调⽤过程:1、进程发起读⽂件请求。

2、内核通过查找进程⽂件符表,定位到内核已打开⽂件集上的⽂件信息,从⽽找到此⽂件的inode。

3、inode在address_space上查找要请求的⽂件页是否已经缓存在页缓存中。

如果存在,则直接返回这⽚⽂件页的内容。

4、如果不存在,则通过inode定位到⽂件磁盘地址,将数据从磁盘复制到页缓存。

之后再次发起读页⾯过程,进⽽将页缓存中的数据发给⽤户进程。

总结来说,常规⽂件操作为了提⾼读写效率和保护磁盘,使⽤了页缓存机制。

这样造成读⽂件时需要先将⽂件页从磁盘拷贝到页缓存中,由于页缓存处在内核空间,不能被⽤户进程直接寻址,所以还需要将页缓存中数据页再次拷贝到内存对应的⽤户空间中。

这样,通过了两次数据拷贝过程,才能完成进程对⽂件内容的获取任务。

写操作也是⼀样,待写⼊的buffer在内核空间不能直接访问,必须要先拷贝⾄内核空间对应的主存,再写回磁盘中(延迟写回),也是需要两次数据拷贝。

⽽使⽤mmap操作⽂件中,创建新的虚拟内存区域和建⽴⽂件磁盘地址和虚拟内存区域映射这两步,没有任何⽂件拷贝操作。

⽽之后访问数据时发现内存中并⽆数据⽽发起的缺页异常过程,可以通过已经建⽴好的映射关系,只使⽤⼀次数据拷贝,就从磁盘中将数据传⼊内存的⽤户空间中,供进程使⽤。

总⽽⾔之,常规⽂件操作需要从磁盘到页缓存再到⽤户主存的两次数据拷贝。

⽽mmap操控⽂件,只需要从磁盘到⽤户主存的⼀次数据拷贝过程。

说⽩了,mmap的关键点是实现了⽤户空间和内核空间的数据直接交互⽽省去了空间不同数据不通的繁琐过程。

因此mmap效率更⾼。

mmap优点总结由上⽂讨论可知,mmap优点共有⼀下⼏点:1、对⽂件的读取操作跨过了页缓存,减少了数据的拷贝次数,⽤内存读写取代I/O读写,提⾼了⽂件读取效率。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在讲述文件映射的概念时, 不可避免的要牵涉到虚存(SVR 4的VM). 实际上, 文件映射是虚存的中心概念, 文件映射一方面给用户提供了一组措施, 好似用户将文件映射到自己地址空间的某个部分, 使用简单的内存访问指令读写文件;另一方面, 它也可以用于内核的基本组织模式, 在这种模式种, 内核将整个地址空间视为诸如文件之类的一组不同对象的映射. 中的传统文件访问方式是, 首先用open系统调用打开文件, 然后使用read, write以及lseek等调用进行顺序或者随即的I/O. 这种方式是非常低效的, 每一次I/O操作都需要一次系统调用. 另外, 如果若干个进程访问同一个文件, 每个进程都要在自己的地址空间维护一个副本, 浪费了内存空间. 而如果能够通过一定的机制将页面映射到进程的地址空间中, 也就是说首先通过简单的产生某些内存管理数据结构完成映射的创建. 当进程访问页面时产生一个缺页中断, 内核将页面读入内存并且更新页表指向该页面. 而且这种方式非常方便于同一副本的共享.VM是面向对象的方法设计的, 这里的对象是指内存对象: 内存对象是一个软件抽象的概念, 它描述内存区与后备存储之间的映射. 系统可以使用多种类型的后备存储, 比如交换空间, 本地或者远程文件以及帧缓存等等. VM系统对它们统一处理, 采用同一操作集操作, 比如读取页面或者回写页面等. 每种不同的后备存储都可以用不同的方法实现这些操作. 这样, 系统定义了一套统一的接口, 每种后备存储给出自己的实现方法. 这样, 进程的地址空间就被视为一组映射到不同数据对象上的的映射组成. 所有的有效地址就是那些映射到数据对象上的地址. 这些对象为映射它的页面提供了持久性的后备存储. 映射使得用户可以直接寻址这些对象.值得提出的是, VM体系结构独立于Unix系统, 所有的Unix系统语义, 如正文, 数据及堆栈区都可以建构在基本VM系统之上. 同时, VM体系结构也是独立于存储管理的, 存储管理是由操作系统实施的, 如: 究竟采取什么样的对换和请求调页算法, 究竟是采取分段还是分页机制进行存储管理, 究竟是如何将虚拟地址转换成为物理地址等等(Linux中是一种叫Three Level Page Table的机制), 这些都与内存对象的概念无关.下面介绍Linux中 VM的实现.一个进程应该包括一个mm_struct(memory manage struct), 该结构是进程虚拟地址空间的抽象描述, 里面包括了进程虚拟空间的一些管理信息: start_code, end_code, start_data, end_data, start_brk, end_brk等等信息. 另外, 也有一个指向进程虚存区表(vm_area_struct: virtual memory area)的指针, 该链是按照虚拟地址的增长顺序排列的. 在Linux进程的地址空间被分作许多区(vma), 每个区(vma)都对应虚拟地址空间上一段连续的区域, vma是可以被共享和保护的独立实体, 这里的vma就是前面提到的内存对象. 下面是vm_area_struct的结构, 其中, 前半部分是公共的, 与类型无关的一些数据成员, 如: 指向mm_struct的指针, 地址范围等等, 后半部分则是与类型相关的成员, 其中最重要的是一个指向vm_operation_struct向量表的指针vm_ops, vm_pos向量表是一组虚函数, 定义了与vma类型无关的接口. 每一个特定的子类, 即每种vma类型都必须在向量表中实现这些操作. 这里包括了: open, close, unmap, protect, sync, nopage, wppage, swapout这些操作.1.struct vm_area_struct {2./*公共的, 与vma类型无关的 */3.struct mm_struct * vm_mm;4.unsigned long vm_start;5.unsigned long vm_end;6.struct vm_area_struct *vm_next;7.pgprot_t vm_page_prot;8.unsigned long vm_flags;9.short vm_avl_height;10.struct vm_area_struct * vm_avl_left;11.struct vm_area_struct * vm_avl_right;12.struct vm_area_struct *vm_next_share;13.struct vm_area_struct **vm_pprev_share;14.15./* 与类型相关的 */16.struct vm_operations_struct * vm_ops;17.unsigned long vm_pgoff;18.struct file * vm_file;19.unsigned long vm_raend;20.void * vm_private_data;21.};vm_ops: open, close, no_page, swapin, swapout……介绍完VM的基本概念后, 我们可以讲述mmap和munmap系统调用了. mmap调用实际上就是一个内存对象vma的创建过程, mmap的调用格式是:void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);其中start是映射地址, length是映射长度, 如果flags的MAP_FIXED不被置位, 则该参数通常被忽略, 而查找进程地址空间中第一个长度符合的空闲区域;Fd是映射文件的文件句柄, offset是映射文件中的偏移地址;prot是映射保护权限, 可以是PROT_EXEC, PROT_READ, PROT_WRITE, PROT_NONE, flags则是指映射类型, 可以是MAP_FIXED, MAP_PRIVATE, MAP_SHARED, 该参数必须被指定为MAP_PRIVATE和MAP_SHARED其中之一, MAP_PRIVATE 是创建一个写时拷贝映射(copy-on-write), 也就是说如果有多个进程同时映射到一个文件上, 映射建立时只是共享同样的存储页面, 但是某进程企图修改页面内容, 则复制一个副本给该进程私用, 它的任何修改对其它进程都不可见. 而MAP_SHARED则无论修改与否都使用同一副本, 任何进程对页面的修改对其它进程都是可见的.mmap系统调用的实现过程是:1.先通过文件系统定位要映射的文件;2.权限检查, 映射的权限不会超过文件打开的方式, 也就是说如果文件是以只读方式打开, 那么则不允许建立一个可写映射;3.创建一个vma对象, 并对之进行初始化;4.调用映射文件的mmap函数, 其主要工作是给vm_ops向量表赋值;5.把该vma链入该进程的vma链表中, 如果可以和前后的vma合并则合并;6.如果是要求VM_LOCKED(映射区不被换出)方式映射, 则发出缺页请求, 把映射页面读入内存中.munmap(void * start, size_t length):该调用可以看作是 mmap的一个逆过程. 它将进程中从start开始length长度的一段区域的映射关闭, 如果该区域不是恰好对应一个vma, 则有可能会分割几个或几个vma.msync(void * start, size_t length, int flags):把映射区域的修改回写到后备存储中. 因为munmap时并不保证页面回写, 如果不调用msync, 那么有可能在munmap后丢失对映射区的修改. 其中flags可以是MS_SYNC, MS_ASYNC, MS_INVALIDATE, MS_SYNC要求回写完成后才返回, MS_ASYNC发出回写请求后立即返回, MS_INVALIDATE使用回写的内容更新该文件的其它映射. 该系统调用是通过调用映射文件的sync函数来完成工作的.brk(void * end_data_segement):将进程的数据段扩展到 end_data_segement指定的地址, 该系统调用和mmap的实现方式十分相似, 同样是产生一个vma, 然后指定其属性. 不过在此之前需要做一些合法性检查, 比如该地址是否大于mm->end_code, end_data_segement和mm->brk之间是否还存在其它vma等等. 通过brk产生的vma映射的文件为空, 这和匿名映射产生的vma相似, 关于匿名映射不做进一步介绍. 库函数malloc就是通过brk实现的.Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明:头文件:<unistd.h><sys/mman.h>原型: void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offsize);返回值: 成功则返回映射区起始地址, 失败则返回MAP_FAILED(-1).参数:addr: 指定映射的起始地址, 通常设为NULL, 由系统指定.length: 将文件的多大长度映射到内存.prot: 映射区的保护方式, 可以是:PROT_EXEC: 映射区可被执行.PROT_READ: 映射区可被读取.PROT_WRITE: 映射区可被写入.PROT_NONE: 映射区不能存取.flags: 映射区的特性, 可以是:MAP_SHARED: 对映射区域的写入数据会复制回文件, 且允许其他映射该文件的进程共享.MAP_PRIVATE: 对映射区域的写入操作会产生一个映射的复制(copy-on-write), 对此区域所做的修改不会写回原文件.此外还有其他几个flags不很常用, 具体查看linux C函数说明.fd: 由open返回的文件描述符, 代表要映射的文件.offset: 以文件开始处的偏移量, 必须是分页大小的整数倍, 通常为0, 表示从文件头开始映射.下面说一下内存映射的步骤:用open系统调用打开文件, 并返回描述符fd.用mmap建立内存映射, 并返回映射首地址指针start.对映射(文件)进行各种操作, 显示(printf), 修改(sprintf).用munmap(void *start, size_t lenght)关闭内存映射.用close系统调用关闭文件fd.注意事项:在修改映射的文件时, 只能在原长度上修改, 不能增加文件长度, 因为内存是已经分配好的.Linux-mmap函数介绍mmap函数是unix/linux下的系统调用,来看《Unix Netword programming》卷二12.2节对mmap的介绍:The mmap function maps either a file or a Posix shared memory object into the address space of a process.We use this function for three purposes:1. with a regular file to provide memory-mapped I/O2. with special files to provide anonymous memory mappings3. with shm_open to provide Posix shared memory between unrelated processesmmap系统调用并不是完全为了用于共享内存而设计的。

相关文档
最新文档