我读过这个线程,这很有洞察力 – mmap() vs. reading blocks
所以我的问题是,最有效的方式去读取(),mmap()或一些组合?设计理念欢迎.
TIA,
安德鲁
编辑:我的理解是,mmap基本上将文件加载到内存中,并将其加载到虚拟内存子系统中.在我看来,VMM将在大多数系统上进行高度优化,因为它对于系统性能至关重要.
解决方法
例如,如果您需要将整个文件向下移动几百个字节以插入ID3标签,则一个简单的方法是使用ftruncate()扩展文件,将文件缩小,然后将memmove()的内容缩小为位.但是,如果您的程序在运行时崩溃,则会毁坏该文件.您也可以将文件的内容复制到新文件中 – 这是另一个mmap()真正闪耀的地方;您可以简单地mmap()旧的文件,然后使用一个write()将其所有数据复制到新文件中.
简而言之,如果您在传输的总字节数方面做了大量的IO,那么mmap()很棒这是因为它减少了所需的副本数量,并且可以显着减少读取缓存数据所需的内核条目数.但是,mmap()需要至少两次内核访问(如果在完成之后清理映射,则需要三次),并执行一些复杂的内部内核计费,因此固定开销可能很高.
另一方面,read()涉及额外的内存到内存副本,因此对于大型I / O操作可能是低效的,但是很简单,因此固定开销相对较低.简而言之,对于大批量I / O,使用mmap()和read()或pread()来进行一次性小I / O.
原文地址:https://www.jb51.cc/c/112292.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。