研究-Buffered IO和Direct IO

http://m.blog.csdn.net/blog/bengda/21871413

格式不对,请看原文

今天在看[《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/

时间: 2024-11-05 12:31:50

研究-Buffered IO和Direct IO的相关文章

MMAP和DIRECT IO区别【转】

转自:http://www.cnblogs.com/zhaoyl/p/5901680.html 看完此文,题目不言自明.转自 http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用通俗易懂的视角去阐述.不copy内核代码. 阐述之前,要先有个大

MMAP和DIRECT IO区别

看完此文,题目不言自明.转自 http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用通俗易懂的视角去阐述.不copy内核代码. 阐述之前,要先有个大视角,让我们站在万米高空,鸟瞰我们的文件IO,它们设计是分层的,分层有2个好处,一是架构清晰,二

linux系统调用、buffered IO、unbuffered IO

1.什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用. Linux的系统调用作为c库的一部分提供,用户可以通过系统调用命令在自己的应用程序中调用它们. #include <linux/unistd.h> /* all system calls need this header */. 2.系统调用与一般库函数的区别 一般库函数始终运行在用户态,而系统调用要通过int 0x80语句陷入内核态,该系统调用实现的功能实际上是由对应的内核的函数来完成. 3.系统调

研究系统IO和glib IO的关系

PS:这里的缓冲与非缓冲的区别是相对于用户进程,下文的“非缓冲文件系统”指用户的程序没有缓冲区,不要误解为系统没有缓冲区. 1.缓冲文件系统缓 冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量.执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件.由此可以看出,内存 “缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的

bufferIO,Direct io,mmap, ZeroCopy

1 bufferIO(传统IO),Direct io(干掉内核cache),mmap(大数据映射),zeroCopy(网络IO) 2 linux 5种IO

阻塞IO,非阻塞IO,异步IO和非异步IO 的区别

最近在研究java IO.NIO.NIO2(或者称AIO)相关的东西,有些概念还是要明确下. 按照<Unix网络编程>的划分,IO模型可以分为:阻塞IO.非阻塞IO.IO复用.信号驱动IO和异步IO,按照POSIX标准来划分只分为两类:同步IO和异步IO. 如何区分呢?首先一个IO操作其实分成了两个步骤: 1.发起IO请求 2.实际的IO操作 阻塞和非阻塞IO:在于第一个步骤是否会会被阻塞,如果会则是阻塞IO,否则是非阻塞IO. 异步和非异步(同步)IO:在于第二个步骤是否会阻塞,如果实际的I

Java IO(一) 之 IO总览

前言: IO对于系统设计来说,是一个很重要的关注点,往往系统运行的瓶颈就在IO设计上,无论是数据库IO,文件IO还是网络IO,都需要进行精致的设计,才能使得系统达到最佳运行状态.对于现代系统并发量.数据量的剧增,IO处理对于系统显得更加重要.研究Java IO对于我们工作有益无害. Java.io包含了Java阻塞型IO的设计.Java的IO主要包含三个部分: 1.流式部分–IO的主体部分: 2.非流式部分–主要包含一些辅助流式部分的类,如:File类.RandomAccessFile类和Fil

高并发服务器---基础----IO模式和IO多路复用

转自:https://www.cnblogs.com/zingp/p/6863170.html 阅读目录 1 基础知识回顾 2 I/O模式 3 事件驱动编程模型 4 select/poll/epoll的区别及其Python示例 网络编程里常听到阻塞IO.非阻塞IO.同步IO.异步IO等概念,总听别人装13不如自己下来钻研一下.不过,搞清楚这些概念之前,还得先回顾一些基础的概念. 回到顶部 1 基础知识回顾 注意:咱们下面说的都是Linux环境下,跟Windows不一样哈~~~ 1.1 用户空间和

IO模式和IO多路复用

网络编程里常听到阻塞IO.非阻塞IO.同步IO.异步IO等概念,总听别人装13不如自己下来钻研一下.不过,搞清楚这些概念之前,还得先回顾一些基础的概念. 1 基础知识回顾 注意:咱们下面说的都是Linux环境下,跟Windows不一样哈~~~ 1.1 用户空间和内核空间 现在操作系统都采用虚拟寻址,处理器先产生一个虚拟地址,通过地址翻译成物理地址(内存的地址),再通过总线的传递,最后处理器拿到某个物理地址返回的字节. 对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作