文件系统的IO过程

文件系统的IO简化流程图

文件系统的IO过程
图中的IO Manager是操作系统内核的一个模块,专门用来管理IO,并协调文件系统、卷、磁盘驱动程序各个模块之间的运作。整体流程解释:
某时刻,应用程序调用文件系统接口,准备写入某文件。(从app到system services的过程)
1、IO Manager最终将这个请求发送给文件系统模块。
2、文件系统将某个文件对应的逻辑偏移映射成卷的LBA(逻辑块地址)地址偏移并通过IO Manager请求调用卷管理磁盘驱动接口。
3、文件系统向IO Manager请求调用卷管理软件模块的接口。
4、卷管理软件将卷对应的LBA地址偏移翻译映射成实际物理磁盘对应的LBA地址偏移,并请求调用磁盘控制器驱动程序。
5、IO Manager请求调用磁盘控制器驱动程序。
6、将对应的LBA地址段的数据从内存写入某物理磁盘。

文件系统的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和非阻塞IO的另一个好处是文件系统不必立刻返回数据,所以可以对上层请求的IO进行排队优化处理,或者批量向下层请求IO,这样就大大提升了系统性能。
(3)Direct IO:文件系统都有自己的缓存机制,增加缓存就是为了性能得到优化,而有些应用程序,比如数据库程序,它们有自己的缓存,IO在发出去之前已经经过自己的缓存算法优化过了,如果请求IO到达文件系统之后,又被缓存起来进行额外的优化,就是多此一举了,既浪费了时间,又降低了性能。对于文件系统返回的数据,同样也有多余的动作。所以文件系统提供了另外一种接口,就是Direct IO接口。调用这种接口的程序,其IO请求,数据请求以及回送的数据都不被文件系统缓存,而是直接进入应用程序的缓存,这样就提升了性能。