当前位置--> 首 页 --> 文 章 -->Linux Develop

※阅读文章※

Linux程式设计-13.记忆体对映mmap


作者:不祥 [文章出自: www.fanqiang.com]

Linux允许将档案对映到记忆体空间中。如此可以产生一个在档案资料及记忆体资料一对一的对映,例如字型档的存取。使用记忆体对映有许多好处: 
高速档案存取。一般的I/O机制通常需要将资料先到缓区中。记忆体对映免去了中间这一层,加速档案存取速度。 
可执行档可对映到记忆体空间中,使程式动态载入。Linux Dynamic Loading便是如此实作出来的。 
新的记忆体可以透过利用/dev/zero来产生全零的档案。 
新的记忆体可以用於执行目的,这对解译式编译器非常有用。 
可把档案当成记忆体来用,直接使用指标来操作。 
对映的记忆体可当成行程间共享记忆体,该记忆体内容存在档案中,因此与行程无关。 

--------------------------------------------------------------------------------

页对齐「Page Alignment」 
#include  
size_t getpagesize(void); 

系统记忆体通常被分割成页的单位。在Intel及SPARC上,每页为4096 Bytes(4K),在Alpha上则为8192 Bytes(8K)。getpagesize返回该系统的页大小。 



--------------------------------------------------------------------------------

#include  
#include  
void  *  mmap(void  *start,  size_t length, int prot , int flags, int fd, off_t offset); 
int munmap(void *start, size_t length); 

mmap开启记忆体对映。 

start指定记忆体位置,通常都是用NULL。offset指定档案要在那里开始对映,通常都是用0。 

protections 

PROT_READ 
PROT_WRITE 
PROT_EXEC 
PROT_NONE 

flags 
MAP_FIXED 
MAP_PRIVATE 
MAP_SHARED 

MAP_ANONYMOUS 
MAP_DENYWRITE 
MAP_GROWSDOWN 
MAP_LOCKED 

munmap关闭记忆体对映。 



--------------------------------------------------------------------------------

int msync(const void *start, size_t length, int flags); 
如果开启记忆体对映是希望写入档案中,那麽修改过的记忆体会在一段时间内与档案稍稍有点不同。如果您希望立即将资料写入档案中,可使用msync。 

start为记忆体开始位置,length为长度。 

flags则有三个: 
MS_ASYNC : 请Kernel快将资料写入。 
MS_SYNC : 在msync结束返回前,将资料写入。 
MS_INVALIDATE : 让核心自行决定是否写入,仅在特殊状况下使用。 



--------------------------------------------------------------------------------

int mlock(const void *addr, size_t len); 
int munlock(const void *addr, size_t len); 
锁住记忆体,仅root有权限这样做。 



--------------------------------------------------------------------------------

int mlockall(int flags); 
锁住所有记忆体空间。 
MCL_CURRENT : 所有的记忆页都会被锁住。 
MCL_FUTURE : 所有的新增的记忆页都会被锁住。 

int munlockall(void); 


文章加入时间: 2004-11-17 14:56:33 责任编辑: w9   (2639 人次查阅)
 
Copyright © 1998-2004 中国PHP联盟 All rights reserved.