文件系统中I/O方式详解

1 文件系统I/O类型

文件系统的IO包括同步IO、异步IO、阻塞/非阻塞IO和Direct IO。

(1)同步IO:同步IO是指程序的某一个进程或者线程,如果某时刻调用了同步IO接口,则IO请求发出后,这个进程或者线程必须等待IO路径上的下位程序返回的信号(不管是成功收到数据的信号还是失败的信号)。如果不能立刻收到下位的信号;则一直处于等待状态,不继续执行后续的代码,被操作系统挂起,操作系统继续执行其他的进程或者线程。而如果在这期间,倘若IO的下位程序尚未得到上位程序请求的数据,此时IO路径上的下位程序又可以选择两种动作方式:第一是如果暂时没有得到上位程序请求的数据,则返回通知通告上位程序数据未收到,而上位程序此时便可以继续执行;第二种动作则是下位程序也等待它自己的下位程序来返回数据,直到数据成功返回,才将数据送给上位程序。前者就是非阻塞IO,后者就是阻塞IO方式。同步+阻塞IO是彻底的堵死状态,这种情况下,除非这个程序是多线程程序,否则程序就此挂死,失去响应。同理,异步+非阻塞的IO方式则是最松耦合的IO方式。

(2)异步IO:异步IO请求发出后,操作系统会继续执行本线程或者进程中后续的代码,直到时间片到时或者因其他原因被挂起。异步IO模式下,应用程序的响应速度不会受IO瓶颈的影响,即使这个IO很长时间没有完成。虽然应用程序得不到它要的数据,但不会影响其他功能的执行。基于这个结果,很多数据库在异步IO的情况下,都会将负责把缓存Flush到磁盘的进程(Oracle中这个进程为DBWR进程)数量设置成比较低的数值,甚至为1。因为在异步IO的情况下,Flush进程不必挂起以等待IO完成,所以即使使用很多的Flush进程,也与使用1个进程效果差不多。异步IO和非阻塞IO的另一个好处是文件系统不必立刻返回数据,所以可以对上层请求的IO进行优化排队处理,或者批量向下层请求IO,这样就大大提升了系统性能。

(3)Direct IO:文件系统都有自己的缓存机制,增加缓存就是为了使性能得到优化。而有些应用程序,比如数据库程序,它们有自己的缓存,IO在发出之前已经经过自己的缓存算法优化过了,如果请求IO到达文件系统之后,又被缓存起来进行额外的优化,就是多此一举了,既浪费了时间,又降低了性能。对于文件系统返回的数据,同样也有这个多余的动作。所以文件系统提供了另外的一种接口,就是Direct IO接口。调用这种接口的程序,其IO请求、数据请求以及回送的数据将都不被文件系统缓存,而是直接进入应用程序的缓存,这样就提升了性能。此外,在系统路径上任何一处引入缓存,如果是Write Back模式,都将带来数据一致性的问题。Direct IO绕过了文件系统的缓存,所以降低了数据不一致的风险。

2. I/O manager

Windows系统I/O简化流程图如图1所示

图1. Windows操作系统文件I/O流程图

图中的IO Manager是操作系统内核的一个模块,专门用来管理IO,并协调文件系统、卷、磁盘驱动程序各个模块之间的运作。整个流程解释如下。

某时刻,某应用程序调用文件系统接口,准备写入某文件从某个字节开始的若干字节。

  1. IO Manager最终将这个请求发送给文件系统模块。
  2. 文件系统将某个文件对应的逻辑偏移映射成卷的LBA地址偏移。
  3. 文件系统向IO Manager请求调用卷管理软件模块的接口。卷管理软件将卷对应的LBA地址偏移翻译映射成实际物理磁盘对应LBA地址偏移,并请求调用磁盘控制器驱动程序。
  4. IO Manager向磁盘控制器驱动程序请求将对应LBA地址段的数据从内存写入某块物理磁盘。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值