1.  mmap

mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存地址,对文件的读写可以直接用指针而不需要read/write函数。
使用内存映像文件的另一个优点是可以共享数据。如果多个进程需要访问同样的数据,这些数据就可以保存在一个内存映像文件中,所有的进程都可以访问它(进程间通信)。作为一种高效的共享内存模型,内存映像文件能够向任何进程独立地提供数据访问,并且把内存区的内容保存在一个磁盘文件中。如果选择这样的方式使用内存映像文件,还要对内存中的数据采取一种串行访问(serializing access)的方法,以保证统一的、可预测的读写操作。串行访问是指使用锁或信号灯(或者某些其他机制)来避免多个进程同时访问数据。在这种情况下,使用共享内存可能会更简单一些。

mmap缺点:1)耗内存,碎片。2)普通文件。
    优点:1)map速度快。 2)可原子访问任一字节,不用担心offset。

#include <sys/mman.h>
void *mmap(void *addr, size_t len, int prot, int flag, int fd, off_t off);
int munmap(void *addr, size_t len);
addr:NULL,内核会自己在进程地址空间中选项合适的地址建立映射。
len:不超过文件长度,否则总线错误。
prot:PROT_READ,PROT_WRITE, PROT_NONE, PROT_EXEC
flag:MAP_SHARED, MAP_PRIVATE, MAP_ANON
     MAP_SHARED映射区unmap时,修改会回写磁盘文件。
     MAP_PRIVATE不回写磁盘文件。
     MAP_ANON(匿名区)纯内存区,不依赖任何文件。
off:文件起始偏移。

mmap映射的内存空间位于heap和stack之间(用户空间)。

成功返回空间地址,失败返回MAP_FAILED(=>(void *)-1)

PROT_EXEC要求fd必须可读RDONLY,PROT_WRITE要求fd必须O_RDWR。

map回写磁盘时直接从用户空间拷贝数据到磁盘,节省回写时间。
常规拷贝时需要从用户空间拷贝数据到内核,然后内核回写磁盘。

匿名映射:
char *p = mmap(NULL, 100, PROT_WRITE|PROT_READ, MAP_SHARED, -1, 0);
fd = -1代表与文件无关。

应用mmap()时,mmap()调用完后可关闭fd。
fd关闭并不影响该文件已建立的映射,仍然可以对文件进行读写。

可用strace命令执行程序,跟踪程序执行过程中用到的所有系统调用的参数及返回值。

举例:cat的一种不完善实现

include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h> void err_quit(char *msg)
{
perror(msg);
exit(EXIT_FAILURE);
} int main(int argc, char *argv[])
{
int fdin;
char *src;
struct stat statbuf;
off_t len;
if(argc != )
{
printf("USAGE: mmcat {file}\n");
exit(EXIT_FAILURE);
} if((fdin = open(argv[], O_RDONLY)) < )
{
err_quit("open");
} if((fstat(fdin, &statbuf)) < )
{
err_quit("fstat");
} len = statbuf.st_size; if((src = mmap(, len, PROT_READ, MAP_SHARED, fdin, )) == \
(void *) -)
{
err_quit("mmap");
} printf("%s", src); close(fdin); munmap(src, len); return ;
}

在要求高度安全性的情况下,内存映像也极具价值。因为具有超级用户权限的程序能够把内存映射锁定在内存中,不让它们因linux的内存管理机制而被交换到磁盘上,类似口令文件这样的敏感数据就不太会被扫描程序探测到。当然,在这种场合下,内存区应该被设置为PROT_NONE,这样其他进程就不能读这块内存区了。

内存映射文件mmap的更多相关文章

  1. python标准库基础之mmap:内存映射文件

    #作用:建立内存映射文件而不是直接读取内容文本信息内容:如下(名称是text.txt) Lorem ipsum dolor sit amet, consectetuer adipiscing elit ...

  2. mmap:内存映射文件

    介绍 建立一个文件的内存映射将使用操作系统虚拟内存来直接访问文件系统上的数据,而不是使用常规的I/O函数访问数据. 内存映射通常可以提高I/O性能,因为使用内存映射时,不需要对每一个访问都建立一个单独 ...

  3. NET 4 中 内存映射文件

    原文链接 : http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net- ...

  4. 内存映射文件(Memory-Mapped File)

    Java Memory-Mapped File所使用的内存分配在物理内存而不是JVM堆内存,且分配在OS内核. 1: 内存映射文件及其应用 - 实现一个简单的消息队列 / 计算机程序的思维逻辑 在一般 ...

  5. JAVA I/O(三)内存映射文件

    <Java编程思想>中对内存映射文件有详细的介绍,此处仅做简单记录和总结.内存映射文件允许创建和修改因为太大而不能放入内存的文件. 1. 内存映射文件简单实例 import java.io ...

  6. Linux下内存映射文件的用法简介

    由于项目需要,所以学习了一下Linux下内存映射文件的用法,在这里共享一下自己的收获,希望大家提出宝贵意见,进行交流. 简介: 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区 ...

  7. windows内存映射文件

    http://shushanyegui.duapp.com/?p=731 在描述内存映射文件之前 我们先来写一个系统通过I/O来读写磁盘文件的小程序 #include "stdafx.h&q ...

  8. JAVA NIO之浅谈内存映射文件原理与DirectMemory

    JAVA类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原 ...

  9. 【NIO】NIO之浅谈内存映射文件原理与DirectMemory

    Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原 ...

随机推荐

  1. 一些Office 365的问题收集

    1. 按照MS的最佳实践, 应该是先有本地域, 然后再有Office 365. 但是我们公司刚好相反, 于是按照前面的文章做完了硬关联, 但是现在发现对于那些原本就在Office 365上的用户的Pr ...

  2. PHP Static Self 的区别

    <?php class Human{ public static function whoami() { echo "来自父类的whoami"; } public stati ...

  3. php获取某年某月的天数 【转】

    function days_in_month($month, $year) { // calculate number of days in a month return $month == 2 ? ...

  4. PHP file_get_contents函数读取远程数据超时的解决方法

    PHP file_get_contents函数读取远程数据超时的解决方法 投稿:junjie 字体:[增加 减小] 类型:转载   这篇文章主要介绍了PHP file_get_contents函数读取 ...

  5. w win cmd VS broswer

    php -f Fetch data from db , use php without any bugs to analyse the data and read and write db, with ...

  6. mysqli_multi_query($link, $wsql)

    if (mysqli_multi_query($link, $wsql)) { do { if ($result = mysqli_store_result($link)) { mysqli_free ...

  7. storm-kafka-0.8-plus 源码解析

    https://github.com/wurstmeister/storm-kafka-0.8-plus http://blog.csdn.net/xeseo/article/details/1861 ...

  8. Hashtable、Dictionary和List 谁效率更高

    一 前言 很少接触HashTable晚上回来简单看了看,然后做一些增加和移除的操作,就想和List 与 Dictionary比较下存数据与取数据的差距,然后便有了如下的一此测试, 当然我测的方法可能不 ...

  9. nginx 反向代理 取得真实IP和域名

    nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递 ...

  10. Java实验报告二:Java面向对象程序设计

    Java实验报告二:Java面向对象程序设计                                                                               ...