mmap和madvise的使用

mmap和madvise的使用

1.    madvise的简介
     
     madvise可以设置内存的分配方式或者说是分配的细节方式。具体参见linux man madvise。

2.  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到内存中。

      

      

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mmap和sendfile是两种在文件处理中常用的技术。 mmap是一种将文件映射到进程的地址空间的方法,它通过建立文件磁盘地址和进程虚拟地址空间的对应关系,实现了文件的访问。在使用mmap时,并没有分配和映射到具体的物理内存空间,而是在第一次加载文件时,通过MMU将虚拟地址转换为物理地址,并将文件加载到物理地址中的内核空间的Page Cache中。这样,进程可以直接通过访问内存的方式来读写文件,而不需要进行繁琐的文件IO操作。\[1\] sendfile是一种在网络编程中常用的方法,它可以将一个文件的内容直接发送到网络连接中,而无需将文件内容先拷贝到用户缓冲区再发送。sendfile利用了操作系统的DMA引擎,将磁盘文件数据直接映射到内核缓冲区,并与用户缓冲区共享同一块映射数据。这样,在建立映射后,就可以直接从内核缓冲区发送数据,减少了一次拷贝操作,提高了性能。总共需要4次切换和3次拷贝。\[3\] 所以,mmap和sendfile都是在文件处理中提高性能的技术,但它们的应用场景和使用方式有所不同。mmap适用于需要频繁读写文件的场景,而sendfile适用于需要将文件内容直接发送到网络连接的场景。 #### 引用[.reference_title] - *1* [Java 两种zero-copy零拷贝技术mmap和sendfile的介绍](https://blog.csdn.net/djdjdxieuej/article/details/128683165)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [零拷贝技术:mmap和sendfile](https://blog.csdn.net/lonelymanontheway/article/details/105888792)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值