内存映射 madvise mmap
2015-11-07 02:28
2999 查看
http://linux.die.net/man/2/madvise
mmap && madvise的配合使用
mmap和madvise一起使用例子
mmap && madvise的配合使用
mmap和madvise一起使用例子
mmap的作用是将硬盘文件的内容映射到内存中,采用闭链哈希建立的索引文件非常适合利用mmap的方式进行内存映射,利用mmap返回的地址指针就是索引文件在内存中的首地址,这样我们就可以放心大胆的访问这些内容了。 使用过mmap映射文件的同学会发现一个问题,search程序访问对应的内存映射时,处理query的时间会有latecny会陡升,究其原因是因为mmap只是建立了一个逻辑地址,linux的内存分配测试都是采用延迟分配的形式,也就是只有你真正去访问时采用分配物理内存页,并与逻辑地址建立映射,这也就是我们常说的缺页中断。 缺页中断分为两类,一种是内存缺页中断,这种的代表是malloc,利用malloc分配的内存只有在程序访问到得时候,内存才会分配;另外就是硬盘缺页中断,这种中断的代表就是mmap,利用mmap映射后的只是逻辑地址,当我们的程序访问时,内核会将硬盘中的文件内容读进物理内存页中,这里我们就会明白为什么mmap之后,访问内存中的数据延时会陡增。 出现问题解决问题,上述情况出现的原因本质上是mmap映射文件之后,实际并没有加载到内存中,要解决这个文件,需要我们进行索引的预加载,这里就会引出本文讲到的另一函数madvise,这个函数会传入一个地址指针,已经一个区间长度,madvise会向内核提供一个针对于于地址区间的I/O的建议,内核可能会采纳这个建议,会做一些预读的操作。例如MADV_SEQUENTIAL这个就表明顺序预读。 如果感觉这样还不给力,可以采用read操作,从mmap文件的首地址开始到最终位置,顺序的读取一遍,这样可以完全保证mmap后的数据全部load到内存中。
相关文章推荐
- explaining of genotyping and DNA resequencing and variant calling
- AVAYA完成北电企业网收购 30天内公布更多细节
- Java任意同类型对象的复制
- 北电收购Pingtel 志在统一通信
- 关于在storyboard中使用静态cell的注意事项
- 公钥与私钥
- eZuce推出纯软统一通信解决方案openUC
- SQL Interview Question
- Sipfoundry创始人-Martin J. Steinmann
- tomcat发布在阿里云上,优化JVM启动参数。。
- 关于presentViewController的后的background变黑的问题
- springmvc的Ajax提交问题
- Foundation框架- NSString用法
- oc必须知道的知识点
- Mysql学习笔记
- jenkins构建war失败 代码编译出现(illegal character: \65279)
- MySQL5.1 忘记root密码的解决方法
- 雅虎十四条:网站前端网页优化的14条原则
- 基因芯片和NGS的关系
- 微软远程桌面(安卓版)连接出现0x204错误的解决办法