您好、欢迎来到现金彩票网!
当前位置:2019正版免费全年资料 > 通道命令字 >

计算机原理-Linux中直接IO的机制原理

发布时间:2019-07-03 08:45 来源:未知 编辑:admin

  在介绍直接 I/O 之前,先来介绍下直接I/O这种机制产生的原因。毕竟已经有了缓存I/O(Buffered I/O),那肯定能够像到缓存I/O有缺陷吧,就按照这个思路来。

  缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page cache )中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。写的过程就是数据流反方向。缓存 I/O 有以下这些优点:

  缓存 I/O 使用了操作系统内核缓冲区,在一定程度上分离了应用程序空间和实际的物理设备。

  对于读操作:当应用程序要去读取某块数据的时候,如果这块数据已经在页缓存中,那就返回之。而不需要经过硬盘的读取操作了。如果这块数据不在页缓存中,就需要从硬盘中读取数据到页缓存。

  对于写操作:应用程序会将数据先写到页缓存中,数据是否会被立即写到磁盘,这取决于所采用的写操作机制:

  延迟机制:写接口立即返回,操作系统会定期地将页缓存中的数据刷到硬盘。所以这个机制会存在丢失数据的风险。想象下写接口返回的时候,页缓存的数据还没刷到硬盘,正好断电。对于应用程序来说,认为数据已经在硬盘中。

  在缓存I/O的机制中,以写操作为例,数据先从用户态拷贝到内核态中的页缓存中,然后又会从页缓存中写到磁盘中,这些拷贝操作带来的CPU以及内存的开销是非常大的。

  对于某些特殊的应用程序来说,能够绕开内核缓冲区能够获取更好的性能,这就是直接I/O出现的意义。

  凡是通过直接I/O方式进行数据传输,数据直接从用户态地址空间写入到磁盘中,直接跳过内核缓冲区。对于一些应用程序,例如:数据库。他们更倾向于自己的缓存机制,这样可以提供更好的缓冲机制提高数据库的读写性能。直接I/O写操作如上图所示。

  要在块设备中执行直接 I/O,进程必须在打开文件的时候设置对文件的访问模式为O_DIRECT,这样就等于告诉操作系统进程在接下来使用read() 或者write() 系统调用去读写文件的时候使用的是直接 I/O方式,所传输的数据均不经过操作系统内核缓存空间。使用直接 I/O读写数据必须要注意缓冲区对齐( buffer alignment )以及缓冲区的大小的问题,即对应 read() 以及 write() 系统调用的第二个和第三个参数。这里边说的对齐指的是文件系统块大小的对齐,缓冲区的大小也必须是该块大小的整数倍。

  下面主要介绍三个函数:open(),read() 以及 write()。Linux 中访问文件具有多样性,所以这三个函数对于处理不同的文件访问方式定义了不同的处理方法,本文主要介绍其与直接 I/O 方式相关的函数与功能.首先,先来看 open() 系统调用,其函数原型如下所示:

  当应用程序需要直接访问文件而不经过操作系统页高速缓冲存储器的时候,它打开文件的时候需要指定O_DIRECT标识符。

  操作系统内核中处理 open() 系统调用的内核函数是sys_open(),sys_open() 会调用do_sys_open() 去处理主要的打开操作。它主要做了三件事情:

  do_sys_open() 调用 get_unused_fd() 从进程的文件表中找到一个空闲的文件表指针,相应的新文件描述符就存放在本地变量 fd 中;

  函数 do_filp_open() 会根据传入的参数去执行相应的打开操作。

  下面列出了操作系统内核中处理 open() 系统调用的一个主要函数关系图。

  当文件打开时指定了O_DIRECT标识符,那么操作系统就会知道接下来对文件的读或者写操作都是要使用直接 I/O 方式的。

  下边我们来看一下当进程通过 read() 系统调用读取一个已经设置了 O_DIRECT 标识符的文件的时候,系统都做了哪些处理。 函数 read() 的原型如下所示:

  操作系统中处理 read() 函数的入口函数是 sys_read(),其主要的调用函数关系图如下:

  函数 sys_read() 从进程中获取文件描述符以及文件当前的操作位置后会调用 vfs_read() 函数去执行具体的操作过程,而 vfs_read() 函数最终是调用了 file 结构中的相关操作去完成文件的读操作,即调用了 generic_file_read() 函数,其代码如下所示:

  上边的代码段主要是检查了文件指针的值,文件的大小以及所请求读取的字节数目等,之后,该函数调用 generic_file_direct_io(),并将操作类型 READ,描述符 iocb,描述符 iovec,当前文件指针的值以及在描述符 io_vec 中指定的用户地址空间缓冲区的个数等值作为参数传给它。当 generic_file_direct_io() 函数执行完成,函数 __generic_file_aio_read()会继续执行去完成后续操作:更新文件指针,设置访问文件 i 节点的时间戳;这些操作全部执行完成以后,函数返回。 函数 generic_file_direct_IO() 会用到五个参数,各参数的含义如下所示:

  函数 generic_file_direct_IO() 对 WRITE 操作类型进行了一些特殊处理。除此之外,它主要是调用了 direct_IO 方法去执行直接 I/O 的读或者写操作。在进行直接 I/O 读操作之前,先将页缓存中的相关脏数据刷回到磁盘上去,这样做可以确保从磁盘上读到的是最新的数据。这里的 direct_IO 方法最终会对应到 __blockdev_direct_IO() 函数上去。__blockdev_direct_IO() 函数的代码如下所示:

  该函数将要读或者要写的数据进行拆分,并检查缓冲区对齐的情况。本文在前边介绍open() 函数的时候指出,使用直接 I/O 读写数据的时候必须要注意缓冲区对齐的问题,从上边的代码可以看出,缓冲区对齐的检查是在__blockdev_direct_IO() 函数里边进行的。用户地址空间的缓冲区可以通过 iov 数组中的 iovec 描述符确定。直接 I/O 的读操作或者写操作都是同步进行的,也就是说,函数__blockdev_direct_IO() 会一直等到所有的 I/O 操作都结束才会返回,因此,一旦应用程序 read() 系统调用返回,应用程序就可以访问用户地址空间中含有相应数据的缓冲区。但是,这种方法在应用程序读操作完成之前不能关闭应用程序,这将会导致关闭应用程序缓慢。

  最大的优点就是减少操作系统缓冲区和用户地址空间的拷贝次数。降低了CPU的开销,和内存带宽。对于某些应用程序来说简直是福音,将会大大提高性能。

  直接IO并不总能让人如意。直接IO的开销也很大,应用程序没有控制好读写,将会导致磁盘读写的效率低下。磁盘的读写是通过磁头的切换到不同的磁道上读取和写入数据,如果需要写入数据在磁盘位置相隔比较远,就会导致寻道的时间大大增加,写入读取的效率大大降低。

  直接IO方式确实能够减少CPU的使用率以及内存带宽的占用,但是有时候也会造成性能的影响。所以在使用直接IO之前一定要清楚它的原理,只有在各项都清晰的情况下,才考虑使用。本人只是介绍了原理,如想深入,建议参考内核相关文档。

  IO多路复用之select、poll、epoll详解 I/O多路复用机制(Epoll) 多路I/O复用模型是利用select、poll、epoll可以同时监察多个流的I/O事件的能力,在空闲的时候,会...博文来自:每天进步一点点

  深入理解Java字节I/O,字符I/O,字节流于字符流的区别,阻塞I/O的缺点,非阻塞I/O(NIO)工作机制...博文来自:void

  都说例子举的好,原理自然就能明白,上栗子:小曲在S城开了一家快递店,负责同城快送服务。小曲因为资金限制,雇佣了一批快递员,然后小曲发现资金不够了,只够买一辆车送快递。经营方式一客户每送来一份快递,小...博文来自:Talk is cheap,show me the code.

  1、复用的意思时不用每个进程/线程来操控单独的一个IO,只需一个进程/线、内核空间不能直接解引用用户态的指针。  select与pollselect传递fd_set*的指针,仍然需...博文来自:zhouguoqionghai的博客

  直接I/O的动机在介绍直接I/O之前,这一小节先介绍一下为什么会出现直接I/O这种机制...博文来自:scliu的博客

  Linux编程之IO多路复用(I/OMultiplexing)程序设计过程中有时候会对多个输入进行操作,例如标准输入或者多个socket。那么如果在对某个进行处理的时候阻塞住的话,另外的输入进来的话会...博文来自:Aaron的专栏

  一.阻塞操作阻塞操作是指在执行折本操作时,若不能获得自愿,则挂起进程直到满足可操作性的条件后在进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。假设recvfrom函...博文来自:The blog of TseJung

  写在前面:本系列文章主要了解和探索Linux原理,文章为我自己理解,水平有限,如有错误,请谅解,欢迎指正一、先上个图 ...博文来自:孔令宽的专栏

  中断和异常机制有时候普通的程序流必须可以被要求快速反应的处理事件中断。电脑提供了一个称为中断的结构来处理这些事件。外部中断由CPU的外部引起。例如:当一个鼠标移动了,硬件鼠标中断现在的程序来处理鼠标移...博文来自:A blog

  作为一名C++后台开发程序员,在这个领域需要不断的学习进步,才能够稳定前行。对于毕业工作了一年的我,在着期间,对于Linux系统可以说是很少接触,因为现在的项目主要是windows项目。但是,个...博文来自:jackiefrank的博客

  (1)程序直接访问方式跟循环检测IO方式,应该是一个意思吧,是最古老的方式。CPU和IO串行,每读一个字节(或字),CPU都需要不断检测状态寄存器的busy标志,当busy=1时,表示IO还没完成;当...博文来自:xingchenhy的博客

  前言这篇文章,我把中断异常、输入输出,两个部分放到一起,因为它们之间的联系实在很深。中断和异常在程序运行时,系统内部,外部或者程序本身出现一些需要特殊处理的“事件”,CPU立即强行中断当前程序,并改变...博文来自:arctanx

  I/O多路复用:监视多个文件描述符(优势),一旦某个描述符就绪,通知程序进行相应处理。Select、poll、epoll本质上都是同步IO(Linux)。Select:1.文件描述符个数有限制1024...博文来自:gaibian_one的博客

  本文主要介绍5种I/O模型,select函数以及利用select实现C/S模型。1、5种I/O模型(1)阻塞I/O:一直等到数据到来,才会将数据从内核中拷贝到用户空间中。(2)非阻塞I/O:每过一段时...博文来自:Hello~~~

  目录一、linux系统文件和文件系统1.1文件类型1.2system函数1.3linux文件权限1.4设置系统文件、目录初始默认权限1.5文件其他属性一、linux系统文件和文件系统  /bin: b...博文来自:树叶子的博客

  根据应用程序对文件的访问方式,即是否存在缓冲区,对文件的访问可以分为:带缓冲区的操作--缓冲文件系统非缓冲区的文件操作--非缓冲文件系统:...博文来自:好儿郎~志在四方

  redis是一个单线程却性能非常好的内存数据库,主要用来作为缓存系统。redis采用网络IO多路复用技术来保证在多连接的时候,系统的高吞吐量。LINUXIO多路复用原理在linux下面,常见的有5中网...博文来自:baijiwei的博客

  0.Linux下缓冲池技术的简单介绍Linux文件系统中,存在着著名的三大缓冲技术用以提升读写操作效率:inode缓冲区、dentry缓冲区、块缓冲。其中所谓的块缓冲便是我们前面一直在讨论的缓冲池技术...博文来自:墨篙和小奶猫

  说到重叠模型首先还是提一下异步IO比较好,因为从本质上讲,重叠模型也是一种异步IO模型。   ...博文来自:在线笔记

  理解概念:通过一个监测,可以同时监控多个I/O事件的行为。当哪个I/O事件可以执行,就让这个I/O事件发生。过程:1、在程序存在的I/O事件中选择要监测的事件,2、创建监测,将监测的事件注册3、等待监...博文来自:Flask 框架之简单入门

  Windows完成端口介绍 Linux EPOLL介绍 同步I/O与异步I/O 说起完成端口,它的实现机制其实是重叠I/O实现异步I/O操作,下面就结合同步I/O来解释下什么是异步I/O

  Windows2000 磁盘I/O API 函数应用举例 显示驱动器中磁盘的基本信息 磁盘管理

  一,IO模型unix5种IO模型:阻塞式I/O:所有套接字默认 非阻塞I/O I/O复用(select,poll,epoll) 信号驱动式(SIGIO):内核在描述符就绪时发送SIGIO通知进程 异步...博文来自:的博客

  关于Node.js的运行机制的个人理解:(1)当发起一个异步(非阻塞或阻塞)调用时,就会封装异步调用的请求对象。(2)封装完后的对象就会放入线)当线程池查询有空时就会执行请求对象里...博文来自:Cyan1614的博客

  在应用开发中,经常要访问文件,Linux下的文件读写方式分为两大类:标准I/O和文件I/O,下面分别介绍下两种I/O的相关操作,并比较下两种I/O的特点。一、标准I/O标准I/O库接口由ANSIC标准...博文来自:myintelex的博客

  Java对多路复用I/O技术的支持一、重要概念:Channel    Channel通道,是一个用来完成应用程序和操作系统交互事件、传递内容的渠道,注意是连接到操作系统。一个通道会有一个专属的文件状态...博文来自:TomWu的博客

  一.文件I/O和标准I/O区别先来了解下什么是文件I/O和标准I/O:文件I/O:文件I/O称之为不带缓存的IO(unbufferedI/O)。不带缓存指的是每个read,write都调用内核中的一个...博文来自:朝气蓬勃

  保护机制是可靠运行多任务环境所必须的。它可以用于保护各个任务免受互相之间的干扰。在软件开发的任何阶段都可以使用段级和页级保护来协助寻找和检测设计问题和错误。当程序对错误内存空间执行了一次非期望的引用,...博文来自:一

  I/O分类:    有两种I/O,一是文件I/O,而我们c语言的封装叫标准I/O,他们有什么区别那?显然标准I/O是基于文件I/O的,标准IO调用了文件IO,也优化了文件IO,例如引入缓存机制。   ...博文来自:qwerrfxgj的博客

  此篇博客是我专门针对我的一本教科书进行的笔记整理。以前我一直采用的纸质的笔记本进行的记录,现在将它们转录到博客上,也随一下大流。这篇文章是刘琰、刘龙等编著的由机械工业出版社出版的《Windows网络编...博文来自:CPPER的博客

  Linux下的五种I/O模型:同步与异步区别在于内核是否会主动通知应用程序相应操作已完成阻塞与非阻塞的区别在...博文来自:TS1130的专栏

  早期,I/O串行,查询方式。发展,I/O并行,两种方式其一是中断方式,其二是dma方式,使得外部设备能直接与主存储器信息交换,减轻了cpu的工作量。技术继续发展,出现通道结构,实质上为高性能的dma控...博文来自:暗色调的博客

  执行一个shell命令时,通常会自动打开三个标准文件,即标准输入文件(stdin),文件描述符为0,通常对应终端的键盘;标准输出文件(stdout),文件描述符为1和标准错误输出文件(stderr),...博文来自:benben的博客

  1.I/O中有哪些阻塞函数1)读操作中的read、recv、recvfrom2)写操作中的write、sendto3)其他操作:accept、connect 2.阻塞函数在什么情况下阻塞1)读阻塞,以...博文来自:朝辞暮见的博客

  select函数的功能和调用顺序使用select函数时统一监视多个文件描述符的:1、是否存在套接字接收数据?2、无需阻塞传输数据的套接字有哪些?3、哪些套接字发生了异常?select函数调用过程:由上...博文来自:未来之歌

  文件的随机读写到目前为止的所有文件访问都是顺序访问。这是因为所有的读和写都从当前文件的偏移位置开始,然后文件偏移值自动地增加到刚好超出读或写结束时的位置,使它为下一次访问作好准备。有个文件偏移这样的机...博文来自:125096

  I/O多路复用机制IO多路复用机制简介1流的概念2IO同步异步阻塞非阻塞3多路复用概念4IO复用的优势IO复用函数介绍1select函数2Poll函数3epoll函数4epoll相比于selectpo...博文来自:chewbee的专栏

  块设备(BlockDevice)简介块设备是一种以块(block)为单位可以进行随机存取的硬件设备。常见的块设备有硬盘,软盘,闪存等。块设备的最小寻址单元是扇区(sector),一个扇区是2\^n个字...博文来自:胡LiuJia@BLOG

  iostat       iostat命令被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是...博文来自:GUI1259802368的博客

  1.查看CPU、内存的命令:top2.查看操作系统的I/O注:top命令可以看到进程ID(pid)...博文来自:nanxiaotao的博客

  在命令行模式下进入到输入模式可以敲击i、a、o、s、I、A、O、S它们之间的区别做下备忘:i:在光标所在字符前开始插入a:在光标所在字符后开始插入o:在光标所在行的下面另起一新行插入s:删除光标所在的...博文来自:痛并快乐着

  尽管整体的处理器速度、内存大小以及I/O执行速度在不断提高,但I/O操作的吞吐率和延迟性能仍然要比等价的内存访问操作低多个数量级。另外,由于许多工作负荷都拥有重要的I/O组件,I/O处理很容易成为整体...博文来自:ctthuangcheng

  jquery/js实现一个网页同时调用多个倒计时(最新的)nn最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦!nnnn//jsn...博文来自:Websites

  这一篇,代码折腾的时间较长,完成之后都是一些小细节,主要有三:n1、引入的依赖错误;n2、启动配置错误;n3、xml文件的mapper命名空间错误。n一、完整的pom.xmlnn...博文来自:lxhjh的专栏

  本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。1、 Esp8266之 搭建开发环境,开始一个“hellow worl...博文来自:徐宏的博客。

  扫二维码关注,获取更多技术分享nnn 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...博文来自:Marswill

  采用EasyUI 1.4.x 版本,默认default风格,异步加载页面,多Tab页展示,使用JSON文件模拟从后台动态获取数据。...博文来自:般若

  DirectX修复工具API Sets强力修复实验包下载地址:nn密码:5y5vnnnn实验包使用说明...博文来自:VBcom的专栏

  接着上次的图书管理系统rnrn修改完问题后把SpringBoot成功部署到了服务器上rn测试了下api接口,能正常访问rn那么下面就是在服务器上部署前端的vue.js了rnrnrn这里的话我们要明确一...博文来自:小时的枫的博客

http://disyu.com/tongdaominglingzi/429.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有