研究-Buffered IO和Direct IO

本文详细解析了BufferedIO和DirectIO的工作原理及区别,通过实例说明了两者在磁盘读写过程中的作用,特别关注Linux环境下DirectIO与异步I/O的结合使用,以及对Nginx性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:https://blog.youkuaiyun.com/batmannolove/article/details/50435597

今天在看[《Computer Systems - A Programmer's Perspective》] [4] 时,发现两个名词不是很理解,如下:
-   write through  
-   write  back
查了一下,发现其实就是Buffered IO和Direct IO。  这两者有何区别呢?

打个比方:正常情况下磁盘上有个文件,如何操作它呢?

- 读取:硬盘->内核缓冲区->用户缓冲区
- 写回:用户缓冲区->内核缓冲区->硬盘

这里的内核缓冲区指的是page cache,说白了,也就是是DRAM。主要作用是它用于缓存文件内容,从而加快对磁盘上映像和数据的访问。

正常的系统调用read/write的流程是怎样的呢?
- 读取:硬盘->内核缓冲区->用户缓冲区;
- 写回:数据会从用户地址空间拷贝到操作系统内核地址空间的页缓存中去,这是write就会直接返回,操作系统会在恰当的时机写入磁盘,这就是传说中的Buffered IO。

然而对于[自缓存应用程序] [2]来说,缓存 I/O 明显不是一个好的选择。因此出现了DIRECT IO。然而想象一下,不经内核缓冲区,直接写磁盘,必然会引起阻塞。所以通常DIRECT IO与AIO会一起出现。
>Linux 异步 I/O 是 Linux 2.6 中的一个标准特性,其本质思想就是进程发出数据传输请求之后,进程不会被阻塞,也不用等待任何操作完成,进程可以在数据传输的时候继续执行其他的操作。相对于同步访问文件的方式来说,异步访问文件的方式可以提高应用程序的效率,并且提高系统资源利用率。直接 I/O 经常会和异步访问文件的方式结合在一起使用。

对于nginx来说,是否开启AIO要看具体使用场景:
-  正常写入文件往往是写入内存就直接返回,因此目前nginx仅支持在读取文件时使用异步IO。
-  由于linux AIO仅支持DIRECT IO,AIO一定回去从磁盘上读取文件。所以从阻塞worker进程的角度上来说有一定的好处,但是对于单个请求来说速度是降低了的。
>异步文件I/O是把“双刃剑”,关键要看使用场景,如果大部分用户的请求落到文件缓冲中,那么不要使用异步 I/O,反之则可以试着使用异步I/O,看一下是否会为服务带来并发能力上的提升。 -- [<<深入理解NGINX>> 陶辉著] [1]
 
mmap  
mmap系统调用是将硬盘文件映射到用内存中,其实就是将page cache中的页直接映射到用户进程地址空间中,从而进程可以直接访问自身地址空间的虚拟地址来访问page cache中的页,从而省去了内核空间到用户空间的copy。

参考资料:  
[Linux 中直接 I/O 机制的介绍] [3]  
[<<深入理解NGINX>> 陶辉著] [1]
    
[1]: http://book.douban.com/subject/22793675/
[2]: http://www.ibm.com/developerworks/cn/linux/l-cn-directio/#major1
[3]: http://www.ibm.com/developerworks/cn/linux/l-cn-directio/
[4]: http://book.douban.com/subject/1896753/
————————————————
版权声明:本文为优快云博主「batmannolove」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/batmannolove/article/details/50435597

<think>好的,我现在需要回答用户关于直接IO与非直接IO在计算机系统中的区别的问题。首先,我需要回忆一下这两种IO模式的基本概念,然后找出它们的主要区别点。 直接IODirect IO缓冲IOBuffered IO,即非直接IO)的主要区别应该在于数据是否经过操作系统的页缓存。直接IO绕过了页缓存,直接将数据从应用程序的缓冲区传输到存储设备,或者反之。而非直接IO则会利用操作系统的缓存机制,数据先被复制到内核的页缓存中,再由内核管理写入磁盘或读取到用户空间。这点在引用[1]中提到内存映射文件时,也涉及到了减少系统调用的次数,因为数据可能已经在内存中,但直接IO的情况不同,它每次操作都需要直接访问磁盘,可能增加系统调用次数? 接下来需要考虑性能方面。直接IO由于跳过了缓存,可能在处理大文件或需要频繁读写时减少内存占用,因为不需要在缓存中保留副本。但这也可能导致更多的磁盘操作,如果应用程序没有有效的缓存策略,可能会降低性能。而非直接IO利用系统缓存,对于重复访问的数据会更高效,但可能增加内存的使用量,尤其是处理大文件时,缓存可能占用较多内存。 数据一致性方面,直接IO由于直接写入磁盘,可以确保数据立即持久化,适合对数据一致性要求高的场景,如数据库事务日志。而非直接IO的数据可能暂时留在缓存中,由内核异步写入磁盘,存在数据丢失的风险,比如系统崩溃时未写入的数据会丢失。 对齐大小限制方面,直接IO通常要求数据缓冲区内存对齐,并且传输大小符合磁盘块大小的倍数,否则可能导致错误或性能下降。而非直接IO没有这样的限制,因为内核会处理这些细节。 适用场景的话,直接IO适合需要自己管理缓存的应用,比如数据库系统,它们可能有自己的缓存机制来优化性能。而非直接IO适合大多数通用应用,利用系统缓存提高性能,简化开发。 引用[3]中提到的轻量级网络实时推理的问题,可能IO性能有关,但用户的问题更偏向存储IO,所以可能关联不大。引用[1]提到的内存映射文件属于另一种机制,但对比中提到的减少系统调用可能间接说明缓冲IO的优势,而直接IO需要更多系统调用。 需要确认这些点是否正确,比如直接IO是否真的每次操作都触发系统调用,或者是否绕过页缓存。另外,是否有其他区别,比如文件系统的元数据操作是否受影响,或者权限设置的不同? 总结下来,直接IO与非直接IO的主要区别点包括:缓存使用、性能影响、数据一致性、对齐要求、适用场景。需要将这些点组织成结构清晰的回答,并引用相关资料支持。用户提供的引用中,引用[1]提到内存映射文件的优势在于减少系统调用,但直接IO可能在这方面表现不同,需要明确说明。</think>直接IO与非直接IO在计算机系统中的核心区别主要体现在数据缓存机制访问方式上,以下从五个维度进行对比分析: 1. **缓存机制** - **直接IO (Direct IO)**:完全绕过操作系统页缓存,数据直接在应用缓冲区与存储设备间传输。例如数据库系统通过`O_DIRECT`标志打开文件时,写入日志文件会直接落盘[^1]。 - **非直接IO (Buffered IO)**:依赖操作系统页缓存,数据需经过内核缓冲区复制。如文本编辑器保存文件时,数据先写入内核缓存,再由后台线程异步刷盘。 2. **性能表现** - **直接IO**:适合大规模连续读写场景,减少内存拷贝开销。但当应用缺乏缓存策略时,频繁小规模IO会因缺失缓存加速导致性能下降。 - **非直接IO**:利用页缓存实现「预读取」「延迟写入」,对重复访问数据性能更优。例如Web服务器访问静态资源文件时,热数据可长期驻留内存加速响应。 3. **数据一致性** - **直接IO**:数据写入立即持久化到磁盘,满足强一致性需求。如金融交易系统使用直接IO确保每笔交易记录不丢失。 - **非直接IO**:数据可能在内核缓存中停留数秒,系统崩溃时存在丢失风险。需调用`fsync()`强制刷盘才能实现持久化。 4. **使用约束** - **直接IO**:需满足内存对齐要求(如512字节边界对齐)IO大小限制(如4KB整数倍),否则触发`EINVAL`错误。代码示例: ```c char *buf = memalign(512, 4096); // 内存对齐分配 int fd = open("data.bin", O_RDWR | O_DIRECT); read(fd, buf, 4096); // 必须为磁盘块大小整数倍 ``` - **非直接IO**:无特殊限制,由内核自动处理未对齐或非常规大小的IO请求。 5. **典型应用场景** - **直接IO**:数据库管理系统(MySQL InnoDB日志文件)、科学计算大文件处理。 - **非直接IO**:通用文件操作(文档编辑、配置文件加载)、需要利用系统缓存提升性能的场景。 : 引用[1]指出内存映射文件通过减少系统调用提升性能,而直接IO虽然需要更多系统调用,但通过消除缓存复制开销,在特定场景下仍可达到更高吞吐量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值