mmap()系统调用在调用进程的虚拟地址空间中建立一个新的内存映射。munmap()系统调用执行逆操做,即从进程的地址空间删除一个映射。html
映射能够分为两种:基于文件的映射和匿名映射。文件映射将一个文件区域中的内容映射到进程的虚拟地址空间中。匿名映射(经过使用MAP_ANONYMOUS)标记或映射/dev/zero来建立)并无对应的文件区域,该映射中的字节会被初始化为0。ui
映射既能够是私有的(MAP_PRIVATE),也能够是共享的(MAP_SHARED)。这种差异肯定了在共享内存上发生的变动的可见性,对于文件映射来说,这种差异还肯定了内核是否会将映射内容上发生的变动传递到底层文件上。当一个进程使用MAP_PAIVATE映射一个文件以后,在映射内容上发生的变动对其余进程是不可见的,而且也不会反应到映射文件上。MAP_SHARED文件映射的作法则相反——在映射上发生的变动对其余进程可见而且会反应到映射文件上。.net
尽管内核会自动地将发生在一个MAP_SHARED映射内容上的变动反应到底层文件上(pdflush线程),但它不保证合适完成这个操做。应用程序可使用msync()系统调用来显示地控制一个映射内容什么时候与映射文件进行同步。线程
内存映射有多种用途:unix
在访问一个映射的内容时可能会遇到两个信号。若是在访问映射时违反了映射之上的保护规则(或访问一个当前未被映射的地址),那么就会产生一个SIGSEGV信号。对于基于文件的映射来说,若是访问的映射部分在文件中没有相关区域与之对应(即映射大于底层文件,但仍算映射了,而不是未映射),那么就会产生一个SIGBUS信号。htm
交换空间过分利用容许系统给进程分配比实际可用的RAM与交换空间之和更多的内存。过分利用之因此多是由于全部进程都不会所有用完为其分配的内存。使用MAP_NORESERVE标记能够控制每一个mmap()调用的过分利用状况,而是用/proc文件则能够控制整个系统的过分利用状况。blog
mremap()系统调用容许调整一个既有映射的大小。remap_file_pages()系统调用容许建立非线性文件映射。进程
对于mmap()映射文件和read()文件来讲,read()在读次数少的状况下比mmap()快。由于虽然mmap()不须要read()的那一次内存拷贝,可是硬件的发展,使得内存拷贝消耗时间极大下降了。并且mmap()的开销在于缺页中断,处理任务比较多。而且,mmap以后,再有读操做不会通过系统调用,因此在LRU比较最近使用的页时并不占优点,容易被换出内存。因此,普通读的状况下(排除反复读),read()一般比mmap()来得更快。内存
关于mmap,这里有一张图挺有意思的:mmap 文件映射内存详解 。rem