Linux内存映射


调用系统函数mmap()的进程,会在其虚拟地址空间中创建一个新的内存映射。

映射分为两类:

文件映射:将文件的部分区域映射入调用进程的虚拟内存。映射一旦完成,对文件映射内容的访问则转化为对相应内存区域的字节操作。映射页面会按需自动从文件中加载。

相映成趣的是并无文件与之相对应的匿名映射,其映射页面的内容会被初始化为0.

由某一进程所映射的内存可以与其他进程的映射共享。达成共享的方式有两种:一是两处进程都针对某一文件的相同部分加以映射,二是由fork()创建的子进程自父进程处继承映射。当两个或多个进程共计享的页面相同时,进程之一对页面内容的改动是否为其他进程所见呢?这取决于创建映射时所传入的标志参数。若传入标志为私有,则某进程对映射内容的修改对于其他进程是不可见的,而且这些改动也不会真实地落实到文件上;若传入标志为共享,对映射内容的修改就会为其它进程所见,并且这些修改也会造成对文件的改动。内存映射用途很多,其中包括:以可执行文件的相应段来初始化进程的文本段、内存(内容填充为0)分配、文件IO(即映射内存I/O)以及进程间通信(通过共享映射)。

相关内容