输入输出组织主要用于控制外设与内存、外设与CPU之间进行数据交换。通常把外部设备及其接口线路、I/O控制部件以及I/O软件统称为输入输出系统。输入输出组织要解决的问题是对各种形式的信息进行输人和输出的控制。实现输入输出功能的关键是要解决以下一系列的问题:如何在CPU、主存和外设之间建立一个高效的信息传输“通路”;怎样将用户的I/O请求转换成对设备的控制命令;如何对外设进行编址;怎样使CPU方便地寻找到要访问的外设;I/O硬件和I/O软件如何协调完成主机和外设之间的数据传送等。
本章将围绕以上这些问题,重点介绍常用的外部设备(包括输入输出设备和外部存储器)、I/O 接口的功能和结构、外部设备的编址和寻址,以及主机和外设间的互连及其数据传送的各种输人输出控制方式等内容。
6.1 输入设备和输出设备
输入输出设备(又称外围设备或外部设备,简称外设)是计算机系统与人或其他机器之间进行信息交换的装置。输入设备的功能是把数据、命令、字符、图形、图像、声音或电流、电压等信息,以计算机可以接收和识别的二进制代码形式输入到计算机中,供计算机进行处理。输出设备的功能是把计算机处理的结果,变成人最终可以识别的数字、文字、图形、图像或声音等信息,然后播放、打印或显示输出。
最常用的输入设备是键盘与鼠标,相对而言它们比较简单。最常用的输出设备是打印机与显示器。下面对它们做简略介绍。
6.1.1 键盘
键盘是计算机不可缺少的最常用的输入设备,用户通过键盘可向计算机输入字母、数字和符号。键盘由外壳、按键和电路板三部分组成。按键的结构可归纳成两类:一类是触点式按键,它借助触点开关的接通或断开,来产生电信号;另一类是非触点式开关,利用电压、电流或电磁场的变化产生输出信号。计算机中基本上使用后一类开关。电路板中是键盘控制逻辑,由一些逻辑电路或单片机组成,键盘上每个按键发出的信号由电路板转换为二进制代码,然后通过键盘接口送入计算机中。
按键的排列是一个mxn的二维阵列,每个按键对应该阵列中的一个位置。键盘采用“按列扫描、接地检查”的方式进行工作。具体过程如下:键盘电路板内的单片机每隔3~5ms对按键矩阵的各列进行顺序扫描,被扫描列接0电平“地”,其他列接高电平。若此时被扫描的列中正好有某个键被按下,则相应的行和列被接通,因而按键所在行输出变低电平,其他行输出为高电平。如图6.1所示,当扫描最右边一列时,该列第二行的“A”键被按下,所以,第二行的输出为低电平0。此时,单片机可根据扫描的列号和输出为0电平的行号得到按键的位置,位置信息称为按键的“扫描码”或“位置码”。
键盘中的单片机除了完成按键扫描和生成扫描码的功能之外,它还将扫描码转换成串行形式发送给主机,并具有消除抖动、扫描码缓冲和自动重复等功能。
键盘所发出的串行数据由1位起始位、8位数据位、1位奇偶校验位和1位停止位组成。主机的键盘控制电路接收到这些串行数据后,去掉起始位、校验位和停止位,将8位数据通过串一并转换,形成并行数据送入缓冲寄存器,然后向CPU发出键盘中断请求,CPU响应该中断后,由键盘中断服务程序把扫描码转换成ASCII码,然后送入主存中的键盘数据缓冲区。
键盘上也可输入如汉字等非西文字符,这由各种汉字输人法自行定义。键盘位置码送人计算机后,经过汉字输入软件的处理,转换成该汉字对应的内码,再进行显示、存储等其他操作。
常图键盘和主机的接口有AT接口、PS/2接口、USB接口和无线接口,较早的机器采用AT接口(大五芯接口),现在台式机大多用PS/2接口(小五芯接口)或USB接口。USB接口支持即插即用,因而使用方便,比较受欢迎。
6.1.2 鼠标器
鼠标器(mouse)是一种相对定位设备,它能方便地控制屏幕上的光标移动到指定的位置,并通过按键完成各种操作。鼠标器由于其外形如老鼠而得名,通过电缆与主机相连接。鼠标器在桌上移动,其底部的传感器检测出运动方向和相对距离,送入计算机。
根据鼠标器所采用传感器技术的不同,鼠标器可以分成两类:机械式与光电式。
(1)机械式鼠标器:其底部有一个圆球,鼠标移动时,圆球滚动带动与球相连的圆盘。圆盘上的编码器把运动方向与距离送给主机,经软件处理,控制光标做相应移动。该类鼠标器简单,使用方便,但也容易磨损,且精度差。
(2)光电式鼠标器:几乎没有任何机械零件,而是使用一个微型光学镜头不断地拍摄鼠标下方的图像,数字信号处理器(DSP)对获取的图像序列中帧与帧之间的变化进行分析,计算出移动方向和距离,送入计算机,控制光标的移动。这类鼠标器速度快,精度高,没有任何
机械磨损,使用寿命长,不需鼠标垫,只要在平面上就能操作,是目前比较流行的鼠标器
类型。
鼠标器的技术指标之一是分辨率,分辨率越高,越有利于用户的细微操作。分辨率用 dpi( dots per inch)表示,它指鼠标在桌上每移动一英寸,光标在屏幕上所移动的像素数。对光电鼠标来说,反映其性能的另一个指标是帧速率,即刷新频率,它指DSP每秒钟可以处理的图像帧数。
鼠标器与主机相连的接口主要有USB或PS/2接口或无线接口。早期的个人计算机把鼠标器接在串行通信口COM1或COM2上,目前已很少这样使用了。
6.1.3 打印机
打印机是计算机系统中最基本的输出设备。目前使用的打印机主要有击打式打印机、激光打印机和喷墨打印机3种。
1.击打式打印机
击打式打印机是最早研制成功的计算机打印设备,它以机械力量击打字锤从而使字模隔着色带在纸上打印出字来。按字锤或字模的构成方式来分,又可以分成整字形打印设备和点阵式打印设备两类。整字形打印设备利用完整字形的字模,每击打一次印出一个完整字形。这类设备的优点是印字美观自然,可同时复印数份;缺点是噪音大,印字速率低,字符种类少,无法打印汉字或图形,且易磨损,目前已很少使用。点阵式打印设备是利用打印头中的多根印针经色带在纸上打印出点阵字符的打印设备,又称针式打印机。目前有7针、9针、24针或48针的印字头。这类打印设备相对于整字型打印设备,其机械结构简单,印字速度快,噪声小,成本低,目前在银行、证券等行业的票据打印中广泛使用。以下主要介绍点阵式打印机的原理。
打印机通过打印控制器或打印适配器与主机连接,打印控制器由以下基本部件组成。
(1)数据锁存器:暂存CPU送来的打印数据。该数据可以送打印机缓冲器准备打印,也可以回送 CPU 以便进行检测用。
(2)命令译码器:对CPU送来的命令进行译码,产生打印控制器内部使用的几个命令,如数据传输方向、读数据、写数据、读控制、写控制和读状态等。
(3)控制锁存器:锁存CPU送来的控制命令,如初始化、选通、自动走纸等命令。这些命令也可以回送 CPU 以便检测用。
(4)状态锁存器:保存打印机送来的状态信息,如打印机忙、缺纸、联机、认可和出错等,以供CPU随时检测用。
(发送或接收数据、状态、命令字节)、地址线(选择打印控制器中寄存器的地址)和中断请求信号INT等。打印控制器与打印机之间若用25芯并口连接的话,则有8位数据线D0-D7.打印控制器送给打印机的初始化、选通、自动走纸等命令线,以及打印机回送打印控制器的反映打印机目前状态的忙、缺纸、联机、出错、认可等信号线。
打印机初始化主要是清除打印机缓冲和初始化打印机动作(如打击头回到起始位置等)。CPU输出一个字符后,要判断打印机状态“忙"否。只有当打印机不忙时,CPU发送选通信号,才把打印数据真正送到打印机缓冲。当打印机缓冲中接收满一行数据后,CPU发回车或换行信号,打印机才真正完成打印动作。
打印机除了能接收主机送来的数字、字符等打印信息以外,它还能接收主机送来的控制打印机执行特定动作的命令,这些命令通常称为不可打印字符。这些特定字符分成两类:第一类是回车(CR)、换行(LF)、删除(DEL)、响铃(BELL)等使打印机执行某特定动作的字符,其值可见ASCH码表,不同打印机的码值不变。第二类是ESC命令序列,或称“换码”序列。其命令格式中,第一个字符固定为ESC,后跟一个或多个ASCI字符。只有当打印机接收到一个完整的命令序列以后,才完成规定的控制功能。打印机不同,往往命令序列格式也不一样,因此,很多情况下,打印驱动程序是不兼容的。
2.激光打印机
激光打印机印刷速度快,印字质量好,噪声低,分辨率高,印刷输出成本低,这是目前应用最广泛的一种非击打式打印机。
激光打印机由打印机控制器和打印装置两部分组成。打印机控制器一般由功能较强的处理器、缓冲存储器以及相应的辅助电路构成,负责与主机的通信、解释主机送来的打印语言(包括打印机控制命令、页面格式命令、字体处理命令、图形命令等)、格式化打印内容(如纸张尺寸、边界设定、字符的大小与位置等)、光栅化处理(把经过格式化的页面数据转换成点阵数据)等,然后送打印装置进行输出。
如果是彩色激光打印机,一般带有多种颜色的硒鼓,最典型的是C(青色)、M(品红)、Y(黄色)、K(黑色)4种颜色。彩色打印过程可先由处理器把彩色图像分解成C、M、Y、K四种单色的图像(称为“分色”过程),再由打印装置分4次套色打印来完成。
打印语言是一组控制打印机工作的命令,打印机按照这些命令来处理主机送来的打印数据,并最终打印出复杂的文字与图像。打印语言大体分成两类:一类是页面描述语言(PDL),其中以Adobe公司的PostScript语言最为流行;另一类是Escape码语言,其中以HP公司的 PCL语言最为流行。
3.喷墨打印机
喷墨打印机也是一种非击打式打印机,它利用喷墨头喷射出可控的墨滴从而在打印纸上形成文字或图片,也是目前应用较多的一种打印输出设备。
过去,打印机与主机的接口主要是25芯的并行口,不支持即插即用,带电插拔时,一不小心就烧坏机器,很不方便。现在大多数激光打印机和喷墨打印机都已经采用USB接口和主机连接,高速打印机也可以用SCSI接口和主机相连。
6.1.4 显示器
显示器是用来显示数字、字符、图形和图像的设备,它由显示器(也称监视器)和显示控
制器组成,是计算机系统中最常用的输出设备之一。计算机使用的显示器主要分为两种:阴极射线管(CRT)显示器,以及目前流行的LCD液晶平板显示器。
早期常用的显示器是CRT显示器。CRT显示器由阴极射线管(CRT)、亮度控制电路(控制栅)以及扫描偏转电路(水平/垂直扫描偏转线圈)等部件构成。CRT显示器采用光栅扫描的方式显示图像。电子束在水平同步信号和垂直同步信号的控制下,在屏幕上按行优先的方式形成光点,从左向右进行行扫描,每扫描完一行,就进行一次水平行回扫,回到最左边,再进行下一行水平扫描,所有行扫描后形成一帧图像,然后进行垂直回扫,回到左上角,重复进行下一帧图像的扫描。水平扫描周期的倒数称为行频,垂直扫描周期的倒数称为帧频,也称刷新频率。
CRT显示器有三个电子枪,射出的电子流必须精确聚集,否则就得不到清晰的图像显示。因此,CRT显示器可能会因聚焦不准而造成图像模糊。此外,它还有体积大、能耗高的缺点。目前CRT显示器已经逐步被液晶显示器所取代。
液晶显示器的基本原理是基于液晶如下的物理特性:液晶通电时会改变其排列次序,从而影响光线的通过。因为每个液晶单元都是独立开和关,不存在聚焦问题,因此,LCD屏幕上图像非常清晰;同时,LCD显示器不需要采用CRT显示器那样的光栅扫描,因此也没有屏幕闪烁问题。由于具有体积小、耗电低、不闪烁等优点和良好的综合性能,LCD显示器目前已广泛应用于便携式计算机、数码相机和电视机等设备。当然,LCD显示器也存在价格高、视角不广以及彩色显示不够鲜艳等缺点。
通常,显示器工作时有两种模式。一种是字符模式,显示存储器(简称显存、VRAM,也称刷新存储器)中存放的是字符的编码(ASCII码或汉字代码)及其属性(如加亮、闪烁等),其字形信息存放在字符发生器中。另一种模式是图形模式,此时每一字符的点阵信息直接存储在显示存储器中,字符在屏幕上的显示位置可以定位到任意点。
彩色或单色多级灰度图像显示时,每一个像素需要使用多个二进位来表示,每个像素对应的二进位数称为颜色深度。例如,若颜色深度为8bit,则可以有256色;若颜色深度为24 bit,则可达 16M 种颜色(称为真彩色)。在图形模式下,显示控制器(CRTC)除了完成前述的两个基本功能外,还能实现画图功能。显示控制器接收并实现CPU送来的画图命令,并将结果写人显存;同时,显示控制器读出显存内容,经并/串变换和D/A转换后,送显示器 R.G、B 三个不同的颜色控制信号,从而在屏幕上显示出彩色图形。显示控制器的功能越来越强,除了完成二维画图命令以外,还具有三维图形显示功能。
显示控制器可以集成在主板上,这种情况下,它称为集成显卡;也可以以独立的图形显示卡(简称显卡)的方式插在主板扩充槽中成为独立显卡。
显卡的核心是绘图处理器(Graphics ProcessingUnit,简称CPU)。早期的绘图功能都由 CPU在内存中完成,然后将生成的图像位图从内存传送到显存中。这种方案显然加重了 CPU的工作量,并且绘图速度慢。目前显卡中的GPU专门用来进行绘图,它有一组可高速执行的适用于图像和图形处理的指令,如数据块传送、基本图形绘制、区域填空、图案填空、图形缩放、颜色转换等。由于采用专用处理器实现,所以图形操作速度快,并且大大减轻了CPU的负担。
6.2外部存储器
6.2.1 磁表面存储原理
磁表面存储器包括磁鼓、磁带、磁盘和磁卡片等。目前,在计算机系统中以磁盘为主。磁表面存储器主要用作计算机存储系统中的辅存,它可以存储大量的程序和数据。
磁表面存储器中信息的存取,主要由磁层和磁头来完成。磁层是存放信息的介质,它由非矩形剩磁特性的导磁材料(如氧化铁、镍钴合金等)构成。磁头是实现“磁一电”和“电一磁”转换的元件,由高磁导率的软磁性材料做成铁芯,在铁芯上开有缝隙并绕有线圈。当载磁体与磁头做相对运动时,若写磁头线圈通以磁化电流,则可将信息写到磁层上。当读磁头通过磁层上某一磁化单位而形成磁通回路时,磁通的变化使线圈两端产生感应电势,形成读出信号。
在磁表面存储器中,一般都使磁头固定,而磁层(载磁体)做高速回转或匀速直线运动。在这种相对运动中,通过磁头(其缝隙对准磁层)进行信息存取。
1.信息写入过程
写磁头线圈中通以写电流脉冲,此电流在铁芯中生成磁场,其磁头缝隙处的磁场穿过磁层中一微小区域,使该区域磁层以一定方向被磁化,形成一个磁化单元,而写电流脉冲消失后,磁层仍保持该方向的剩磁状态+BR或-BR,利用这两种稳定的剩磁状态,可以表示二进制代码的0和1。显然,一个磁化单元就是一个存储元,存储一位二进制信息。当磁层相对于磁头运动时,就可以连续写人一连串的二进制信息。这就是信息的写入过程。
2.信息读出过程
读出时,磁头与磁层同样做相对运动。当磁层中某一记录单元运动到磁头缝隙下面时,由于磁头铁芯是良好的导磁材料,磁化单元的磁力线很容易通过磁头而形成闭合磁通回路。由于磁头中的磁阻比其周围空气的磁阻小得多,便在磁头中产生较大的磁通变化,因而在读线圈的两端产生较大的感应电势E,经读出放大电路整形和放大后成为读出信号。由于不同极性的磁化单元在铁芯中的方向不同,因而形成的感应电势E的方向也不同,从而可区别读出的是0还是1。
3.磁表面存储器的性能指标
(1)记录密度
记录密度可用道密度和位密度来表示。磁道是在磁层运动方向上被磁头扫过的轨迹。一个磁表面会有许多磁道。在沿磁道分布方向上,单位长度内的磁道数目,叫道密度。常用的道密度单位为TPI(每英寸磁道数)和TPM(每毫米磁道数)。在沿磁道方向上,单位长度内存放的二进制信息的数目叫位密度。常用的位密度单位为BPI(每英寸二进制位数)和 BPM(每毫米二进制位数)。
(2)存储容量
存储容量是指整个存储器所能存放的二进制信息量。它与磁表面大小和记录密度密切相关。
3)平均存取时间
磁表面存储器的读写是在磁层相对磁头做匀速运动的过程中完成的。由于主机对存储器读写数据的随机性,很难保证磁层上所需要读写的数据块位置正好处于磁头下方。因此,存取时间应包括磁头定位和数据传输等多个部分的时间。
(4)数据传输速率
数据传输速率是指磁表面存储器完成磁头定位和旋转等待以后,单位时间内从存储介质上读出或写入的二进制信息量。
4.数据记录方式
数据记录方式是指将数字信息转换成磁层表面的磁化单元所采用的各种方式。由于磁化过程是通过在磁头中通以不同方向的电流来实现的,故记录方式取决于写电流波形的组合方式。记录方式的选取将直接影响到记录密度、存储容量、传送速率以及读写的控制逻辑。
数据记录方式按照写信息所施加的电流波形的极性、频率和相位的不同,分为归零制、不归零制、调相制和调频制等。
6.2.2 硬盘存储器
硬盘存储器具有记录密度高、容量大、速度快等优点,是目前计算机存储系统中使用最普遍的一种外部存储器。
磁盘存储器有硬盘和软盘两种,软盘因携带方便、价格便宜而曾经被广泛使用,但近年来由于U盘的出现,使得软盘逐步被容量大、使用和携带更方便的U盘所淘汰。因此,以下主要介绍硬盘存储器。
硬盘存储器主要由磁记录介质、硬盘驱动器、硬盘控制器三大部分组成。硬盘控制器包括控制逻辑、时序电路、“并一串”转换和“串一并”转换电路。硬盘驱动器包括读写电路、读/写转换开关、读/写磁头与磁头定位伺服系统。
1.硬盘驱动器
图6.3是硬盘驱动器的物理组成和内部逻辑结构示意图。
图6.3(a)所示是硬盘驱动器的物理组成,主要由1~5张硬盘片、主轴、主轴电机、移动臂、磁头和控制电路等部分组成,通过接口与硬盘控制器连接,每个盘片的两个面上各有一个磁头( head),因此,磁头号就是盘面号。磁头和盘片相对运动形成的圆构成一个磁道( track),磁头位于不同的半径上,则得到不同的磁道。多个盘片上相同磁道形成一个柱面(cylinder),所以,磁道号就是柱面号。信息存储在盘面的磁道上,而每个磁道被分成若干扇区(sector),按扇区为单位进行磁盘读写。
早期的磁盘采用的是低密度存储方式,所有磁道上的扇区数相同,也即每个磁道上的位数相同,因而内道上的位密度比外道位密度高。现在的磁盘多采用高密度存储方式,也即每个磁道上的位密度相同,因而外道上的扇区数比内道上扇区数多,因而整个磁盘的容量比低密度盘高得多。
图6.3(b)所示是硬盘驱动器的内部逻辑结构。磁盘读写是指根据盘地址(柱面号、磁头号、扇区号)读写目标磁道中的指定扇区。因此,其操作可归纳为寻道、旋转等待和读写三种。
寻道操作:硬盘控制器把盘地址送到硬盘驱动器的磁盘地址寄存器后,便产生寻道命
令,启动磁头定位伺服系统进行磁头定位操作。此操作完成后,发出寻道结束信号给硬盘控制器,并转入旋转等待操作。
旋转等待操作:盘片旋转时,索引标志产生的脉冲将扇区计数器清零,以后每来一个扇区标志,扇区计数加1,把计数内容与磁盘地址寄存器中的扇区地址进行比较,如果一致,则输出扇区符合信号,说明要读写的信息已经转到磁头下方。
读写操作:扇区符合信号送给控制器后,控制器的读写控制电路开始动作。如果是写操作,就将数据送到写入电路,写入电路根据记录方式生成相应的写电流脉冲;如果是读操作,则由读出放大电路读出内容送硬盘控制器。
2.硬盘控制器
硬盘控制器是主机与硬盘驱动器之间的接口。硬盘存储器是高速外设,所以硬盘控制器和主机之间采用成批数据交换方式。
磁盘上的数据由磁头读出后送到读出放大器,然后进行数据与时钟的分离,再进行串/并数据转换和格式变换送到数据缓冲器,经DMA控制将数据传送到主存储器。
3.磁盘的记录格式
数据在磁盘上的记录格式分定长记录格式和不定长记录格式两种。目前大多采用定长记录格式。图6.4是温切斯特磁盘的磁道格式示意图,它采用定长记录格式。最早的硬磁盘由IBM公司开发,称为温切斯特(Winchester,是一个地名)盘,简称温盘,它是几乎所有现代硬盘产品的原型。
每个磁道由若干个扇区(也称扇段)组成,每个扇区记录一个数据块,由头空、ID域、间隙、数据域和尾空组成。头空占17个字节,不记录数据,用全1表示,磁盘转过该区域的时间是留给磁盘控制器做准备用的;ID域有同步字节、磁道号、磁头号、扇段号和相应的CR码组成,同步字节标志ID域的开始;数据域占515个字节,有同步字节、数据和相应的CRC码组成,其中真正的数据区占512字节;尾空是在数据块的CRC码后的区域,占20个字节,也用全1表示。
4.硬盘的主要技术指标
硬盘的未格式化容量是指按道密度和位密度计算出来的容量,它包括了头空、ID域、 CRC码等信息,是可利用的所有磁化单元的总数,未格式化容量(或非格式化容量)比格式化后的实际容量要大。
对于低密度存储方式,因为每个磁道的容量相等,所以,其未格式化容量的计算方法为:
磁盘总容量=记录面数x理论柱面数x内圆周长x位密度
由于磁盘每面的有效记录区域是一个环,磁道在这个环内沿径向分布,故理论上的柱面数应该等于:(有效记录区外径-有效记录区内径)÷2x道密度。此外,对于每个磁道具有同样多信息的磁盘,其内圆磁道的记录密度最大,一个磁道能记录的二进制信息位的理论值应等于内圆周长x位密度。
格式化后的实际容量只包含数据区。通常,记录面数约为盘片数的两倍。假定按每个扇区512字节算,磁盘实际数据容量(也称格式化容量)的计算公式为:
磁盘实际数据容量=2x盘片数x磁道数/面x扇区数/磁道x512B/扇区
早先扇区大小一直是512字节,但最近几年已逐步更换到更大、更高效的4096字节扇区,通常称为4K扇区。国际硬盘设备与材料协会(IDEMA)将之称为高级格式化。
前面已经提到,数据传输率是单位时间内从磁盘盘面上读出或写入的二进制信息量。由于磁盘在同一时刻只有一个磁头进行读写,所以数据传输率等于单位时间内磁头划过的磁道弧长乘以位密度,即:
数据传输率=每分钟转速÷60x内圆周长x位密度
磁盘响应读写请求的过程如下:首先将读写请求在队列中排队,出队列后由磁盘控制器解析请求命令,然后进行寻道、旋转等待和读写数据三个过程。
因此,总的响应时间的计算公式为:
响应时间=排队延迟+控制器时间+寻道时间+旋转等待时间+数据传输时间
磁盘上的信息以扇区为单位进行读写,上式中后面三个时间之和称为平均存取时间T,即:
T=寻道时间+旋转等待时间+数据传输时间
寻道时间为磁头移动到指定磁道所需时间;旋转等待时间是指要读写的扇区旋转到磁头下方所需要的时间;数据传输时间(transfertime)是指传输一个扇区的时间(大约0.01ms/扇区)。由于磁头原有位置与要寻找的目的位置之间远近不一,故寻道时间和旋转等待时间只能取平均值。磁盘的平均寻道时间一般为5~10ms,平均等待时间取磁盘旋转一周所需时间的一半,大约4~6ms。假如磁盘转速为6000转/min,则平均等待时间约为5ms。因为数据传输时间相对于寻道时间和等待时间来说非常短,所以,磁盘平均存取时间通常近似等于平均寻道时间和平均等待时间之和。
硬盘驱动器与主机的接口有多种,一般文件服务器使用SCSI接口,而普通的PC机前些年多使用并行ATA(即IDE)接口,目前大多使用串行ATA(即 SATA)接口。
6.2.3 冗余磁盘阵列
计算机发展过程中,人们比较注重处理器和主存性能的改进,而对辅存性能的改进不太注重,因而造成CPU和主存的性能提高得比辅存快,使总体性能提高不均衡。为了改善磁盘存储器的性能,1988年美国加州大学伯克利分校一个研究小组提出了一种称为RAID(Redundant Arrays of Inexpensive Disk),即廉价磁盘冗余阵列的技术,大大改善了辅存的性能。(星省志
RAID 技术的基本思想是:将多个独立操作的磁盘按某种方式组织成磁盘阵列,以增加容量;利用类似于主存中的多模块交叉技术,将数据存储在多个盘体上,通过使这些盘并行工作来提高数据传输速度;并用冗余磁盘技术来进行错误恢复以提高系统可靠性。
RAID 技术有以下3个特性:
①RAID由一组物理磁盘驱动器组成,在操作系统下它们被视为单个逻辑驱动器。
②数据分布在一组物理磁盘上,可以连续分布也可以交叉分布,交叉分布时可以按小条带交叉分布,也可以按大数据块交叉分布。
③冗余磁盘用于存储校验信息,保证磁盘万一损坏时能恢复数据。
目前已知的RAID方案分为8级(0~7级),并由此派生出RAID10(结合0和1级)和 RAID 30(结合0和3级)以及RAID50(结合0和5级)。但这些级别不是简单地表示层次关系,而是表示具有上述3个共同特性的不同设计结构。
RAID 0不遵循以上特性③,没有冗余,数据分布在多个物理磁盘上,适用于容量和速度要求高的非关键数据存储的场合。
RAID1采用镜像盘实现一对一冗余,因而可靠性高,但价格昂贵,常用于可靠性要求很高的场合。
RAID2用海明校验生成多个冗余校验盘,因为采用海明码,所以校验盘与数据盘成正比,因而冗余信息开销太大,价格较贵,所以RAID2已不再被使用。
RAID3采用奇偶校验生成单个冗余盘,并使用小条带交叉分布方式,数据传输率高,但
I/O响应时间较长。
RAID4也采用一个冗余盘存放奇偶校验位,不过RAID4采用的是大数据块交叉方式,每个磁盘的操作独立进行,所以多个小数据量的操作可以在多个磁盘上并行进行,以同时响应多个I/O请求,具有较快的I/O响应时间,可用于银行、证券等事务处理系统。RAID4的数据恢复方式与RAID3相同,比较容易。但对于写操作,因为每次写都要对校验盘进行相应的校验数据更新,因而校验盘成为I/O瓶颈。
RAID 5与RAID4的组织方式类似,只是奇偶校验块分布在各个磁盘中,所以所有磁盘地位等价,可提高容错性,并且避免了使用专门校验盘时潜在的I/O瓶颈。与RAID4一样,采用独立存取技术和大数据块交叉分布方式,I/O请求的响应速度快。由此可见,RAID 5成本不高但效率高,因而被广泛使用。
RAID 6与 RAID 4和RAID5一样,采用独立存取技术和大数据块交叉分布方式,所不同的是RAID6的冗余信息分布在所有磁盘上并采用双维块奇偶校验。因此,可用于要求数据绝对不能出错的场合。由于引入了两个奇偶校验值,因而控制器的设计变得十分复杂,写入速度也比较慢,用于计算奇偶校验值和验证数据正确性所花费的时间比较多。由此可见,RAID 6以增大时间开销为代价保证了高度可靠性。
RAID 7是带cache的磁盘阵列,它在RAID 6的基础上,采用cache技术使传输率和响应速度都有较大提高,cache分块大小和磁盘阵列中数据分块大小相同,一一对应。有两个独立的 cache,双工运行。在写入时将数据同时分别写入两个独立的cache,这样,即使其中有一个cache出故障,数据也不会丢失。写入磁盘阵列以前,先写人cache中,然后,同一磁道的信息在一次操作中完成;读出时,先从cache中读出,cache中没有要读的信息时,才从 RAID 中读。RAID 7将cache和RAID技术结合,弥补了RAID的不足,从而以高效、快速、大容量、高可靠性,以及灵活方便的存储系统提供给用户。
6.2.4 U盘和固态硬盘
随着计算机技术与应用的发展,近年来开始普遍使用U盘进行信息存储和交换。
U盘也称为闪存盘,与上述硬盘不同,它不是磁表面存储器,而是采用flash存储器(即闪存)做成,属于非易失性半导体存储器。闪存沿用了EPROM的简单结构和浮栅/热电子注入的编程写人方式,又兼备EPROM的可擦除特点,可在计算机内进行擦除和编程写人,因此又称为快擦型电可擦除重编程ROM。U盘体积小、重量轻、容量比软盘和光盘大得多,而且可以具有保护功能,使用寿命可长达数年之久。而且,利用USB接口,可以与几乎所有计算机连接。
比U盘容量更大的用作计算机系统数据备份的移动设备是移动硬盘。它是由微型硬盘配上特制的硬盘盒构成的一个大容量存储器,通过USB和IEEE 1394接口和计算机连接,可以随时插拔。其优点是容量大、兼容性好、速度快、体积小、重量轻、携带方便、安全可靠。
近年来一种称为固态硬盘(Solid State Disk,简称SSD)的新产品开始在市场上出现,也被称为电子硬盘。这种硬盘并不是一种磁表面存储器,而是一种使用NAND闪存组成的外部存储系统,和U盘并没有本质差别,只是容量更大,存取性能更好。
与硬盘一样,SSD通过标准的硬盘接口(SATA或USB)插槽连接到主机上,其外部接口
的行为和硬盘一样,处理的也是来自CPU的磁盘逻辑块的读写请求,文件系统以逻辑块为单位在SSD上为文件分配空间。SSD中包含一个或多个闪存芯片和闪存翻译层(flash translation layer),其中的闪存芯片相当于硬盘驱动器,闪存翻译层相当于磁盘控制器,用于把对逻辑块的请求转换成对底层闪存芯片的访问。因此,SSD也和硬盘一样支持随机读写。由于闪存芯片中写的过程是先进行区块擦除(使一个区块中全都变成“1”状态),然后再在需要的地方改写为“0”,因此SSD的读性能要好于写性能。顺序读比顺序写大致快一倍,而随机读比随机写大致快10倍。
SSD中一个闪存芯片由若干个区块组成,每个区块由若干页组成,通常,页大小为512B~4KB,每个区块由32~128个页组成,因而区块大小为16KB~512KB,数据可以按页为单位进行读写。当需要写某页信息时,必须先对该页所在的区块进行擦除操作。一旦一个区块被擦除过,区块中的每一页就可以直接再写一次。若某一区块进行了大约100000次重复写之后,就会被磨损而变成坏的区块,不能再被使用。因此,闪存翻译层中有一个专门的均化磨损(wear leveling)逻辑电路,试图将擦除操作平均分布在所有区块上,以最大限度地延长 SSD的使用寿命。
电信号的控制使得固态硬盘的内部传输速率远远高于常规硬盘。SSD随机读访问时间(延时)大约为几十微秒,而随机写的访问时间(延时)大约为几百微秒。硬盘由于需要寻道和旋转等待,所以其访问时间大约是几毫秒到几十毫秒,因此,SSD随机读写延时比硬盘要低两个数量级。有测试显示,使用固态硬盘以后,Windows的开机速度可以被提升至20s以内,这是基于常规硬盘的计算机系统难以达到的速度性能。
与常规硬盘相比,除速度性能外,固态硬盘还具有抗震动好、安全性高、无噪音、能耗低、发热量低和适应性高的特点。由于不需要电机、盘片、磁头等机械部分,固态硬盘工作过程中没有任何机械运动和震动,因而抗震性好,使数据安全性成倍提高,并且没有常规硬盘的噪音;由于不需要电动机工作,固态硬盘的能耗也得到了成倍的降低,只有传统硬盘的1/3甚至更低,延长了靠电池供电设备的连续运转时间;且由于没有电机等机械部件,其发热量大幅降低,延长了其他配件的使用寿命。此外,固态硬盘的工作温度范围很宽(-40~85℃),因此,其适应性上也远高于常规硬盘。
固态硬盘在刚出现时与最高速的常规硬盘相比在读写性能方面各有上下,而且价格也较高。但随着相应技术的不断发展,目前固态硬盘的读写性能基本上超越了常规硬盘,且价格也不断下降。由于固态硬盘具有以上优点,加上其今后的发展潜力比传统硬盘要大得多,因而固态硬盘有望逐步取代传统硬盘。
6.3 外设与CPU、主存的互连
计算机由CPU、主存储器和各种I/O外部设备组成。计算机的所有功能都是通过CPU执行指令实现的。在指令执行过程中,CPU、主存和外设之间要不断地交换信息(包括数据、指令和中断向量等),因此,可以说计算机所有功能的实现,归根结底是各种信息在计算机内部的各部件之间进行交换的过程。要进行信息交换,必须在部件之间构建通信线路,通常把连接各部件的通路的集合称为互连结构。
6.3.1 总线概述
部件之间的互连方式有两种,一种是各部件之间通过单独的连线互连,这种方式称为分散连接。另一种是将多个部件连接到一组公共信息传输线上,这种方式称为总线连接。总线连接结构的两个主要优点是灵活和成本低。它的灵活性体现在新部件可以很容易地加到总线上,并且部件可以在使用相同总线的计算机系统之间互换。因为一组单独的连线可被多个部件共享,所以总线的性价比高。总线的主要缺点是它可能产生通信瓶颈。
总线是计算机内数据传输的公共路径,用于实现两个或两个以上部件之间的信息交换。计算机系统中有多种总线,它们在各个层次上提供部件之间的连接和信息交换通路。内部总线指芯片内部连接各元件的总线。例如,CPU芯片内部在各个寄存器、ALU、指令部件等各元件之间互连的总线。
系统总线指连接CPU、存储器和各种I/O模块等主要部件的总线,通常所说的总线是指这类总线。
系统总线通常由一组控制线、一组数据线和一组地址线构成。也有些总线没有单独的地址线,地址信息通过数据线来传送,这种情况为数据线和地址线复用,称为信号线复用。
数据线用来承载在源部件和目的部件之间传输的信息,这个信息可能是数据、指令或地址(如果数据线和地址线复用的话)。
地址线用来给出源数据或目的数据所在的主存单元或I/O端口的地址。例如,若要从主存单元读一个数据,那么CPU必须将该主存单元的地址送到地址线上,地址线是单向的。若要输出一个数据到外设,那么CPU也必须把该外设的地址(实际上是I/0端口的地址)送到地址线上。
控制线用来控制对数据线和地址线的访问和使用。因为数据线和地址线是被连接在其上的所有设备共享的,如何使各个部件在需要时使用总线,需靠控制线来协调。控制线用来传输定时信号和命令信息。除地址线和数据线以外的通信线都称为控制线,如时钟线、复位线、操作命令线、总线请求和总线回答线等,可能还包含电源线和地线。
传统的系统总线多是同步总线。同步总线采用公共的时钟信号进行定时,挂接在总线上的所有设备都从时钟线上获得定时信号。同步总线的传输协议非常简单,只要在规定的第几个时钟周期内完成特定的操作即可。例如,对于处理器通过总线访问存储器的操作来说,可以规定以下“存储器读操作”协议:主控设备(发出总线控制命令的设备,如处理器)在第一个时钟周期发送地址和存储器读命令(可利用控制线表明请求的类型为“存储器读”),从设备(接受总线控制命令的设备,如存储器)总是在第5个时钟周期将数据放到总线上作为响应,主控设备也在第5个时钟周期从数据线上取数据。同步通信方式有两个缺点:第一,总线定时以最慢设备所用时间为标准,所以同步总线适合于存取时间相差不大的多个功能部件之间的通信;第二,由于时钟偏移问题,导致同步总线不能过长,否则将会降低总线传输效率。同步总线通常采用并行传输方式,即总线的数据线条数为8位、16位、32位或64位等,同时并行传输的这些数据位信号的定时必须相同,因此,实现更快传送速度、更长传输线的总线时,会导致传送到另一端时的波形发生变形,从而导致所有位中最快和最慢的位信号之间的时间偏差较大。
由于同步总线的上述问题,现在越来越多的总线采用异步串行方式进行传输。因为串行传输方式要求每次在一根信号线上传送数据位,传输速率可以比并行总线高得多,而且,
因为每个位各自传输,因而传输时延的细微变化不会影响其他数据位的传送。通过多个数据通道的组合,可以实现比传统并行总线高得多的数据传输带宽。
总线的性能指标通常包含以下几个方面。
(1)总线宽度
总线中数据线的条数称为总线宽度,它决定了同时传输的信息位数。并行传输总线的总线宽度为16位、32位、64位或128位等。
(2)总线的工作频率
总线的工作频率(也称为总线时钟频率)指用于总线上对各种操作进行定时的时钟信号的频率。通常以MHz或GHz为单位。
(3)总线的带宽
总线带宽指总线的最大数据传输率,即总线在进行数据传输时单位时间内最多可传输的数据量,不考虑其他如总线裁决、地址传送等所花的时间。总线带宽的计算公式为:
B=WxF/N
其中,W为总线宽度,通常以字节为单位;F为总线时钟频率;N为完成一次数据传送所用的时钟周期数。
例6.1 假定某同步总线在一个总线时钟周期内传送一个4字节的数据,总线时钟频率为33MHz,则总线带宽是多少?如果总线宽度改为64位,一个时钟周期能传送两次数据,总线时钟频率为66MHz,则总线带宽为多少?提高了多少倍?
解:由同步总线带宽计算公式,可得总线带宽为4Bx33 MHz/1=132 MB/s;总线性能改进后的总线带宽为8Bx66MHz/0.5=1 056 MB/s,提高了8倍。
(4)总线的寻址能力
总线的寻址能力主要指由地址线位数所确定的可寻址地址空间的大小。例如,若地址线有16位,不采用分时多次传送地址的话,则可访问的存储单元最多只能有2"个。
(5)总线的定时方式
按照总线上信息传送的定时方式来分,有同步通信、异步通信和半同步通信三类。同步通信总线由时钟信号同步;异步通信总线指前一个信号的结束就是下一个信号的开始,信息的改变是顺序的;半同步通信总线则是同步和异步两类总线定时方式的结合。
(6)总线的突发传送
总线上数据传送分正常的非突发方式和突发方式两种。正常的传送方式在每个传送周期内都是先传送地址,再传送数据。在突发(burst)传送方式下,总线能够进行连续的成块数据传送,传送开始时,先给出数据块在存储器中的首地址,然后连续地传送数据块,后续数据的地址默认为前面数据的地址加1。突发传送无需在地址线上传送后续数据的地址信息,因而在总线宽度和总线时钟频率相同的情况下,比正常传送方式的数据传输率高。
(7)总线的负载能力
总线的负载能力指总线上所能挂接的遵循总线电气规范的总线设备的数目。由于总线上只有扩展槽能由用户使用,所以总线的负载一般指总线上扩展槽的个数。
6.3.2 基于总线的互连结构
图6.5给出了一个传统的基于总线互连的计算机系统结构示意图,在其互连结构中,除了CPU、主存储器以及各种接插在主板扩展槽上的I/O控制卡(如声卡、视频卡)外,还有北桥芯片和南桥芯片。这两块超大规模集成电路芯片组成一个“芯片组”,是计算机中各个组成部分相互连接和通信的枢纽。主板上所有的存储器控制功能和I/O控制功能几乎都集成在芯片组内,它既实现了总线的功能,又提供了各种I/O接口及相关的控制功能。其中,北桥是一个主存控制器集线器(MemoryController Hub,简称MCH)芯片,本质上是一个DMA(Direct Memory Access)控制器,因此,可通过MCH芯片,直接访问主存和显卡中的显存。南桥是一个I/O控制器集线器(I/OController Hub,简称ICH)芯片,其中可以集成USB控制器、磁盘控制器、以太网络控制器等各种外设控制器,也可以通过南桥芯片引出若干主板扩展槽,用以接插一些I/O控制卡,如声卡、视频卡(显卡)、网卡等。
如图 6.5 所示,CPU与主存之间由处理器总线(也称为前端总线)和存储器总线相连,各类I/O设备通过相应的设备控制器(例如,USB控制器、以太网卡、磁盘控制器)连接到 I/O总线上,而I/O总线通过桥接器与主存和CPU连接。
传统上,系统总线分为处理器一存储器总线和I/O总线。处理器一存储器总线比较短,通常是高速总线,有的系统将处理器总线和存储器总线分开,中间通过北桥芯片(桥接器)连接, CPU芯片通过CPU插座插在处理器总线上,内存条通过内存条插槽插在存储器总线上。
下面对处理器总线、存储器总线和I/O总线进行简要说明。
1.处理器总线
早期的 Intel微处理器的处理器总线称为前端总线(Front Side Bus,简称FSB),它是主板上最快的总线,主要用作处理器与北桥芯片进行信息交换。
FSB的传输速率单位实际上是MT/s,通常所说的总线传输速率单位MHz是习惯上的称呼,实际上是时钟频率单位。早期的FSB每个时钟传送一次数据,因此时钟频率与数据传输速率一致。但是,从Pentium Pro开始,FSB 采用“quad pumped”技术,在每个总线时钟周期内传4次数据,也就是说,总线的数据传输速率等于总线时钟频率的4倍,若时钟频率
为333 MHz,则数据传输速率为1333MT/s,即1.333 CT/s,但习惯上称1333MHz。例如, Intel Xeon 5400处理器的前端总线运行速度可以是266MHz( 1 066 MT/s)、333 MHz(1 333 MT/s)或者400 MHz(1 600MT/s)。若前端总线的工作频率为1333MHz(实际时钟频率为333 MHz),总线宽度为64位,则总线带宽为10.664GB/s。对于多CPU芯片的多处理器系统,则多个CPU芯片通过一个FSB进行互连,也即多个处理器共享一个FSB。
Intel Corei7是一个4核处理器芯片,Intel推出Corei7时,北桥芯片的功能被集成到了 CPU芯片内,CPU通过存储器总线(即内存条插槽)直接和内存条相连,而在CPU芯片内部的核与核之间、CPU芯片与其他CPU芯片之间,以及CPU芯片与IOH(Input/Output Hub )芯片之间,则通过QPI(QuickPath Interconnect)总线相连。
QPI总线是一种基于包传输的串行高速点对点连接协议,采用差分信号与专门的时钟信号进行传输。QPI总线有20条数据线,发送方(TX)和接收方(RX)有各自的时钟信号,每个时钟周期传输两次。一个QPI数据包包含80位,需要两个时钟周期或4次传输,才能完成整个数据包的传送。在每次传输的20位数据中,有16位是有效数据,其余4位用于循环冗余校验,以提高系统的可靠性。由于QPI是双向的,在发送的同时也可以接收另一端传输来的数据,这样,每个QPI总线的带宽计算公式如下:
每秒传输次数x每次传输的有效数据x2
QPI 总线的速度单位通常为GT/s,若QPI的时钟频率为2.4GHz,则速度为4.8 GT/s,表示每秒钟传输4.8G次数据,并称该QPI频率为4.8GT/s,此时总带宽是4.8 GT/sx2 Bx2=19.2 GB/s。QPI频率为6.4GT/s时的总带宽是6.4 GT/sx2 Bx2=25.6 GB/s。
图6.6 给出了 IntelCorei7中核与核之间、核与主存控制器之间以及各级cache之间的互连结构。
从图6.6可以看出,一个Corei7处理器中有4个CPU核(Core),每两个核之间都用 QPI总线互连,并且每个核还有一条QPI总线可以与IOH芯片互连。处理器支持三通道 DDR3 SDRAM内存条插槽,因此,处理器中包含有三个DDR3SDRAM存储器控制器,并有三个并行传输的存储器总线,也意味着有三组内存条插槽。
2.存储器总线
早期的存储器总线由北桥芯片控制,处理器通过北桥芯片和主存储器、图形卡(显卡)以及南桥芯片进行互连。Corei7以后的处理器芯片中集成了内存控制器,因而,存储器总线直接连接到处理器。如图6.6所示,主存储器可直接插在三通道DDR3-1333SDRAM的内存插槽(存储器总线)上。
根据芯片组设计时确定的芯片组能够处理的主存类型的不同,存储器总线有不同的运行速度。如图6.6所示的计算机中,存储器总线宽度为64位,每秒钟传输1333M次,总线带宽为1333 Mx64/8=10.66GB/s,因而三个通道的总带宽为32GB/s,与此配套的内存条型号为DDR3-1333 SDRAM。
3.I/O 总线
I/O总线用于为系统中的各种I/O设备提供输入/输出通路,在物理上通常是主板上的一些I/O扩展槽。早期的第一代I/O总线有XT总线、ISA 总线、EISA 总线、VESA 总线,这些I/0总线早已被淘汰;第二代I/O总线包括PCI、AGP、PCI-X;第三代I/O总线是 PCI-Express.
与前两代I/O总线采用并行传输的半同步总线不同,PCI-Express总线采用串行传输方式。两个PCI-Express设备之间以一个链路(link)相连,每个链路可包含多条通路(lane),可能的通路数为1、2、4、8、16或32,PCI-Expressxn表示具有n个通路的PCI-Express链路。
每条通路由发送和接收数据线构成,在发送和接收两个方向上都各有两条差分信号线,可同时发送和接收数据。在发送和接收过程中,每个数据字节实际上被转换成了10位信息被传输,以保证所有位都含有信号电平的跳变。这是因为在链路上没有专门的时钟信号,接收器使用锁相环(PLL)从进入的位流0-1和1-0跳变中恢复时钟。
PCI-Express 1.0规范支持通路中每个方向的发送或接收速率为2.5 Gb/s。因此,PCI- Express 1.0总线的总带宽计算公式(单位为GB/s)如下:
2.5 Gb/sx 2x通路数/10
根据上述公式可知,在PCI-Express1.0规范下,PCI-Expressx1的总带宽为0.5GB/s; PCI-Express x2的总带宽为1GB/s;PCI-Express x16的总带宽为8 GB/s。
将北桥芯片功能集成到CPU芯片后,主板上的芯片组不再是传统的三芯片结构(CPU+北桥+南桥)。根据不同的组合,现在有多种主板芯片组结构,有的是双芯片结构(CPU+ PCH),有的是三芯片结构(CPU +I0H +ICH)。其中,双芯片结构中的PCH(Platform Controller Hub)芯片除了包含有原来南桥(ICH)的I/O控制器集线器的功能外,以前北桥中的图形显示控制单元、管理引擎(Management Engine,简称ME)单元也集成到了PCH中,另外还包括NVRAM((Non-VolatileRandom Access Memory)控制单元等。也就是说,PCH比以前南桥的功能要复杂得多。
图 6.7 给出了一个基于Intel Corei7系列三芯片结构的单处理器计算机系统互连示意图。
图6.7 基于IntelCorei7系列处理器的计算机互连结构举例
如图6.7所示,Corei7处理器芯片直接与三通道DDR3SDRAM主存储器连接,并提供一个带宽为25.6GB/s的QPI总线,与基于X58芯片组的IOH芯片相连。图中每个通道所配内存条型号为DDR3-1066,因此每个通道的存储器总线带宽为64 b/8x1066 MT/s=8.5 GB/s。
图6.7中IOH的重要功能是提供对PCI-Express2.0的支持,最多可支持36 条PCI-Ex- press2.0通路,可以配置为一个或两个PCI-Express 2.0x16的链路,或者4个 PCI-Express
2.0x8 的链路,或者其他的组合,如8个PCI-Express2.0x4的链路等。这些PCI-Express链路可以支持多个图形显示卡。
IOH与ICH芯片(ICH10或ICH10R)通过DMI(DirectMedia Interface)总线连接。DMI采用点对点的连接方式,时钟频率为100MHz,因为上行与下行各有1GB/s的数据传输率,因此总带宽达到2GB/s。ICH芯片中集成了相对慢速的外设I/O接口,包括:6个PCI- Expressx1接口,10/100/1000Mbps网卡接口、集成声卡(HDAudio)、6个 SATA硬盘控制接口和 12个支持USB2.0标准的USB接口。若采用ICH10R芯片,则还支持RAID 功能,也即 ICH1OR芯片中还包含RAID控制器,所支持的RAID等级有 SATA RAID 0、RAID 1、 RAID 5、RAID 10等。
6.4 I/O接口
外部设备种类繁多,且具有不同的工作特性,因而它们在工作方式、数据格式和工作速度等方面存在很大差异。此外,由于CPU、内存等计算机主机部件采用高速元器件,使得它们和外设之间在技术特性上有很大的差异,它们各有自己的时钟和独立的时序控制,两者之间采用完全的异步工作方式。为此,在各个外设和主机之间必须要有相应的逻辑部件来解决它们之间的同步与协调、工作速度的匹配和数据格式的转换等问题,该逻辑部件就是外设的I/0接口。
6.4.1 I/O 接口的基本概念
外设的/O接口又称设备控制器或I/O控制器或IO控制接口,也称为I/O模块,是介于外设和I/O总线之间的部分。不同的外设往往对应不同的设备控制器。
各种I/O控制器或设备控制器(包括适配器或适配卡)都是I/O接口,而在有些大型机中的I/O模块就是担负大量复杂的外设控制任务的通道或I/0处理器。
设备控制器通常独立于I/O设备,可以集成在主板上(即ICH芯片内)或以插卡的形式插在I/O总线扩展槽上。例如,图6.5和图6.7中的磁盘控制器、以太网卡(网络控制器)、 USB控制器、声卡、视频卡(显卡)等都是一种外设I/0接口。
外设的I/O接口根据从CPU接收到的控制命令来对相应外设进行控制。它在主机侧与I/O总线相连,在外设一侧提供相应的连接器插座,在插座上连上相应的连接外设的电缆,就可以将外设通过相应的I/O接口连接到主机。
图6.8给出了常用的几种连接外设的插座。例如,键盘和鼠标可以连接在PS/2插座(图6.8中的键盘接口和鼠标器接口处的插座)上,也可以连在USB接口上。目前很多外设都连接在 USB 接口上。
6.4.2 I/O接口的功能
I/O接口是连接外设和主机的一个“桥梁”,因此它在外设侧和主机侧各有一个接口。通常把它在主机侧的接口称为内部接口,在外设侧的接口称为外部接口。内部接口通过 I/O总线和内存、CPU相连,而外部接口则通过各种I/O接口电缆(如USB线、IEEE 1394线、串行电缆、并行电缆、网线或SCSI电缆等)将其连到外设上。因此,通过I/0接口,可以在CPU、主存和外设之间建立一个高效的信息传输“通路”,这个通路就是“CPU和内存一 I/O总线一I/0接口(I/O控制器)一I/0接口电缆一外设”。
I/O接口的职能可概括为以下几个方面。
(1)数据缓冲:由于主存和CPU寄存器的存取速度非常快,而外设速度则较低,所以在 I/O 接口中引入数据缓冲寄存器,以达到主机和外设工作速度的匹配。
(2)错误或状态检测:在I/O接口中提供状态寄存器,以保存各种状态信息,供CPU查用。例如,设备是否完成打印或显示;是否已准备好输入数据以供主机来读取;是否发生缺
纸等某种出错情况。接口和外设发生的出错情况有两类:一类是设备电路故障或异常情况:另一类是数据传输错,这种错误是通过在每个字符上采用一个校验码来检测的。
(3)控制和定时:接受从系统总线来的控制命令和定时信号,并提供控制和定时逻辑以实现对数据通信过程的控制。控制命令指通过系统总线中的数据线传送到控制寄存器中的命令字,I/O接口中的外设界面控制逻辑根据对命令字的译码结果来控制I/O接口与设备之间的数据通信过程。
(4)数据格式转换:提供数据格式转换部件(如进行串一并转换的移位寄存器),使通过外部接口得到的数据转换为内部接口需要的格式,或在相反的方向进行数据格式转换。例如,从磁盘驱动器以二进制位的形式读出或写人后,在磁盘控制器中,应对读出的数据进行串一并转换,或对写入的数据进行并一串转换。
6.4.3 I/O接口的通用结构
不同的I/O接口在复杂性和控制外设的数量上相差很大,不可能一一列举。图6.9给出了一个I/O接口的通用结构。
如图6.9 所示,I/O接口在主机侧通过I/O总线与内存、CPU相连。通过其中的数据线,在数据缓冲寄存器与内存或CPU的寄存器之间进行数据传送。同时,接口和设备的状态信息被记录在状态寄存器中,通过数据线将状态信息送到CPU,以供查用。CPU对外设的控制命令(命令字)也是通过数据线传送,一般将其送到I/O接口的控制寄存器。从功能上来说,状态寄存器和控制寄存器在传送方向上是相反的,而且CPU对它们的访问在时间上一般是错开的,因此有的I/O接口中将它们合二为一。
早期的I/O总线都是采用并行传输方式的共享式总线,其中有相应的地址线,用于给出要访问的I/O接口中寄存器的地址信息,它和读/写控制信号一起被送到I/0接口中的I/O控制逻辑中,其中地址信息用以选择和主机交换数据的寄存器,通过控制线传送来的读/写控制信号(如I/O读、I/O写等)也有可能参与地址译码,例如,可以用I/0读、I/O写信号来确定选中的是接收寄存器(I/O写)还是发送寄存器(I/0读)。此外,控制线中还有一些仲裁信号和握手信号等也可被I/O接口使用。I/O接口中的I/O控制逻辑还要能对控制寄存器中的命令字进行译码,并将译码得到的控制信号通过外设界面控制逻辑送到外设,同时将数据缓冲寄存器的数据发送到外设或从外设接收数据到数据缓冲寄存器。另外,还要具有
收集外设状态到状态寄存器的功能。
有了设备控制器这一类的I/0接口,底层I/0软件(如设备驱动程序、中断服务程序)就可以通过I/O接口来控制外设,因而编写底层I/O软件的程序员只需要了解I/O接口的工作原理,包括:其中有哪些用户可访问的寄存器、控制/状态寄存器中每一位的含义、I/C接口与外设之间的通信协议等,而关于外设的机械特性,程序员则无需了解。
在底层I/O软件中,可以将控制命令送到控制寄存器来启动外设工作;可以读取状态寄存器来了解外设和I/O接口的状态;可以通过直接访问数据缓冲寄存器来进行数据的输人和输出。当然,这些对数据缓冲寄存器、控制寄存器、状态寄存器的访问操作是通过相应的指令来完成的,通常把这类指令称为I/O指令。因为这些I/O指令只能在操作系统内核的底层I/O软件中使用,因而它们是一种特权指令。
例如,在IA-32 中,提供了4条专门的I/O指令:IN、INS、OUT 和 OUTS,其中的IN指令用于将I/O接口中某个寄存器的内容取到CPU内的通用寄存器中;OUT指令用于将通用寄存器的内容输出到I/O接口的某个寄存器中。
6.4.4 I/0端口及其编址
如何在I/O指令中标识要访问的I/O接口中的某个寄存器呢?这就是I/O端口的编址问题。I/O端口实际上就是I/O接口中的寄存器,例如,数据缓存寄存器就是数据端口,控制/状态寄存器就是控制/状态端口。为了便于CPU对I/O设备的快速选择和对I/O端口的方便寻址,必须给所有I/0接口中各个可访问的寄存器进行编址,有独立编址和统一编址两种方式。
1.独立编址方式
独立编址方式对所有的I/0端口单独进行编号,使它们成为一个独立的I/O地址空间。这种情况下,指令系统中需要有专门的I/O指令来访问I/0端口,I/0指令中地址码部分给出I/0端口号。
独立编址方式下,I/O地址空间和主存地址空间是两个独立的地址空间,因而无法从地址码的形式上区分,需用专门的I/O指令来表明访问的是I/O地址空间。CPU执行I/O 指令时,会产生I/O读或I/O写总线事务,CPU通过I/O读或I/O写总线事务访问I/O端口。
例如,Intel处理器就采用独立编址方式,其I/O地址空间由2'(64K)个地址编号组成,每个编号可以寻址一个8位的I/O端口。任何两个连续的8位端口可看成一个16位端口。该处理器提供专门的I/O指令:IN(INS)指令和OUT(OUTS)指令。
2.统一编址方式
统一编址方式下,I/O.地址空间与主存地址空间统一编址,也即,将主存地址空间分出一部分地址给I/O端口进行编号,因为I/0端口和主存单元在同一个地址空间的不同地址段中,根据地址范围就可区分访问的是I/0端口还是主存单元,因而无需设置专门的I/O指令,只要用一般的访存指令就可以存取I/O端口。因为这种方法是将I/O端口映射到主存空间的某个地址段上,所以,也被称为“存储器映射方式”。
6.5I/O 数据传送控制方式
I/O 数据传送主要有三种不同的控制方式:程序直接控制、中断控制和DMA控制。
6.5.1 程序直接控制I/O方式
程序直接控制方式直接通过查询程序来控制主机和外设之间的数据交换,通常有以下
两种类型。
1.无条件传送方式
无条件传送方式也称同步传送方式,主要用于对一些简单外设(如开关、继电器、7段显示器或机械式传感器等)在规定的时间用相应的I/O指令对接口中的寄存器进行信息的输入或输出。其实质是通过程序来定时,以同步传送数据,适合于各类巡回采样检测或过程控制。图6.10是一个采用无条件传送方式的接口示意图。I/O接口中有一个数据锁存器和一个三态缓冲器,它们共用同一个地址,可看成是一个数据寄存器,通过相应的I/O指令可直接对该寄存器进行访问,在读/写信号的控制下进行数据的输入和输出。由此可见,无条件传送的接口比较简单,无需任何定时信号和状态查询,只需要进行相应的读/写控制和地址译码即可。
无条件传送方式下,处理器对外设接口进行周期性的定时访问,直接对I/O端口进行数据存取。因此,这种方式下,处理器在I/O操作上的时间开销多少与定时访问的时间间隔有关。对于慢速设备,因为定时访问时间间隔长,所以,I/O操作所用的处理器时间占整个处理器时间的比例较少,对处理器效率影响不大;而对于快速设备,因为需要频繁地进行I/O访问,所以,很多处理器时间被I/O操作占用,因而这种方式不宜用于高速设备的I/O。
2.条件传送方式
条件传送方式也称为异步传送方式。对于一些较复杂的I/O接口,往往有多个控制、状态和数据寄存器,对设备的控制必须在一定的状态条件下才能进行。此时,可通过在查询程序中安排相应的I/O指令,由这些指令直接从I/O接口中取得外设和接口的状态,如“就绪(Ready)”“忙(Busy)"“完成(Done)”等,根据这些状态来控制外设和主机的信息交换。因此,这是一种通过查询接口中的状态来控制数据传送的方式,所以也被称为程序查询方式,其接口结构如图 6.11所示。
图6.11 条件传送方式接口
图 6.11 所示的I/O接口中,左边是主机侧,CPU执行相应指令,通过I/O总线向I/O接口送出“启动”命令,读取“就绪”等状态信息,并向(从)数据缓冲寄存器写入(读取)数据。I/O接口的右边是和设备相连的设备侧,因此连接的是接口插座和电缆,可以送出“启动设备”命令,或接受“设备工作结束”信号,并可通过数据线和设备交换数据信息。
CPU采用条件传送方式通过图6.11所示的I/O接口读取外设数据的过程如下:①CPU执行相应的I/O指令,向该接口送出“启动”命令,设备选择电路对CPU送出的地址进行译码,选中本I/O接口,这样,与非门输出信号使“完成”状态触发器D清0,而使“启动"命令触发器B置 1;②I/O接口通过连接电缆向外设发送“启动设备”命令;③外设准备好一个数据,通过电缆向I/O接口中的数据缓冲寄存器输入数据;④外设向I/O接口回送“设备工作结束”状态信号,使状态触发器D置1,使命令触发器B清0;⑤CPU通过执行指令不断读取I/0接口状态,因触发器D已经被置1,所以,查询到外设“准备就绪”;⑥ CPU通过执行I/O指令从数据缓冲寄存器读取数据。通过以上6个步骤,CPU和外设之间完成一次数据交换过程。在此过程中需要使用多条I/O指令,包括发送“启动”命令,读取“准备就绪”状态和读取数据缓冲寄存器中的数据等。
设备是否适合采用条件传送方式,主要取决于I/O设备本身的特点以及设备是否能够独立启动I/O等。键盘和鼠标等是随机启动的低速I/O设备,当用户按下键盘、移动鼠标或单击鼠标按钮时,便启动了I/O设备的输入操作。对于这类自身能独立启动I/O的设备,虽然可以采用定时程序查询方式,但是,由于设备的启动是由用户随机进行的,所以,有可能用户长时间没有输入而引起查询程序长时间等待,从而降低处理器的使用效率,因此,这类设备大多采用后面介绍的中断方式进行I/O;对于由操作系统启动的设备,则只有被操作系统激活后才需要查询。对于像磁盘、磁带和光盘存储器等成块传送的设备一旦被启动,便可连续不断地传送一批数据,处理器无需对每个数据的传送进行启动,而且每个数据之间的传输时间很短,如果用定时查询方式,则会因为频繁查询而使处理器为I/O操作所花费的时间比例变得很大,因此,不适合采用程序查询方式。像针式打印机等字符类设备,每个字符之间的传输时间较长,并且每传送一个字符需要启动一次,因而可以采用程序查询方式。
根据查询被启动的方式的不同,条件式程序查询方式有两种:定时查询和独占查询。可根据外设的特点选择采用定时查询方式或独占查询方式。
定时查询是指周期性地查询接口状态,每次查询总是一直等到条件满足,才进行一个数据的传送,传送完成后返回。定时查询的时间间隔与设备的数据传输率有关。下面举例说明对于不同I/O传输速率的设备,其CPU为I/0操作所花费的时间开销是不同的。
例6.2 假定查询程序中所有操作(包括读取并分析状态、传送数据等所有步骤)所用的时钟周期数至少是400个,处理器的主频为500MHz,即处理器每秒钟产生500x10°个时钟周期。假定设备一直持续工作,采用定时查询方式,则以下三种情况下,CPU用于I/O的时间占整个CPU时间的百分比各是多少?
(1)鼠标必须每秒钟至少被查询30次,才能保证不错过用户的任何一次移动。
(2)软盘按16位为单位进行数据传送,数据传输率为50kBps,要求没有任何数据传送被错过。
(3)硬盘以16字节为单位进行数据传送,数据传输率为4MBps,要求没有任何数据传输被错过。
解:对于查询方式,CPU花在输入/输出上的时间由查询次数乘上查询操作时间得到。(1)对于鼠标,每秒钟内用于查询的时钟周期数至少为30x400=12 000,因此,CPU用于I/O的时间占整个CPU时间的百分比至少为12 000/(500x10°)≈0.002% 。显然,CPU对鼠标的查询操作对性能的影响不是很大。
(2)对于软盘,因为每次数据传送的单位为16位,占两个字节,所以只有当查询的速率达到每秒 50 kB/2B=25k次时才能保证没有任何数据被丢失。因此,每秒钟内用于软盘1/0的时钟周期数为25kx400,它在整个CPU时间中所占的百分比为25kx400/(500x10°)=2% 。这个开销非常大,但在只有少量像软盘这样的I/O设备的低端系统中,这个开销是可以忍受的。
(3)对于硬盘,要求每次以16字节为单位进行查询,所以查询的速率应达到每秒4 MB/16 B=250k次的速度,故每秒钟内用于硬盘I/O的时钟周期数为250kx400,用于硬盘I/O的时间占整个CPU时间的百分比为250kx400/(500x10°)=20%。也就是说,CPU的1/5时间被用于查询硬盘并进行硬盘I/O,显然,对硬盘用查询方式是不可取的。
对于例6.1,如果软盘和硬盘仅有25%的时间是活动的,那么,操作系统只有在设备被激活时进行查询,所以查询的平均开销将被分别降到0.5%和5%。尽管这样降低了开销,但是一旦操作系统发出一个对设备的启动命令,它就必须接连不断地查询,因为操作系统不知道什么时候设备会响应并准备好一次传送。一旦设备被启动,CPU就一直持续对设备进行查询,这种方式称为独占查询方式。
独占查询方式下,CPU被独占用于某设备的I/O,完全控制I/O整个过程,也即CPU花费100%的时间在I/0操作上,此时,外设和CPU完全串行工作。其查询程序的流程如图6.12所示。
从图6.12中可看出,在任何一个数据传送之前,必须先读接口的状态,判断接口是否“就绪”,只有在接口“就绪”的情况下,才继续进行传送。否则,CPU将一直处于等待状态,直到外设完成任务而使接口满足条件为止。这里“就绪”的含义,对于输人设备而言,意味着设备已将数据送入接口中的数据缓冲器,CPU可以从接口取数据;对于输出设备而言,意
味着数据缓冲器已空,CPU可以将数据送到接口中。
打印机的输出控制方式可采用这种独占查询方式。假定一个用户进程P1中使用了某个I/0函数,请求在打印机上打印一个具有n个字符的字符串。显然,用户进程P1通过一系列过程调用后,会执行一个系统调用来打开打印机。若打印机空闲,则用户进程P1可正常使用打印机,因而就通过一个系统调用来对打印机进行写操作,从而进入操作系统内核进行字符串打印。
操作系统内核通常将用户进程缓冲区中的字符串首先复制到内核空间,然后查看打印机是否“就绪”。如果“就绪”,则将内核空间缓冲区中的一个字符输出到打印控制器的数据端口中,并发出“启动打印”命令,以控制打印机打印数据端口中的字符;如果打印机“未就绪”,则等待直到其“就绪”。上述过程循环执行,直到字符串中所有字符打印结束。图6.13中的程序段大致描述了采用独占查询方式进行打印控制的过程。
程序查询I/0方式的特点是简单、易控制、外围接口控制逻辑少。但是,CPU需要从外设接口读取状态,并在外设未就绪时一直处于忙等待。由于外设的速度比处理器慢得多,所以,在CPU等待外设完成任务的过程中浪费了许多处理器时间。
6.5.2 程序中断I/O方式
在4.8节中提到,中断是外设的一种输人输出方式,它是由外部I/O设备请求处理器进行处理的一种信号,而不是由当前执行的指令引起的。外部I/O设备通过特定的中断请求信号线向 CPU提出中断申请。下面将简要介绍有关中断I/0方式。
1.中断的概念
使用中断方式控制I/O的基本思想是,当正在CPU上执行的当前进程P1需要进行I/0
操作时,它会先启动外设进行第一个数据的I/0操作,外设被启动后就开始工作。相对于 CPU操作来说,I/O操作是一个漫长的过程,因此,当前进程若在等待I/O操作完成的过程中继续占用CPU的话,就会浪费CPU宝贵的资源,所以,通常会挂起正在等待I/O的当前进程,使其进入等待队列,而从就绪队列中选择一个进程P2调度到CPU上执行,此时,外设和CPU并行工作,外设执行P1启动的I/O操作,而CPU正在运行进程P2。当外设完成指定的I/O操作后,便向CPU发中断请求。CPU响应请求后,就暂停进程P2的执行,转入一个“中断服务程序”执行,在“中断服务程序”中再启动P1中后面数据的I/O任务。“中断服务程序”执行完后,返回到被暂停的P2进程的断点处继续执行。此时,外设和CPU又开始并行工作。
例如,对于上述请求打印字符串的用户进程P1的例子,如果采用中断控制I/0方式,则操作系统处理I/O的过程如图6.14所示。
从图6.14(a)可以看出,在“字符打印”系统调用服务例程中启动打印机后,它就调用处理器调度程序scheduler来调出其他进程(如P2)执行,而将用户进程P1阻塞。在CPU执行进程P2的同时,打印机在进行打印操作,CPU和打印机并行工作。若打印机打印一个字符需要5ms,则在打印一个字符期间,进程P2可以在CPU上执行5ms的时间。对于程序直接控制I/O方式,CPU在这5ms的时间内只是不断地查询打印机状态,因而整个系统的
效率很低。
中断控制I/O方式下,一旦外设完成任务,就会向CPU发中断请求。对于图6.14中的例子,当打印机完成一个字符的打印后,就会给CPU发中断请求,然后CPU暂停正在执行的其他进程,调出“字符打印”中断服务程序来执行。如图6.14(b)所示,中断服务程序首先判断是否已完成字符串中所有字符的打印,若是,则将用户进程P1解除阻塞,使其进入就绪队列;否则,就向数据端口送出下一个欲打印字符,并启动打印,将未打印字符数减1和下一个打印字符指针加1后,执行中断返回,回到被打断的进程P2继续执行。
图6.15和图6.16描述了中断控制I/O的整个过程。
现代计算机系统中都配有完善的异常和中断处理系统,CPU的数据通路中有相应的异常和中断的检测和响应逻辑,在外设接口中有相应的中断请求和控制逻辑,操作系统中有相应的中断服务程序。这些中断硬件线路和中断服务程序有机结合,共同完成异常和中断的处理过程。中断I/0方式通过让处理器执行相应的中断服务程序来完成输人/输出的任务,所以称为程序中断I/0方式。
外部中断由外设完成任务或出现特殊情况引起,如外设任务完成、打印机缺纸、磁盘检验错、采样计时到、键盘输入等。它和前面第4章介绍的内部异常在本质上是一样的。但是,两者相比,它们有两个重要的不同点。
(1)“缺页”或“溢出”等异常事件是在执行特定指令过程中产生的,而中断相对于指令的执行则是异步的。也就是说,中断不和任何指令相关联,也不阻止任何指令的完成。因此,CPU只需要在一条新指令的指令周期开始之前,检测是否有外部发来的中断请求即可。
(2)异常的发生和异常事件的类型是由CPU自身发现和识别的,不必通过外部的某个信号通知CPU。而对于中断,CPU必须通过对外部中断请求线进行采样,并从总线上获取相应的中断源设备的标识信息,才能获知哪个设备发生了何种中断。
2.中断系统的基本职能和结构
现代计算机的中断处理功能相当丰富,没有配置中断系统的计算机是令人无法想象的。每个计算机系统的中断功能可能不完全相同,但其基本功能不外乎以下几个方面。
(1)及时记录各种中断请求信号。通常用一个中断请求寄存器来保存。
(2)自动响应中断请求。CPU在每条指令执行完、下条指令取出前,会自动检测中断请求引脚,发现有中断请求时,则根据情况决定是否响应和响应哪个中断请求。
(3)自动判优。在有多个中断请求同时产生时,能够判断出哪个中断的优先级高,选择优先级高的中断先响应。
(4)保护被中断程序的断点和现场。因为中断响应后要转去执行中断服务程序,而执行完中断服务程序后,还要回到原来的程序继续运行,所以原程序被中止处的指令地址和原程序的程序状态及各寄存器的内容等必须被保存,以便能正确回到原被中止处继续执行。
(5)中断屏蔽。通过中断屏蔽实现多重中断的嵌套执行,中断屏蔽功能通过一个中断屏蔽字寄存器来实现。
现代计算机大多采用中断嵌套技术,中断系统允许CPU在执行某个中断服务程序时,被新的中断请求打断。但是并不是所有的中断处理都可被新的中断打断,对于一些重要的紧急事件的处理,就要设置成不可被其他新中断事件打断,这就是中断屏蔽的概念。中断系统中要有中断屏蔽机制,使得每个中断可以设置它允许被哪些中断打断,不允许被哪些中断打断。这个功能主要通过在中断系统中设置中断屏蔽字来实现。屏蔽字中的每一位对应某一个外设或中断源,称为该外设的中断屏蔽位,例如,用“1”表示允许中断,“0”表示不允许中断(即屏蔽中断)。CPU通过在程序中执行相应的指令来修改屏蔽字的内容,从而动态地改变中断处理的先后次序。
中断系统的中断控制器基本结构如图6.17所示。
从图6.17可以看出,来自各个设备的中断请求(如IRQO、…、IRQ)记录在中断请求寄存器中的对应位,每个中断源有各自对应的中断屏蔽字,在进行相应的中断处理之前它被送到中断屏蔽字寄存器中。在CPU运行程序时,每当CPU完成当前指令的执行、取出下一条指令之前,就会通过采样中断请求信号引脚(如Intel处理器中的INTR),以自动查看有无中断请求信号。若有,则会发出一个相应的中断回答信号,启动图6.17中的“中断查询”线,在该信号线的作用下,所有未被屏蔽的中断请求信号一起送到一个中断判优电路中,判优电路根据中断响应优先级选择一个优先级最高的中断源,然后用一个编码器对该中断源进行编码,得到对应的中断源类型号(即中断源的标识信息,称为中断类型)。CPU取得中断源的标识信息后,经过一系列相应的转换,就可得到对应的中断服务程序的首地址,在下一个指令周期开始,CPU执行相应的中断服务程序。
Intel处理器的中断系统功能通过可编程中断控制器(Programmable Interrupt Controller,简称 PIC)实现。如图6.17所示,每个能够发出中断请求的外部设备控制器都有一条IRQ线,所有外设的 IRQ线连到PIC对应的IRQ引脚:IRQO、IRQ1、…、IRQ2、…,然后被记录在 PIC的中断请求寄存器中。PIC对所有外设发来的IRQ请求按照优先级进行排队,如果至少有一个IRQ线有请求且未被屏蔽,则PIC向CPU的INTR引脚发中断请求。
在中断处理(即执行中断服务程序)过程中,若又有新的优先级更高的中断请求发生,那么CPU 应立即中止正在执行的中断服务程序,转去处理新的中断,这种情况被称为多重中断或中断嵌套,如图6.18所示。
图6.18中,假定在执行用户程序时,发生了1#中断请求,因为用户程序不屏蔽任何中断,所以就响应1#中断,将用户程序的断点保存在栈中,然后调出1#中断服务程序执行。而在执行1#中断的过程中,又发生了2#中断,2#中断的处理优先级比1#高,也即1#中断的屏蔽字对2#中断是开放的,此时,就中止1#中断的处理,响应2#中断,把1#中断的断点信息保存在栈中,调出2#中断的中断服务程序执行。同样,3#中断也可以打断2#中断的执行。当3#中断处理完返回时,系统从栈顶取出返回的断点信息,这样,从3#中断返回后,首先回到2#中断的断点(K3+1)处,而不是回到1#中断或用户程序执行。利用栈能正确地实现中断嵌套。
从上面描述的过程来看,中断系统中存在两种中断优先级。一种是中断响应优先级,另一种是中断处理优先级。中断响应优先级是由查询程序或中断判优电路决定的优先级,它
反映的是多个中断同时请求时选择哪个先被响应。中断处理优先级是由各自的中断屏蔽字来动态设定的,反映了本中断与其他所有中断之间的处理优先关系。在多重中断系统中通
常用中断屏蔽字对中断处理优先级进行动态分配。
3.中断过程
中断过程包括两个阶段:中断响应和中断处理。中断响应阶段由硬件实现,而中断处理阶段则由CPU执行中断服务程序来完成,所以中断处理是由软件实现的。
(1)中断响应
中断响应是指主机发现中断请求,中止现行程序的执行,到调出中断服务程序这一过程。因此,中断响应过程是处理器从一个进程切换到另一个进程的过程。
为了保证被中断程序从中断服务程序返回后在断点处能继续正确执行下去,有两类信息不能被中断服务程序破坏。一类是用户可见的通用寄存器的内容,这些通用寄存器中存放着程序执行到断点处的现行值,一般把这类信息称为现场信息;另一类是用指令无法直接读取的程序计数器PC和程序状态字寄存器PSWR等的内容,通常把这类信息称作断点信息。对于现场信息,因为是用户指令可直接访问的,所以通常在中断服务程序中通过指令把它们保存到栈中,也即由软件实现;而对于断点信息,因为必须将中断服务程序的首地址和初始程序状态字装人到PC和PSWR中才能转到中断服务程序执行,所以,原来在PC和 PSWR中的断点信息应由处理器在中断响应开始时自动保存到一个特定的地方(栈或专门寄存器)。
处理器识别出的中断源所对应的中断服务程序的首地址和初始程序状态字必须被送到 PC和 PSWR。这样,在中断响应结束后的下一个时钟周期,处理器就可转入相应的中断服务程序执行。
很显然,在保护断点和现场的过程中,如果又有新的中断被响应,则原被保存的断点或现场就会被破坏,因而,需要有一种机制能保证断点和现场的保护过程不被新的中断请求打断。通常,用一个“中断允许”触发器(或状态位)来实现控制。4.8.4节中介绍过,当CPU中的“中断允许”触发器为1时,CPU处于“中断允许”(或“开中断”)状态。CPU只有在“中断允许”状态时,才有可能响应新的中断请求。
因此,中断响应的条件有以下三个。①CPU处于“开中断”状态。
②至少要有一个未被屏蔽的中断请求。③当前指令刚执行完。
当处理器同时满足上述三个条件时,就响应中断,进入中断响应周期,它是一种特殊的机器执行周期。在中断响应周期中,通过执行一条隐指令,完成以下几个操作。
①关中断:将中断允许标志置为禁止(即“关中断”)状态,这时将屏蔽掉所有可屏蔽的中断请求。
②保护断点:将PC和PSW送入栈或特殊寄存器。
③识别中断源并转中断服务程序:通过某种方式,获得优先级最高的中断源所对应的中断服务程序的首地址和初始PSW,并分别送PC和 PSWR。
中断源的识别和判优方法可分为软件查询和硬件判优两大类。①采用软件查询方法。
当CPU检测到中断请求时,通过中断响应,自动转到一个特定的中断查询程序,在中断查询程序中,按中断优先顺序依次查询哪个设备有中断请求,并转到第一个查询到有请求的中断服务程序去执行。对于这种用软件进行中断识别的方式,其中断接口的硬件结构很简单,只要一根中断请求线和一个中断请求寄存器,而且,可通过改变软件中的查询顺序来改变中断响应优先级,因而比较灵活。但是,因为软件查询速度慢,所以中断请求可能无法得到实时响应。
②采用硬件判优方法。
硬件判优方法是一种向量中断方法,它不同于软件查询的中断处理技术。它根据中断控制器接口(如PIC)中的中断判优电路和编码器等,得到当前所有未被屏蔽的中断请求中具有最高响应优先权的中断源类型(即中断源标识信息)。例如,图6.17中的IRQi中的就是中断源标识信息,通过编码器输出的i最终被送到CPU中,CPU根据i的值找到对应的中断服务程序的首地址PC和初始PSW。
(2)中断处理
中断过程包括两个阶段:中断响应和中断处理。中断响应是通过CPU执行中断隐指令来完成的,完全由硬件完成;而中断处理就是CPU执行一个中断服务程序的过程,完全由软件完成。虽然不同的中断源对应的中断服务程序不同,但是,所有中断服务程序的结构是相同的。中断服务程序包含三个阶段:准备阶段、处理阶段和恢复阶段。
相应的位清0或置1。
前面给出了在外设和主机之间进行数据交换的两种输入/输出方式:程序查询和程序中断方式。这两种方法用在低带宽设备上较好,因为对于低速设备,我们更关心怎样降低I/O接口的成本,而不是关心怎样提高数据传输速率。下面的例子说明用中断方式控制硬盘和主机之间的数据交换时CPU的开销如何。
例6.3 假定一个字长为32位的CPU的主频为500MHz,即CPU每秒钟产生500x10个时钟周期。硬盘使用中断I/0方式进行数据传送,其传输速率为4MBps,每次中断传输一个16字节的数据,要求没有任何数据传输被错过。每次中断的开销(包括用于中断响应和中断处理的时间)是500个时钟周期。如果硬盘仅有5%的时间进行数据传送,那么,CPU用于硬盘数据传送的时间占整个CPU时间的百分比为多少?
解:若硬盘数据传送采用中断I/O方式,则每次中断传输一个16字节的数据。为保证没有任何数据传输被错过,CPU每秒钟应该至少执行4MB/16B=250k次中断,因此,每秒钟内用于硬盘数据传输中断的时钟周期数为250kx500=125x10°,故CPU用于硬盘数据传送的时间占125x10°/(500x10°)=25%。
从以下另外一个角度来考虑也可以得出同样的结论。由题意知,CPU通过中断方式进行硬盘数据的传送,硬盘每准备好一个16字节的数据,则发出中断请求。硬盘准备一个数据(16B)的时间为16B/4 MB=4μs,CPU用于一个数据I/O的时间(包括中断响应并处理的时间)是500个时钟周期,相当于500/500M=1μs。由此可见,假定硬盘一直在工作的话,则硬盘每隔4μs申请一次中断,每次中断CPU花1μs进行硬盘数据传送,因此,CPU花在硬盘数据传送的时间占整个CPU时间的1/4,即 25%。
对于程序查询方式,在外设准备数据时,由于CPU一直在等待外设完成,所以CPU是有开销的。对于中断I/0方式,在外设准备数据时,CPU被安排执行其他程序,外设和CPU并行工作,因而CPU在外设准备数据时没有开销,只有响应和处理中断来进行数据传送时 CPU才需要花费时间为I/O服务。这就是中断I/O方式相对于程序查询方式的优点。
但是,对于硬盘这种高速外设的数据传送,如果采用中断I/O方式的话,则CPU用于 I/O的开销是无法忽视的。高速外设速度快,因而中断请求频率高,导致CPU被频繁地被打断,而且,由于需要保存断点和现场、开中断/关中断、设置中断屏蔽字等,使得中断响应和中断处理的额外开销很大,因此,在高速外设情况下,采用中断I/O方式传送数据是不合适的,通常采用DMA方式。
6.5.3 DMA方式
DMA( Direct Memory Access)称为直接存储器存取,该输入输出方式用专门的DMA 接口硬件来控制外设与主存间的直接数据交换,数据不通过CPU。通常把专门用来控制总线进行DMA传送的接口硬件称为DMA控制器。在进行DMA传送时,CPU让出总线控制权,由MA控制器控制总线,通过“窃取”一个主存周期完成和主存之间的一次数据交换,或独占若干个主存周期完成一批数据的交换。
DMA方式主要用于磁盘等高速设备的数据传送。这类高速设备的记录方式多采用数据块组织方式,数据块之间有间隙,因而数据传输时数据块之间的时间间隔较长,而数据块内部数据间的传输时间间隔较短,因此,这类设备大多采用成批数据交换方式。
1.三种 DMA 方式
由于DMA控制器和CPU共享主存,所以可能出现两者争用主存的现象。为使两者协调使用主存,DMA通常采用以下三种方式之一进行数据传送。
(1)CPU停止法。DMA传输时,由DMA控制器发一个停止信号给CPU,使CPU脱离总线,停止访问主存,直到DMA传送一块数据结束。
(2)周期挪用法。DMA传输时,CPU让出一个总线事务周期,由DMA控制器挪用一个主存周期来访问主存,传送完一个数据后立即释放总线,是一种单字传送方式。
(3)交替分时访问法。每个存储周期分成两个时间片,一个给CPU,另一个给DMA,这样在每个存储周期内,CPU和DMA都可访问存储器。
2.DMA 操作步骤
DMA控制器也是一种I/O接口,与设备控制器一样,其中也有若干个寄存器,用于存放 I/O传送所需的各种参数。这些寄存器包括主存地址寄存器、字计数器、控制寄存器、设备地址寄存器等,此外,还有其他的控制逻辑,能控制设备通过总线与主存直接交换数据。
假设进程P1需要进行高速设备的I/O,DMA方式下的I/O操作过程由以下几个步骤
来完成。
第一步:DMA控制器的预置(初始化)。
进程P1在进行数据传送之前,先通过内核执行一段初始化程序,完成对DMA控制器中各参数寄存器的初始值的设定。主要操作包括以下三个方面。
(1)准备内存区。若是从外设输人数据,则进行内存缓冲区的申请,并对缓冲区进行初始化;若是输出数据到外设,则先在内存准备好数据。
(2)设置传送参数。执行I/O指令来测试外设状态,并对DMA控制器设置各种参数。列如,将内存首址传送到地址寄存器,将字计数值传送到字计数器,将读/写命令传送到控制寄存器,将设备地址传送到设备地址寄存器等。
(3)发送“启动DMA传送”命令,然后调度CPU执行进程 P2。
第二步:DMA数据传送(DMA传送)。
CPU对DMA传送参数进行预置并发送“启动DMA传送”命令后,就把数据传送的工作
交给了DMA控制器。在整个DMA传送过程中,不再需要CPU的参与,完全由DMA控制器实现数据的传送,因此,在此过程中,CPU执行进程P2。DMA控制器将内存地址送到总线,并在总线的读/写控制线上发出“读"命令或“写"命令,随后在数据线上给出数据。DMA控制器每完成一个数据的传送,就将字计数器减1,并修改地址寄存器中的主存地址。当字计数器为0时,完成所有I/0操作。
第三步:DMA结束处理(后处理)。
若字计数器为“0”,则发出“DMA结束”中断请求信号给CPU,转人中断服务程序,做一些数据校验等后处理工作。
从上述过程来看,DMA方式与程序查询和中断方式不同。在DMA方式下,CPU不直接执行I/O指令来实现数据传送,而只是进行一些辅助工作,包括设置传送参数、发送“启动 DMA传送”命令和最后的数据校验等。DMA方式的处理过程如图6.21所示。
DMA 方式下,CPU只要在最初的DMA控制器初始化和最后处理“DMA结束”中断时介人,而在整个一块数据传送过程中都不需要CPU参与,因而CPU用于I/O的开销非常小。
下面举例说明使用DMA方式进行硬盘和主存之间的数据传送时处理器所花的开销。
例6.4假定CPU的主频为500MHz,即CPU每秒钟产生500x10°个时钟周期。硬盘采用DMA方式进行数据传送,其数据传输率为4MBps,每次DMA传输的数据量为8KB,要求没有任何数据传输被错过。如果CPU在DMA初始化设置和启动硬盘操作等方面花了1000个时钟周期,并且在DMA传送完成后的中断处理需要500个时钟,则在硬盘100%处于工作状态的情况下,CPU花在硬盘I/O操作上的时间百分比大约是多少?
解: 显然,从硬盘上读/写8KB的数据,需要花费的时间为8KB/4MBps≈2x10s,所以如果硬盘一直处于工作状态的话,为了没有任何数据传输被错过,CPU必须每秒钟有1/(2x10)=0.5x10'次DMA传送,因此,1s内CPU花在硬盘I/O操作上的时钟周期数为0.5x10’x(1000+500)=750x10’。因此,CPU花费在硬盘I/O上的时间占整个CPU时间的百分比大约为750x10/(500x10°)=1.5x10㎡= 0.15%。
DMA方式被用于硬盘I/O时,在数据传送期间将不消耗任何处理器周期,所以即使硬盘一直在进行I/O操作,CPU为它服务的时间也仅占0.15%。事实上,硬盘在大多数时间内
并不进行数据传送,因此,CPU为I/O所花费的时间会更少。当然,如果CPU同时要竞争存储器的话,由于在DMA传送期间,存储器要和外设进行数据交换,因而CPU会被延迟与存 储器交换数据。但通过使用cache,CPU可避免大多数访存冲突。因此,通常存储器带宽的大部分都可让给外设的DMA传送使用。
6.6本章小结
本章主要介绍输入输出系统的组成、外部设备的分类和特点、常用输入/输出设备和外部存储设备的工作原理、I/O接口的职能和分类、I/O设备和主机的连接,以及常用的几种输入/输出方式,包括程序查询方式、程序中断方式和DMA方式等内容。
输人设备、输出设备和外存储器统称为外部设备,简称外设。所有外设通过相应的电缆连到I/O接口电路上,I/O接口电路再连到系统总线,最终与CPU和主存相连。
I/O接口指各类设备控制器(包括适配器或适配卡)或DMA控制器、中断控制器等,也称为I/O 控制器或I/O模块,其职能包括:数据缓冲、记录状态、传递命令、数据格式转换等。通常I/O接口中包含数据缓冲寄存器(数据端口)、状态寄存器(状态端口)和控制寄存器(控制端口或命令端口),它们统称为I/O端口。I/O端口的编址方式有两种:独立编址和统一编址(存储器映射)。独立编址方式下,对I/O端口单独编号,使它们成为一个独立的I/O地址空间;统一编址方式下,I/0端口与主存单元统一编号。可以通过I/O指令访问I/O端口。
常用I/O控制方式有三种:程序直接控制方式、中断控制方式和DMA方式。程序直接控制方式分无条件传送和条件传送两种。无条件传送方式下,利用程序定时来传送数据,无需检测接口或设备的状态,适合于各类巡回检测或过程控制;条件传送(程序查询)方式下, CPU通过查询外设接口中的“就绪(Ready)”“忙(Busy)"和“完成(Done)”等状态来控制数据的传送,有定时查询和独占查询两种。程序中断I/0方式下,当外设准备好数据或准备好接收新数据或发生了特殊事件时,外设通过向CPU发中断请求来使CPU转到相应的中断服务程序去执行,在中断服务程序中完成数据交换或处理特殊事件。DMA方式适合像磁盘一类的高速设备以成批方式和主存直接交换数据。首先要对DMA控制器进行初始化;然后由DMA控制器控制总线在主存和高速设备之间进行直接数据交换;最后,DMA控制器发出“DMA 传送结束”信号给外设接口,由外设接口发中断请求给CPU,CPU进行DMA结束处理。