zoukankan      html  css  js  c++  java
  • mmap学习

    mmap学习

    内存页:

    Linux是以页为单位来管理物理内存的,一页大小一般等于4096字节。页容量越大,系统中可能存在的内存碎片就越多。

    mmap将一个磁盘上的文件或者对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。

    当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用。

    采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。比如像管道和消息队列,需要在内核和用户空间进行四次的数据拷贝。

    mmap的系统操作有两个:

    1
    2
    3
    4
    5
    #include <sys/mman.h>
     
    void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
     
    int munmap(void *start, size_t length);

    第一个函数mmap,将文件描述符fd中的内容放到内存start --- ( start+ length) 的空间中。

    port: 期望的内存保护方式,比如内存可读/可写/可执行,但是不能与文件的打开模式冲突。就是只能是文件权限的子集。

    flag: 指定映射对象的类型

    fd: 被映射的文件描述符。

    第二个函数munmap,解除一个映射关系。

    这两个函数的说明文档在:

    http://man7.org/linux/man-pages/man2/mmap.2.html

    例子

    比如这个例子是php的apc使用了mmap:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #strace -p `cat /var/run/httpd.pid`
     
    open("/var/www/html/apc_load.php", O_RDONLY) = 13
     
    ...
     
    mmap2(NULL, 31457280, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, 1232, 0) = 0xb5ce7000
     
    ...
     
    nanosleep({3600, 0},

    mmap2() 系统调用执行的操作几乎与mmap(2) 一样,唯一的区别在于最后一个参数给出的在文件中的偏移是以4096-字节为单位。

    这个mmap就在内存中空出30M的空间做内存映射

    php的apc缓存加速

    php的apc大致原理是将php的opcode(php的操作码)使用mmap映射(就是复制)到共享内存中,然后下次用户再访问调用php访问,就可以直接去共享内存中读取,而不需要再到磁盘上读取了。

    当然当php文件更新的时候,opcode也会自动失效(有检测机制)。

    参考文章:

    http://blog.chinaunix.net/uid-26669729-id-3077015.html

    http://www.perfgeeks.com/?p=298

    http://www.searchtb.com/2010/12/php-opcode-cache.html

  • 相关阅读:
    FusionMap 检测融合基因
    嵌合体序列
    seqtk 的安装和使用
    cutadapt 的安装与使用
    C语言简单选择排序
    C语言冒泡排序
    Java实现的各种排序算法(包括冒泡,快排等)
    C++实现顺序计算输入表达式的值
    java多线程有几种实现方法?线程之间如何同步
    java中==与equal()方法的区别
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3171414.html
Copyright © 2011-2022 走看看