1.mmap
mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。
mmap()函数返回一个指针ptr,它指向进程虚拟地址空间的一个地址,这样进程就可以直接通过ptr对文件进行读写。
另外建立映射时并没有数据拷贝,此时和物理内存无关。只有操作ptr进行数据读写的时候,才会把数据读写到物理内存。
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
参数addr表示使用某个特定的内存地址(当前进程的某个虚拟地址),通常传NULL。
参数length表示映射的内存长度。
参数prot用于设置访问这段内存的权限。包括:PROT_EXEC(执行)、PROT_READ(读取)、 PROT_WRITE(写入)、 PROT_NONE(不可访问)。
参数flags用于控制程序对内存段改变的影响。
int msync ( void * addr, size_t len, int flags)
进程在映射空间的对共享内容的改变并不直接写回到磁盘文件中,往往在调用munmap()后才执行该操作。可以通过调用msync()函数来实现磁盘文件内容与共享内存区中的内容一致,即同步操作。
内存段需要同步的部分由addr和len确定。flags参数控制修改的具体方式,可用的值为:MS_ASYNC(异步写入)/MS_SYNC(同步写入)/MS_INVALIDATE(从文件中读回数据)。
int munmap(void *addr, size_t length);
该函数用于解除映射关系,释放内存段。
2.问题
问题1: