0
点赞
收藏
分享

微信扫一扫

I/O 学习

看山远兮 2023-02-13 阅读 52


I/O子系统架构:

为了快速的全面的了解I/O子系统操作,我们使用一个把数据写入磁盘的例子。当执行向磁盘写入数据操作的时候,会发生如下的一系列基本操作。假设文件数据存在于磁盘扇区上,并且已经被读入到页缓存中。

  • 进程使用write()系统调用写入文件。
  • 内核更新映射到文件的page cache
  • 内核线程pdflush负责把页缓存刷入到磁盘中。
  • 文件系统层把各个块缓存放入一个bio结构,并且提交一个写入到块设备层的请求。
  • 块设备层从上层获得请求,执行I/O elevator操作,把请求放入到I/O请求队列中。
  • 磁盘驱动,例如SCSI或其它特定驱动将会负责写操作。
  • 磁盘驱动固件执行硬件操作,例如寻址、旋转、数据传送到磁盘的扇区。

 I/O 学习_缓存

I/O 硬件

  块I/O基本概念  

字符设备:按照字符流的方式被有序访问的设备。如串口、键盘等。  

块设备:系统中不能随机(不需要按顺序)访问固定大小的数据片(chunk 块)的设备。

  • 如:硬盘、软盘、CD-ROM驱动器、闪存等。都是通过以安装文件系统的方式使用。

  •   块设备的组成

  • 扇区:是块设备中最小的可寻址单元(常见大小512字节);是块设备的基本寻址和操作单元。
  • :是文件系统最小逻辑可寻址单元,文件系统的抽象,只能通过块访问文件系统。通常包含多个扇区。当一个块被调入内存时(读入后或等待写出时),它要存储在一个缓冲区中;每个缓冲区与一个块对应,缓冲区相当于是磁盘块在内存中的表示;块大小不超过一个页面,一个页可以容纳一个或多个内存中的块。

  缓冲区:是内核操作块设备的逻辑单元,每个缓冲区需要一个描述符来表示块的控相关制信息。

  数据结构:缓冲区buffer_head,虽然不用于I/O操作,但是它负责描述磁盘块到页面的映射

  内核操作I/O块基本容器是:bio。操作内核中所有的缓冲区对应的I/O块。

  请求队列:块设备将他们挂起的块I/O请求保存在请求队列中。


 I/O 学习_缓存_02


  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 学习_块设备_03

  数据寄存器:记录主机可读或者写入的数据

  控制寄存器:可以被主机发布命令或改变设备状态

  状态寄存器:记录主机可读的位置信息

  I/O控制器的功能

 I/O 学习_块设备_04

  1. 接受和识别CPU发出的命令:CPU可以控制I/O控制器,所以I/O控制器肯定要能接受并识别CPU的命令。如CPU发来的read/write命令。I/O控制器会有相应的控制寄存器来存放命令参数。
  2. 向CPU报告设备的状态:I/O控制器会有相应的状态寄存器,用于记录I/O设备当前的状态。如1表示空闲,0表示忙碌。
  3. 数据交换:I/O控制器作为机械部件和CPU的中介,需要实现两者的数据交换。I/O控制器中会设置相应的数据寄存器,输出时,数据寄存器用于暂存CPU发出的数据,之后再由控制器传动设备。输入时,数据寄存器用于暂存
  4. 地址识别:类似于内存地址,为了区分上面提到的各个寄存器,也需要给各个寄存器设定一个特定的地址。I/O控制器通过CPU提供的地址来判断CPU要读/写哪个寄存器。

  I/O 地址

  I/O地址:控制寄存器地址

  编址方式:

  I/O独立编址:使用独立的I/O指令,如IN、OUT;

  内存映射编址memory map:划出一块内存地址,将I/O端口地址映射进来,这样就可以使用访问内存指令对控制器进行读写。

  I/O控制方式

 I/O 学习_寄存器_05

  轮询方式的I/O操作,是最早期的计算机系统对I/O设备的一种管理方式。

  1、程序直接控制方式

 I/O 学习_块设备_06


  2、中断驱动方式

 I/O 学习_块设备_07

  3、DMA(Directly memory access)直接内存访问访问

 I/O 学习_块设备_08

 I/O 学习_块设备_09

  4、通道控制方式


 I/O 学习_缓存_10


内核I/O结构

内核I/O结构包括I/O硬件和I/O软件两个部分,I/O软件的设计目标主要体现在:

  • 高效率(efficiency):通过一些手段提高I/O设备的访问效率。
  • 通用性(generality):屏蔽硬件细节,让用户使用统一的接口方便地使用不同的硬件。

内核I/O结构图

 I/O 学习_寄存器_11


设备驱动层

设备驱动层通过隐藏设备控制器之间的差异使I/O子系统独立于硬件。

 I/O 学习_缓存_12

I/O请求生命周期:

  • 若干服务——调度、缓冲、缓存、假脱机、设备预留和错误处理是由内核的I/O子系统提供,并构建在硬件和设备驱动基础设施上。
  • I/O子系统还负责保护自己不受错误进程和恶意用户的影响。

缓冲buffering:主要用于处理数据流的生产者和消费者速度不匹配的问题。

缓存cacheing:

假脱机:是一种缓冲区,为不能接受交错数据流的设备(如打印机)保存输出。尽管一台打印机一次只能服务于一个作业,但是多个应用程序可能希望同时打印它们的输出,而不是将它们的输出混合在一起。

假脱机spooling(spool:Simultaneous peripheral operations on-line):用磁盘做缓冲,将需要打印的存储成文件,顺序排列,看成并发的打印、其实没放到打印机,实际上放到磁盘中,磁盘当作缓冲区。

缓冲与缓存的区别:

缓冲和缓存之间的区别在于,缓冲可能保存数据项的唯一现有副本,而缓存,根据定义,保存位于其他地方的数据项的更快存储副本。

 I/O 学习_缓存_13


举报

相关推荐

0 条评论