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/O
2. with special files to provide anonymous memory mappings
3. with shm_open to provide Posix shared memory between unrelated processes
mmap系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或系统V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。
mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。
我们的程序中大量运用了mmap,用到的正是mmap的这种“像访问普通内存一样对文件进行 访问”的功能。实践证明,当要对一个文件频繁的进行访问,并且指针来回移动时,调用mmap比用常规的方法快很多。
来看看mmap的定义:
void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
--参数fd为即将映射到进程空间的文件描述字,一般由open()返回,同时,fd可以指定为-1 ,此时须指定flags参数中的MAP_ANON,表明进行的是匿名映射(不涉及具体的文件名,避免了文件的创建及打开,很显然只能用于具有亲缘关系的进程间通信)。
--len是映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起。prot参数指定共享内存的访问权限。可取如下几个值的或:PROT_READ(可读),PROT_WRITE(可写),PROT_EXEC(可执行),PROT_NONE(不可访问)。
--flags由以下几个常值指定:MAP_SHARED, MAP_PRIVATE, MAP_FIXED。其中, MAP_SHARED,MAP_PRIVATE必选其一,而MAP_FIXED则不推荐使用。如果指定为MAP_SHARED,则对映射的内存所做的修改同样影响到文件,如果是父子进程的话就可以共享内存。如果是MAP_PRIVATE,则对映射的内存所做的修改仅对该进程可见,对文件没有影响。
--offset参数一般设为0,表示从文件头开始映射。
--参数addr指定文件应被映射到进程空间的起始地址,一般被指定一个空指针,此时选择起始地址的任务留给内核来完成。
函数的返回值为最后文件映射到进程空间的地址,进程可直接操作起始地址为该值的有效地址。
看看下面这个图(来自《Unix Netword programming》卷二12.2节),对mmap进一步加深印 象:
原文地址:http://blog.myspace.cn/e/402330998.htm
分享到:
相关推荐
### mmap的使用说明:深入解析PACKET_MMAP的实现与应用 #### 一、PACKET_MMAP概述 在深入探讨mmap技术之前,我们先理解一下PACKET_MMAP的背景和作用。PACKET_MMAP是一种高级网络编程技术,主要用于提高数据包捕获...
标题中的“mmap打开工具快速安装”指的是使用特定软件(如MindManager)来处理和查看mmap文件。mmap,全称Memory-Mapped File,是一种内存映射文件的技术,允许程序将文件的内容直接映射到内存空间,以便高效地读写...
下面我们将通过代码示例来详细介绍mmap的使用和原理。 mmap的基本概念 mmap是一种将文件映射到进程地址空间的机制,通过这个机制,多个进程可以共享同一个文件的内容。mmap的基本思路是将文件映射到进程地址空间中...
深入解析Windows操作系统.mmap
标题中的"ShareMem(mmap)"指的是在Android平台上,使用JNI(Java Native Interface)与C/C++原生代码交互时,实现内存共享的一种方法。这里提到的mmap是操作系统的内存映射函数,它允许程序将文件或者设备的存储区域...
《mmap内核驱动与应用程序详解》 在操作系统中,mmap(Memory Mapped File)是一种高效的数据交换机制,它允许应用程序直接通过内存地址访问文件,而无需通过传统的读写系统调用来拷贝数据。这种方式极大地提高了I/...
《mmap技术在实现cp功能中的应用》 在IT领域,高效的数据处理是至关重要的,尤其是在处理大量数据时。本文将深入探讨一个名为"mmcp"的工具,它利用mmap(Memory Mapped Files,映射文件到内存)技术来实现文件复制...
通过以上介绍,我们可以看到`mmap`不仅是文件映射的强大工具,也是实现设备驱动程序中的内存映射功能的关键技术。掌握好`mmap`的相关知识对于深入理解Linux系统的内存管理和设备驱动开发都是非常有益的。
在linux环境下,用c语言编写的关于mmap使用方法的小程序
内存映射(mmap)是Linux系统中一种高效的数据访问技术,它允许程序直接通过内存地址来访问文件,而无需经过传统的I/O操作。这种方式极大地优化了大文件处理的性能,因为它减少了磁盘I/O的次数,提高了数据的吞吐量...
Vue.mmap笔记
**mmap-record-android** 是一个开源项目,其主要目的是提供一种在Android平台上进行持久化存储的方法,灵感来源于xlog技术。mmap-record-android利用了内存映射(Memory-Mapped Files,简称mmap)这一功能,它允许...
在Linux和UNIX系统中,mmap(映射内存)是一种高效的数据访问机制,它允许将文件或者其他输入输出源直接映射到进程的地址空间中,从而实现文件内容与内存的直接交互。这种方式避免了传统的I/O操作,如read和write...
MATLAB的mmap工具包是用于高效数据处理和分析的一个扩展功能,它允许用户将大文件映射到内存,从而可以快速访问和操作这些文件,而无需实际读入整个文件到内存。这种方式对于处理大数据集非常有用,因为它减少了对...
标题"Mmap2mm一拖得win"涉及到的是一个转换工具,用于将MindManager创建的.mmap格式思维导图文件转换成FreeMind支持的.mm格式。这个工具特别适用于Windows用户,因为描述中提到“目前只能在Windows上使用”。 ...
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)...
Linux中的mmap(内存映射)是一种高效的数据访问机制,它允许将文件或者其他对象直接映射到进程的虚拟内存空间中,使得程序可以直接通过内存访问这些数据,而无需调用read和write等I/O函数。这种方法可以提高I/O操作...
### Linux Zero Copy mmap #### 概述 零拷贝(Zero Copy)技术是现代操作系统中一项重要的优化技术,主要用于减少数据在不同内存区域之间的复制次数,从而提高系统的整体性能。在Linux系统中,mmap机制作为一种...
有时候,应用层需要直接访问物理地址,这时应用层就需要调用应用层mmap接口继而调用驱动层的mmap接口将希望的物理地址映射成用户态能访问的虚拟地址。由于操作系统事先并没有创建这块物理地址与虚拟地址的映射关系,...
Docker2022.mmap