I/O 操作的那些事儿:轮询 ,中断 , DMA ,通道

 

  I/O 设备是计算机的重要组成部分,介于处理器与 I/O 设备交互的复杂性,I/O 操作一直是高级语言开发者比较难掌握的一个技术点。

  因为高级语言对 I/O 操作的封装基于操作系统提供的系统函数,而这些系统函数的调用方式又与其硬件层的结构与工作机制息息相关,所以想要彻底搞懂 I/O 操作的那些函数,必须对其基于的底层设备的工作方式有一定的了解。下面我们看一下 I/O 操作演变的过程。

  1. 轮询方式的 I/O 操作

  对I/O设备的程序轮询的方式,是早期的计算机系统对I/O设备的一种管理方式。它定时对各种设备轮流询问一遍有无处理要求。轮流询问之后,有要求的,则加以处理。在处理I/O设备的要求之后,处理机返回继续工作。尽管轮询需要时间,但轮询不比I/O设备的速度要快得多,所以一般不会发生不能及时处理的问题,I/O操作的时效性是可以保证的。但是处理器的速度再快,能处理的输入输出设备的数量也是有一定限度的。而且,程序轮询会占据CPU相当一部分处理时间,因此程序轮询是一种效率较低的方式,在现代计算机系统中已很少应用。

  2. 中断方式的 I/O 操作

  处理器与 I/O 设备间几个数量级的速度差异是 I/O 操作中存在的重要矛盾,是设备管理要解决的一个重要问题。为了提高整体效率,减少在程序直接控制 I/O 设备与处理器进行数据交互是很必要的。在I/O设备中断方式下,中央处理器与I/O设备之间数据的传输步骤如下:

  ⑴在某个进程需要数据时,发出指令启动输入输出设备准备数据

  ⑵在进程发出指令启动设备之后,该进程放弃处理器,并由操作系统将进程置为阻塞状态,等待相关I/O操作完成。此时,进程调度程序会调度其他就绪进程使用处理器。

  ⑶当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转向预先设计好的中断处理程序,对数据传送工作进行相应的处理。

  ⑷数据准备完成后,OS将阻塞的进程唤醒,将其转入就绪状态。在随后的某个时刻,进程调度程序会选中该进程继续工作。

  中断方式的优缺点

  I/O设备中断方式使处理器的利用率提高,且能支持多道程序和I/O设备的并行操作。

  不过,中断方式仍然存在一些问题。首先,现代计算机系统通常配置有各种各样的输入输出设备。如果这些I/O设备都同过中断处理方式进行并行操作,那么中断次数的急剧增加会造成CPU无法响应中断和出现数据丢失现象。

  其次,如果I/O控制器的数据缓冲区比较小,在缓冲区装满数据之后将会发生中断。那么,在数据传送过程中,发生中断的机会较多,这将耗去大量的CPU处理时间。

  这里为了与下一种 I/O 方式进行区分,我们再说一下 I/O 设备的工作方式。我们先来了解一个硬件设备,设备控制器。

  2.1 设备控制器

  设备控制器是计算机中的一个实体,其主要职责是控制一个或多个I/O设备,以实现I/O设备和计算机之间的数据交换。它是CPU与I/O设备之间的接口,它接收从CPU发来的命令,并去控制I/O设备工作,以使处理机从繁杂的设备控制事务中解脱出来。设备控制器是一个可编址的设备,当它仅控制一个设备时,它只有一个唯一的设备地址;若控制可连接多个设备时,则应含有多个设备地址,并使每一个设备地址对应一个设备。设备控制器有许多职责,我们只说与本次讲解相关的职责,即数据交换。

  数据交换是指CPU与控制器之间、控制器与设备之间的数据交换。对于前者,是通过数据总线,由CPU并行地把数据写入控制器,或从控制器中并行地读出数据;对于后者,是设备将数据输入到控制器,或从控制器传送给设备。为此,在控制器中须设置数据寄存器。

  我们上面所说的中断,便是设备控制器向处理器发出的中断,可以想象数据交互的过程:

  1. 处理器需要磁盘上的 100M 数据,于是向磁盘处理器发出读取指令,然后进程阻塞,等待数据准备完毕。

  2. 磁盘处理器接收到读取指令,执行寻道/寻址等磁盘操作找到目标数据,将数据读取到磁盘处理器的寄存器中。假设寄存器容量为 1M ,等待寄存器读满后向 CPU 发出中断。

  3. CPU 接收到中断信号,唤醒进程执行数据读取指令,将数据从磁盘控制器的寄存器读取到内存。等待读取完成,没有数据可读取,继续进入阻塞状态。

  4. 磁盘控制器再次将磁盘中的数据读取到寄存器,又是 1M ,再次向 CPU 发送中断。循环往复,直到将 10 M 数据读取完成。

  可以看到,总体的优化思路是通过中断机制,将设备控制器从设备中读取数据到寄存器的时间节省了出来,CPU 不会繁忙等待在这段时间上,可以去做其它有意义的事情。别说,这个思路与锁的实现很相似,是繁忙等待到非繁忙等待的优化,避免了 CPU 的无效运算。

  但是缺点刚刚也讲述的很清楚,频繁的中断会加大 CPU 的压力,尤其是一些设备控制器的寄存器比较小的情况下,一次 I/O 操作中进行中断的频率非常高。另外将数据由设备处理器读取到内核缓冲区的过程 CPU 是全程干预,一个字节一个字节进行读写的,这些操作并没有什么复杂的逻辑,由 CPU 直接处理显得有些浪费资源。

  3. DMA 方式的I/O 操作

  直接内存存取技术是指,数据在内存与I/O设备间直接进行成块传输。该技术基于 DMA 设备,将 CPU 从简单的数据传输工作中解放了出来。

  DMA有两个技术特征,首先是直接传送,其次是块传送。所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪,当然这里的中断是 DMA 设备向 CPU 发出的而不是设备控制器。

  DMA工作过程:

  ⑴当进程要求设备输入数据时,CPU把准备存放输入数据的内存起始地址以及要传送的字节数分别送入DMA控制器中的内存地址寄存器和传送字节计数器。

  ⑵发出数据传输要求的进行进入等待状态。此时正在执行的CPU指令被暂时挂起,进程进入阻塞状态。进程调度程序调度其他进程占据CPU。

  ⑶输入设备不断地窃取CPU工作周期(或者说与 CPU 争取内存总线),将数据缓冲寄存器中的数据源源不断地写入内存,直到所要求的字节全部传送完毕。

  ⑷DMA控制器在传送完所有字节时,通过中断请求线发出中断信号。CPU在接收到中断信号后,转入中断处理程序进行后续处理。

  ⑸中断处理结束后,CPU返回到被中断的进程中,或切换到新的进程上下文环境中,继续执行。

  DMA与中断的区别

  ⑴中断方式是在设备控制器的数据缓冲寄存器满之后发出中断,由设备控制器发出,要求CPU进行中断处理,而DMA方式则是在所要求传送的数据块全部传送结束时要求CPU 进行中断处理,由 DMA 设备发出。这就极大的减少了CPU进行中断处理的次数。

  ⑵中断方式的数据传送是在中断处理时由CPU控制完成的,而DMA方式则是在DMA控制器的控制下,不经过CPU控制完成的。这就排除了CPU因并行设备过多而来不及处理以及因速度不匹配而造成数据丢失等现象。

  DMA方式的优缺点

  在DMA方式中,由于I/O设备直接同内存发生成块的数据交换,因此I/O效率比较高。由于DMA技术可以提高I/O效率,因此在现代计算机系统中,得到了广泛的应用。许多输入输出设备的控制器,特别是块设备的控制器,都支持DMA方式。

  通过上述分析可以看出,DMA控制器功能的强弱,是决定DMA效率的关键因素。DMA控制器需要为每次数据传送做大量的工作,数据传送单位的增大意味着传送次数的减少。另外,DMA方式窃取了时钟周期,因为其占据了访问内存的数据总线,CPU处理效率降低了,要想尽量少地窃取始终周期,就要设法提高DMA控制器的性能,这样可以较少地影响CPU处理效率。

  总的来说 DMA 是一种比较令人满意的处理方式,通过 DMA 设备的引入将 CPU 从繁重的 I/O 操作中解放了出来。CPU 只需要发送读取请求和获得处理结果,而不需要关注 I/O 操作的具体传输过程。

  4. 通道方式的 I/O 

  输入/输出通道是一个独立于CPU的,专门管理I/O的处理机,它控制设备与内存直接进行数据交换。它有自己的通道指令,这些通道指令由CPU启动,并在操作结束时向CPU发出中断信号。输入/输出通道控制是一种以内存为中心,实现设备和内存直接交换数据的控制方式。在通道方式中,数据的传送方向、存放数据的内存起始地址以及传送的数据块长度等都由通道来进行控制。另外,通道控制方式可以做到一个通道控制多台设备与内存进行数据交换。因而,通道方式进一步减轻了CPU的工作负担,增加了计算机系统的并行工作程度。

  按照信息交换方式和所连接的设备种类不同,通道可以分为以下三种类型:

  ⑴字节多路通道

  它适用于连接打印机、终端等低速或中速的I/O设备。这种通道以字节为单位交叉工作:当为一台设备传送一个字节后,立即转去为另一它设备传送一个字节。

  ⑵选择通道

  它适用于连接磁盘、磁带等高速设备。这种通道以“组方式”工作,每次传送一批数据,传送速率很高,但在一段时间只能为一台设备服务。每当一个I/O请求处理完之后,就选择另一台设备并为其服务。

  ⑶成组多路通道

  这种通道综合了字节多路通道分时工作和选择通道传输速率高的特点,其实质是:对通道程序采用多道程序设计技术,使得与通道连接的设备可以并行工作。

  在通道控制方式中,I/O设备控制器(常简称为I/O控制器)中没有传送字节计数器和内存地址寄存器,但多了通道设备控制器和指令执行部件。CPU只需发出启动指令,指出通道相应的操作和I/O设备,该指令就可启动通道并使该通道从内存中调出相应的通道指令执行。一旦CPU发出启动通道的指令,通道就开始工作。I/O通道控制I/O控制器工作,I/O控制器又控制I/O设备。这样,一个通道可以连接多个I/O控制器,而一个I/O控制器又可以连接若干台同类型的外部设备。由于通道和控制器的数量一般比设备数量要少,因此,如果连接不当,往往会导致出现“瓶颈”。故一般设备的连接采用交叉连接,这样做的好处是:

  ① 提高系统的可靠性:当某条通路因控制器或通道故障而断开时,可使用其他通路。

  ② 提高设备的并行性:对于同一个设备,当与它相连的某一条通路中的控制器或通道被占用时,可以选择另一条空闲通路,减少了设备因等待通路所需要花费的时间。

  通道处理机

  通道相当于一个功能单纯的处理机,它具有自己的指令系统,包括读、写、控制、转移、结束以及空操作等指令,并可以执行由这些指令编写的通道程序。

  通道的运算控制部件包括:

  ① 通道地址字(CAW):记录下一条通道指令存放的地址,其功能类似于中央处理机的指令寄存器。

  ② 通道命令字(CCW):记录正在执行的通道指令,其作用相当于中央处理机的指令寄存器。

  ③ 通道状态字(CSW):记录通道、控制器、设备的状态,包括I/O传输完成信息、出错信息、重复执行次数等。

  通道一般需要与主机共享同一个内存,以保存通道程序和交换数据。通道访问内存采用“周期窃用”,方式。采用通道方式后,输入/输出的执行过程如下:

  CPU在执行用户程序时遇到I/O请求,根据用户的I/O请求生成通道程序(也可以是事先编好的)。放到内存中,并把该通道程序首地址放入CAW中。

  然后,CPU执行“启动I/O”指令,启动通道工作。通道接收“启动I/O”指令信号,从CAW中取出通道程序首地址,并根据此地址取出通道程序的第一条指令,放入CCW中;同时向CU发回答信号,通知“启动I/O”指令完成完毕,CPU可继续执行。

  通道开始执行通道程序,进行物理I/O操作。当执行完一条指令后,如果还有下一条指令则继续执行;否则表示传输完成,同时自行停止,通知CPU转去处理通道结束事件,并从CCW中得到有关通道状态。总之,在通道中,I/O运用专用的辅助处理器处理I/O操作,从而减轻了主处理器处理I/O的负担。主处理器只要发出一个I/O操作命令,剩下的工作完全由通道负责。I/O操作结束后,I/O通道会发出一个中断请求,表示相应操作已完成。

  通道的思想是从早期的大型计算机系统中发展起来的。在早期的大型计算机系统中,一般配有大量的I/O设备。为了把对I/O设备的管理从计算机主机中分离出来,形成了I/O通道的概念,并专门设计出I/O通道处理机。I/O通道在计算机系统中是一个非常重要的部件,它对系统整体性能的提高起了相当重要的作用。不过,随着技术不断的发展,处理机和I/O设备性能的不断提高,专用的、独立I/O通道处理机已不容易见到。但是通道的思想又融入了许多新的技术,所以仍在广泛地应用着。由于光纤通道技术具有数据传

输速率高、数据传输距离远以及可简化大型存储系统设计的优点,新的通用光纤通道技术正在快速发展。这种通用光纤通道可以在一个通道上容纳多达127个的大容量硬盘驱动器。显然,在大容量高速存储应用领域,通用光纤通道有着广泛的应用前景。

  对于前三种 I/O 交互方式来说,特点如下:

  1. 都需要 CPU 的介入:轮询方式需要 CPU 完全介入;中断方式需要 CPU 完全介入,但 CPU 在此期间进行非繁忙等待,可以做其它事情;DMA 方式需要 CPU 在传输开始和结束时介入。

  2. 需要的硬件支持:轮询方式只需要最基本的处理器即可;中断方式需要增加中断控制器;DMA 方式需要 DMA 处理器和中断控制器。

  这三种方式适合外设不太多的小型机,对于 I/O 设备多,输入输出繁杂的系统,占用 CPU 时间太多,硬件接口太复杂。通道技术使得 CPU 可以在有限的 I/O 指令下管理众多的外部设备,代替 CPU 控制和管理外设。

  CPU 和 I/O 设备之间增加了设备控制器后 已经可以大大减少CPU 对 I/O 的干涉 ,使得CPU 从繁多的io处理中解脱出来,但是当主机所配置的外设备很多时,CPU 负担还很重,为此 CPU 和设备管理器之间又加入了 I/O 通道 其主要目的是为了建立独立的io操作,不仅使得数据的传送独立于 CPU ,还希望有关 I/O 设备的组织/管理以及结束处理尽量独立,简单一点地说就是找出一种东西可以有简单的数据处理能力来分担 CPU 的任务,使得 CPU 专门来处理那些高级的数据 ,这些的简单的数据的处理就交给这个东西来处理这个东西就是 I/O 通道 ,I/O 通道属于硬件但是有执行简单指令的能力。DMA 控制器也是类似的硬件设备,但 DMA 控制器没有专门的处理器,虽然DMA 无需 CPU 进行外设与内存的数据交换工作,但是这只是减少了 CPU 的负担。因而DMA 中,输入输出的初始化仍然要由 CPU 来完成。

  DMA的好处在于将CPU中断从每个字符中断减少为每个缓冲区中断,从而如果输出字符很多时,能带来可观的性能提升。另一方面,DMA 控制器往往比CPU慢很多,如果DMA 控制器不能全速驱动输出设备或者当等待DMA时CPU经常无其他任务可做,那么Interrupt-Driven I/O或Programmed I/O可能更好。但是,大多数情况下,DMA都是更好的。通道有自己的指令系统,是一个协处理器,一般用在大型计算机系统中(不是大型机)。通道实质是一台能够执行有限的输入输出指令,并能被多台外设共享的小型 DMA 专用处理机。广义上讲,DMA也属于通道。那么 DMA 于 通道相比:

  共同点:都能实现IO设备和内存之间建立数据直传通路;

  不同点:

  1. DMA只能实现固定的数据传送控制,而通道有自己的指令和程序,具有更强的独立处理数据输入和输出的能力。
  2. DMA只能控制一台或者少数几台同类设备,而一个通道可以控制多台同类或者不同的设备。


posted @ 2020-03-29 01:36  牛有肉  阅读(4364)  评论(2编辑  收藏  举报