|
UNIX 提供一个有用的设备,允许程序共享内存;一个好消息是,在 2.0 以后的 Linux 内核中已经包含有这个工具。mmap (for memory map 内存映射)函数 设置内存中的段可以被两个或多个程序读取或写入。一个程序所作的改变可以被其它人看到。
你可以使用相同的设备去操作文件。你可以使一个磁盘文件的条目内容看起来像是内存中的一个数组。如果文件包括的记录可以被 C 结构体所描述,那么你可以使用结构体数组访问来更新这个文件。
通过使用特别权限设置的虚拟内存段使得这看起来是可能的。读取或写入一个段引起操作系统去读或写一个磁盘文件的相应的部分。
mmap 函数创建一个内存区域指针,这个区域关联着可以通过打开文件描述符访问的文件的内容。
用法:#include <sys/mman.h>
void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
参数 fildes 是打开的文件描述符,mmap() 就是通过这个文件描述符对打开的文件进行内存映射。
参数 addr 用来指定所映射的内存起始地址,但从移植性的角度出发,建议此值设为 0 ,毕竟不同的系统,可用的虚拟地址范围是不同的。
参数 len 表示要映射多大的内存空间
参数 off 用来指示对映射空间的定位。
prot 参数用来设置内存段(memory segment)访问权限,这些值可用来 OR 运算:
PROT_READ : 段可读
PROT_WRITE : 段可写
PROT_EXEC : 段可执行
PROT_NONE : 段不能访问
通过程序在别处的反映,flags 参数控制内存段做怎样的改变。这些选项如下:
MAP_PRIVATE 段为私有,只能由本程序可见,其他进程不可见。
MAP_SHARED 共享给其他的进程,其他进程对此段可见。
MAP_FIXED 段必须在给定的地址上(addr)
msync 函数引起写回(或从中读取)到映射文件中的内存段的部分或全部改变。
#include <sys/mman.h>
int msync(void *addr, size_t len, int flags);
通过传递的开始地址(addr)和长度(len)就能确定需要更新的那部分段。使用以下选项,flags 参数控制更新应该如何进行:
MS_ASYNC 执行异步写
MS_SYNC 执行同步写
MS_INVALIDATE 从文件中读回
nummap 函数释放内存段:
#include <sys/mman.h>
int munmap(void *addr, size_t len); |
|