博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mmap学习
阅读量:6982 次
发布时间:2019-06-27

本文共 1203 字,大约阅读时间需要 4 分钟。

内存页:

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,解除一个映射关系。

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

例子

比如这个例子是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://www.cnblogs.com/yjf512/p/3171056.html,如需转载请自行联系原作者

你可能感兴趣的文章
JavaScript学习总结一(String对象的用法)
查看>>
lintcode:背包问题II
查看>>
处理手势冲突和错乱的一点经验
查看>>
Struts2防止表单重复提交
查看>>
[转]Python格式化输出
查看>>
在Activity中响应ListView内部按钮的点击事件
查看>>
CSS - 修改input - placeholder 和 readonly 的样式
查看>>
常用UI布局
查看>>
在多线程情况下 局部变量与全局变量 哪个比较安全呢
查看>>
算法评测
查看>>
40款非常酷的国外创意名片设计欣赏
查看>>
RadioGroup单选按钮用法
查看>>
POJ 2773 Happy 2006
查看>>
UBIFS介绍 - MTD网站
查看>>
如何使用ITEXTSHARP将HTML代码字符串写进PDF
查看>>
Oracle SQL CPU占用高
查看>>
mongodb简介与增删该查
查看>>
Maya 2015 中英文切换
查看>>
C语言的字符串分割
查看>>
Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE
查看>>