mmap 作为 Linux 内存管理的关键之一
一.mmap 系统调用
1.mmap 系统调用
mmap 将一个文件或者其它对象映射进内存。文件被映射到多个
页上,如果文件的大小不是所有页的大小之和,最后一个页不被使
用的空间将会清零。munmap 执行相反的操作,删除特定地址区域的
对象映射。
当使用 mmap 映射文件到进程后,就可以直接操作这段虚拟地址
进行文件的读写等操作,不必再调用 read,wri(te)等系统调用.但
需注意,直接对该段内存写时不会写入超过当前文件大小的内容.
采用共享内存通信的一个显而易见的好处是效率高,因为进程
可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息
队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,
而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另
一次从共享内存区到输出文件。实际上,进程之间在共享内存时,
并不总是读写少量数据后就解除映射,有新的通信时,再重新建立
共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数
据内容一直保存在共享内存中,并没有写回文件。共享内存中的内
容往往是在解除映射时才写回文件的。因此,采用共享内存的通信
方式效率是非常高的。
基于文件的映射,在 mmap 和 munmap 执行过程的任何时刻,被
映射文件的 st_a(ti)me 可能被更新。如果 st_aTIme 字段在前述
的情况下没有得到更新,首次对映射区的第一个页索引时会更新该
字段的值。用 PROT_WRITE 和 MAP_SHARED 标志建立起来的文件映
射,其 st_cTIme 和 st_mTIme 在对映射区写入之后,但在 msync()