I/O系统组件
==================
Windows I/O系统的设计目标就是为以下一些特性的应用程序提供设备的抽象, 设备包括硬件设备和软件设备(虚拟设备和逻辑设备).
Windows的IO系统包括许多执行元件(executive components)组成, 见上图.
I/O系统的结构和模式
================
在Windows中, 线程对虚拟文件执行IO操作. 操作系统将所有的IO请求都抽象为在一个虚拟文件上的操作., 隐藏了IO操作的对象可能并不是一个文件结构的设备的事实. 这抽象生成了应用程序对设备的接口. 一个virtual file指的是: 对任何的源或者目的IO设备来说, 线程就当他们是一个文件(文件啦, 目录啦, 管道啦, 邮件槽啦). 所有的读或者写的数据都被看作是简单的面向这些虚拟文件的字节流. 用户态应用程序调用文档记录的函数, 他们依次调用内部的IO系统函数来从文件中读取数据, 向文件中写入数据, 或者执行其他的操作. IO管理器动态的检测这些虚拟文件的请求, 并执行到恰当的设备驱动上.
下面是典型IO请求过程的基本架构.
IO管理器
-------------
IO管理器定义了有秩序的框架, 在这个框架中IO请求会被传递给设备驱动. IO系统是packet driven(封包驱动)的. 多数的IO请求都由IO request packet(IRP)表示, IRP可以在多个IO系统组件中间流动. Fast IO是一个例外, 他不使用IRP. 设计允许一个应用程序线程并发的处理多个IO请求. 一个IRP是一个数据结构, 包含描述IO请求的完整信息.
IO管理器创建代表IO请求的IRP, 传递IRP的指针给正确的驱动, 然后在io操作结束之后析构掉这个IRP包. 对比的, 驱动程序接受IRP包, 执行IRP指定的操作, 将IRP包传回给io管理器, 要么是操作成功了而传回, 要不是准备传递给另外一个驱动程序去作进一步的处理.
关于创建和析构IRP, IO管理器提供代码, 这些代码对于不同的驱动程序来说是常见的, 所有的驱动都调用这些函数来执行他们的IO处理. 通过加强了的IO管理器的普通任务, 个别的驱动变得更简单, 更精简. 比如说, io管理器提供一个函数, 允许一个驱动程序去调用另一个驱动程序. 它也管理IO请求的缓冲, 对驱动和记录提供超时支持, 这里的记录指的是被可安装的文件系统被加载到操作系统中的时候的记录. 有进百个不同的IO管理器的函数可以被驱动程序调用.
IO管理器还提供灵活的IO服务, 这些服务允许环境子系统比如Win32和POSIX来实现各自的IO函数. 这些服务包括成熟的对异步IO的服务, 异步IO服务允许开发人员建立可度量的高性能的服务器应用程序.
驱动程序展现出的统一的, 模块化的接口, 允许IO管理器调用任何的驱动程序而不需要知道关于这个驱动的具体信息和内部实现的细节. 如同我们之前提到的, 操作系统对待所有的IO请求都看做是一个操作一个文件. 驱动将给虚拟文件的请求转换为对物理设备的请求. 驱动程序也可以调用彼此来实现分层的, 独立的IO请求处理.
除了正常的打开, 关闭, 读, 写功能之外, Windows IO系统还提供许多高级的特性, 比如异步处理啦, 缓存啦, scatter/gather IO.