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

  • 相关阅读:
    LintCode "Maximum Gap"
    LintCode "Wood Cut"
    LintCode "Expression Evaluation"
    LintCode "Find Peak Element II"
    LintCode "Remove Node in Binary Search Tree"
    LintCode "Delete Digits"
    LintCode "Binary Representation"
    LeetCode "Game of Life"
    LintCode "Coins in a Line"
    LintCode "Word Break"
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3171414.html
Copyright © 2011-2022 走看看