| sendfile | mmap |
优点 | 1. 直接数据传输:可以直接将数据从一个文件描述符传输到另一个文件描述符 2. 性能优化:数据直接在内核空间传递,降低了CPU和内存带宽的消耗 3. 简单易用:单个系统调用即可完成数据传输,代码量少,可读性强 | 1. 高灵活性:将文件映射到进程的虚拟内存空间,允许应用程序直接通过内存访问文件内容,如果操作内存一样,灵活性强 2. 随机访问:对于需要频繁或不规则访问文件内容的场景,适用性强,运行直接操作内存,无需逐次文件读取 3. 简化内存管理:可避免大文件加载到用户空间时管理大块内存的复杂性,可以按需访问文件的任意部分 |
缺点 | 1. 灵活性较低:只能在文件描述符之间传输数据,不能直接操作内存中的数据 2. 错误处理复杂:文件读取或写入操作可能失败,而sendfile要处理这些异常情况比较复杂 3. 硬件依赖:在某些硬件架构或文件系统中,sendfile的性能优化效果不明显 | 1. 上下文切换成本:调用mmap涉及内核与用户空间的上下文切换,产生额外的开销 2. 缓存一致性问题:在多进程或多线程共享文件映射时,需要注意缓存一致性问题 3. 内存消耗:mmap映射大文件到内存时,需要占用大量虚拟内存地址空间和页表项,存在内存消耗风险 |
适用场景 | 文件上传、下载服务器:高效在文件描述符之间传输数据,减少CPU和内存开销 | 大文件处理和分析:文件映射到虚拟内存后,可以方便地随机访问和操作文件数据 |