2012年(1008)
分类:
2012-08-01 11:18:06
原文地址:内存映射 作者:luozhiyong131
内存映射函数提供了把文件内容映射到用户程序空间的方法。
#include
void * mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *start, size_t length); //取消映射
start: 指定映射地址,一般为NULL,表示由mmap自定地址,映射成功后该地址会返回。
length: 映射的文件内容长度。
prot: 指定内存块的保护状态(如下,可组合使用)
PROT_EXEC 区域可执行
PROT_READ 区域可读
PROT_WRITE 区域可写
flags: 映射对象的类型(MAP_PRIVATE 和MAP_SHARED必须指定一个)
MAP_FIXED 如start地址不能用于映射,则调用失败,不建议用
MAP_SHARED 与其它进程共享该映射
MAP_PRIVATE 创建一个私有的“写入时复制(copy on write)”的映射,对映射区域所作的任何修改都不会写回原文件
MAP_ANONYMOUS,MAP_ANON 建立匿名映射,此时忽略fd,不涉及文件由系统创建映射,区域初始化为0,一般用于某些系统扩展堆用,也可用于多任务将共享数据而不创建文件。
fd: 文件描述符,表示欲映射到内存的文件。
offset: 文件映射的偏移量,通常为0,表示从文件头开始映射。
返回:出错返回-1,成功返回映射地址。
锁定和解锁内存
内存锁定函数允许进程锁定它的一些或全部内存,要求它们不被交换出内存,以提供应用程序的性能,因为系统繁忙时这可避免频繁分页交换。
#include
int mlock(const void *addr, size_t len);
int munlock(const void *addr, size_t len);
int mlockall(int flags);
int munlockall(void);
addr, len须在页边界上,addr指明将要锁定的内存页面,len确定锁定区域的大小(即一次调用锁定一个或多个页面),返回0表示成功锁定,munlock解锁锁定的内存页以便其能重新可进行交换。
mlockall锁定进程的整个存储空间(代码,数据,栈,共享库,共享内存,共享映射内存),参数flags可取MCL_CURRENT表示当前虚拟地址空间,MCL_FUTURE将来调入的虚拟内存空间也将被锁定。
munlockall全部解锁。
注:子进程不能继承父进程的锁定特性。