I/O子系统架构:
为了快速的全面的了解I/O子系统操作,我们使用一个把数据写入磁盘的例子。当执行向磁盘写入数据操作的时候,会发生如下的一系列基本操作。假设文件数据存在于磁盘扇区上,并且已经被读入到页缓存中。
- 进程使用write()系统调用写入文件。
- 内核更新映射到文件的page cache。
- 内核线程pdflush负责把页缓存刷入到磁盘中。
- 文件系统层把各个块缓存放入一个bio结构,并且提交一个写入到块设备层的请求。
- 块设备层从上层获得请求,执行I/O elevator操作,把请求放入到I/O请求队列中。
- 磁盘驱动,例如SCSI或其它特定驱动将会负责写操作。
- 磁盘驱动固件执行硬件操作,例如寻址、旋转、数据传送到磁盘的扇区。
I/O 硬件
块I/O基本概念
字符设备:按照字符流的方式被有序访问的设备。如串口、键盘等。
块设备:系统中不能随机(不需要按顺序)访问固定大小的数据片(chunk 块)的设备。
如:硬盘、软盘、CD-ROM驱动器、闪存等。都是通过以安装文件系统的方式使用。
块设备的组成:
- 扇区:是块设备中最小的可寻址单元(常见大小512字节);是块设备的基本寻址和操作单元。
- 块:是文件系统最小逻辑可寻址单元,文件系统的抽象,只能通过块访问文件系统。通常包含多个扇区。当一个块被调入内存时(读入后或等待写出时),它要存储在一个缓冲区中;每个缓冲区与一个块对应,缓冲区相当于是磁盘块在内存中的表示;块大小不超过一个页面,一个页可以容纳一个或多个内存中的块。
缓冲区:是内核操作块设备的逻辑单元,每个缓冲区需要一个描述符来表示块的控相关制信息。
数据结构:缓冲区头buffer_head,虽然不用于I/O操作,但是它负责描述磁盘块到页面的映射;
内核操作I/O块基本容器是:bio。操作内核中所有的缓冲区对应的I/O块。
请求队列:块设备将他们挂起的块I/O请求保存在请求队列中。
I/O控制器
I/O设备的机械部件主要执行具体的I/O操作。 CPU无法直接控制I/O设备的机械部件,因此I/O设备还要一个电子部件作为CPU和I/O设备机械部件之间的中介,用于实现CPU对设备的控制。这个电子部件就是I/O控制器,又称设备控制器。CPU可控制I/O控制器,又由I/O控制器来控制机械部件。
I/O控制器的组成
I/O 控制器由下面三个部分组成:CPU与控制器的接口、I/O逻辑、控制器与设备的接口;
数据寄存器:记录主机可读或者写入的数据
控制寄存器:可以被主机发布命令或改变设备状态
状态寄存器:记录主机可读的位置信息
I/O控制器的功能
- 接受和识别CPU发出的命令:CPU可以控制I/O控制器,所以I/O控制器肯定要能接受并识别CPU的命令。如CPU发来的read/write命令。I/O控制器会有相应的控制寄存器来存放命令参数。
- 向CPU报告设备的状态:I/O控制器会有相应的状态寄存器,用于记录I/O设备当前的状态。如1表示空闲,0表示忙碌。
- 数据交换:I/O控制器作为机械部件和CPU的中介,需要实现两者的数据交换。I/O控制器中会设置相应的数据寄存器,输出时,数据寄存器用于暂存CPU发出的数据,之后再由控制器传动设备。输入时,数据寄存器用于暂存
- 地址识别:类似于内存地址,为了区分上面提到的各个寄存器,也需要给各个寄存器设定一个特定的地址。I/O控制器通过CPU提供的地址来判断CPU要读/写哪个寄存器。
I/O 地址
I/O地址:控制寄存器地址
编址方式:
I/O独立编址:使用独立的I/O指令,如IN、OUT;
内存映射编址memory map:划出一块内存地址,将I/O端口地址映射进来,这样就可以使用访问内存指令对控制器进行读写。
I/O控制方式
轮询方式的I/O操作,是最早期的计算机系统对I/O设备的一种管理方式。
1、程序直接控制方式
2、中断驱动方式
3、DMA(Directly memory access)直接内存访问访问
4、通道控制方式
内核I/O结构
内核I/O结构包括I/O硬件和I/O软件两个部分,I/O软件的设计目标主要体现在:
- 高效率(efficiency):通过一些手段提高I/O设备的访问效率。
- 通用性(generality):屏蔽硬件细节,让用户使用统一的接口方便地使用不同的硬件。
内核I/O结构图
设备驱动层
设备驱动层通过隐藏设备控制器之间的差异使I/O子系统独立于硬件。
I/O请求生命周期:
- 若干服务——调度、缓冲、缓存、假脱机、设备预留和错误处理是由内核的I/O子系统提供,并构建在硬件和设备驱动基础设施上。
- I/O子系统还负责保护自己不受错误进程和恶意用户的影响。
缓冲buffering:主要用于处理数据流的生产者和消费者速度不匹配的问题。
缓存cacheing:
假脱机:是一种缓冲区,为不能接受交错数据流的设备(如打印机)保存输出。尽管一台打印机一次只能服务于一个作业,但是多个应用程序可能希望同时打印它们的输出,而不是将它们的输出混合在一起。
假脱机spooling(spool:Simultaneous peripheral operations on-line):用磁盘做缓冲,将需要打印的存储成文件,顺序排列,看成并发的打印、其实没放到打印机,实际上放到磁盘中,磁盘当作缓冲区。
缓冲与缓存的区别:
缓冲和缓存之间的区别在于,缓冲可能保存数据项的唯一现有副本,而缓存,根据定义,保存位于其他地方的数据项的更快存储副本。