Linux IO中BIO和DIO【转】

摘要:
IO堆栈Linux 4.10.0的IO堆栈如下图所示:原始图像链接:https://www.thomas-krenn.com/en/wiki/Linux_Storage_Stack_Diagram#Diagram_for_Linux_Kernel_3.17缓存I/O缓存I/O也称为标准I/O。大多数文件系统的默认I/O操作是缓存I/O。在Linux的缓存I/O机制中,操作系统会将I/O数据缓存在文件系统的页面缓存中。数据将首先复制到操作系统内核的缓冲区,然后将从操作系统内核缓冲区复制到应用程序的地址空间。缓存I/O可以通过减少磁盘读取次数来提高性能。可以使用直接I/O技术。

转自:https://blog.csdn.net/notbaron/article/details/77823158

转自:
http://linuxperformance.top/index.php/archives/89/
Linux IO中BIO和DIO

Linux IO中BIO和DIO

块存储是使用块设备为系统提供存储服务。块设备将信息存储在固定大小的块中,每个块都有自己的地址。

通常情况下,是通过文件系统来访问块设备,也可以直接使用裸设备,通过指定偏移和大小来读写裸设备。常见的块存储设备就是物理磁盘,在Linux系统下,还提供基于其他块设备之上的逻辑设备,如Device Mapper,软RAID等。

    1. IO栈

      Linux 4.10.0的IO栈如下图:
      1.png
      原图链接:
      https://www.thomas-krenn.com/en/wiki/Linux_Storage_Stack_Diagram#Diagram_for_Linux_Kernel_3.17

    2. 缓存 I/O (Buffered I/O)

      缓存I/O又被称作标准I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page cache )中,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。有以下优点:
       缓存 I/O 使用了操作系统内核缓冲区,在一定程度上分离了应用程序空间和实际的物理设备。
       缓存 I/O 可以减少读盘的次数,从而提高性能。
      在缓存 I/O 机制中,DMA 方式可以将数据直接从磁盘读到页缓存中,或者将数据从页缓存直接写回到磁盘上,而不能直接在应用程序地址空间和磁盘之间进行数据传输,数据在传输过程中需要在应用程序地址空间和页缓存之间进行多次数据拷贝操作,带来的 CPU 以及内存开销是非常大的。
      对于某些特殊的应用程序来说,避开操作系统内核缓冲区而直接在应用程序地址空间和磁盘之间传输数据会比使用操作系统内核缓冲区获取更好的性能

    3. 直接I/O技术(Direct I/O)

      对于某些应用程序来说,它会有它自己的数据缓存机制,比如,它会将数据缓存在应用程序地址空间,这类应用程序完全不需要使用操作系统内核中的高速缓冲存储器,这类应用程序就被称作是自缓存应用程序( self-caching applications )。数据库管理系统是这类应用程序的一个代表。
      自缓存应用程序来说,缓存 I/O 明显不是一个好选择。可以使用直接 I/O(DIO) 技术。直接 I/O 技术非常适用于自缓存这类应用程序,该技术省略掉缓存 I/O 技术中操作系统内核缓冲区的使用,数据直接在应用程序地址空间和磁盘之间进行传输,从而使得自缓存应用程序可以省略掉复杂的系统级别的缓存结构,而执行程序自己定义的数据读写管理,从而降低系统级别的管理对应用程序访问数据的影响。

    4. 参考

      linux块设备IO栈浅析
      http://www.sysnote.org/2015/08/06/linux-io-stack/
      Linux 中直接 I/O 机制的介绍
      https://www.ibm.com/developerworks/cn/linux/l-cn-directio/
      Thomas-krenn—Linux I/O Stack
      https://www.thomas-krenn.com/en/wiki/Linux_Storage_Stack_Diagram#Diagram_for_Linux_Kernel_3.17
      一个IO的传奇一生
      http://alanwu.blog.51cto.com/3652632/1398744

免责声明:文章转载自《Linux IO中BIO和DIO【转】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇shell的for循环[Scala]Scala安装以及在IDEA中配置Scala下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

蜕变成蝶~Linux设备驱动之异步通知和异步I/O

在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问。因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代。异步通知类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步I/O"。 1、异步通知的概念和作用 影响:阻塞--应用程序无需轮询设备是否可以访问 非阻塞--中...

linux系统常用运维命令

目录/文件处理命令 mkdir dirname 创建文件夹 mkdir -p /tmp/a/b 递归创建目录 rm -rf dirname 删除目录及内部文件 -r:表示递归删除文件及文件夹;-f:表示强制删除,不提示 touch filename 创建文件 mv ins.war ins_new.war 重命名 mv ins.war webapps/ 移动...

Linux more命令详解

more功能类似cat,cat命令是整个文件的内容从上到下显示在屏幕上。more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按b键就会往回(back)一页显示,而且还有搜寻字串的功能。more命令从前向后读取文件,因此在启动时就加载整个文件。 1.命令格式: more[-dlfpcsu][-num][+/p...

linux下挂载NTFS分区错误修复

今天在linux下打开win的NTFS硬盘总是提示出错了,而且是全部的NTFS盘都出错,其中sda1错误显示如下: Error mounting /dev/sda1 at /media/wangbo/24F02EECF02EC3C0: Command-line `mount -t "ntfs" -o "uhelper=udisks2,nodev,nosui...

浅谈 linux 多线程编程和 windows 多线程编程的异同

原文:http://software.intel.com/zh-cn/blogs/2011/03/24/linux-windows/ 很早以前就想写写linux下多线程编程和windows下的多线程编程了,但是每当写时又不知道从哪个地方写起,怎样把自己知道的东西都写出来,下面我就谈谈linux多线程及线程同步,并将它和windows的多线程进行比较,看看他...

linux svn安装和配置

svn概述 众所周知,svn是一种集中式的版本控制工具,是cvs的改进版,那么svn相比cvs的好处在哪里呢? 基于目录的版本控制系统(传统的CVS都是基于单个文件进行版本控制的,而SVN可以随意去除任何一个文件、目录的任何一个历史版本) 原子提交(提交多个文件时,如果一个文件发生冲突,则其他修改都不会被提交) 高效的分支与标签 多种访问方式(svn提...