就和其名字一样,IO系统解决的主要问题是对各种形式的信息进行输入和输出的控制(input and output)。
IO系统中有以下几个常用的概念:
①外部设备:
包括输入输出设备以及通过输入输出接口才能访问的外存储设备(后者可以理解为移动硬盘)
②接口:
在各个外设与主机之间传输数据时进行各种协调工作的逻辑部件,这个协调包括速度的匹配、电平和格式的转换。
③输入设备:
向计算机系统内部输入信息的部件
④输出设备:
将计算机系统中的信息输出到计算机外部进行显示交换的部件。
⑤外存设备:
指计算机内存及CPU缓存之外的存储器,比如光盘、硬盘等
一般来说IO系统由IO软件和IO硬件两部分组成,二者缺一不可,互相支持从而实现IO功能。
在输入输出系统中,需要进行大量的数据传输,主要具有下面的四类IO控制方式,这是这一章最难也最重要的部分,四种IO控制方式如下:
其中程序查询方式和程序中断方式适用于数据传输率较低的外部设备,而DMA和通道适合于数据传输率较高的外部设备。
外部设备并不单单指外存,外部设备指的是主机之外的能直接间接与计算机交换信息的设备,包括鼠标键盘、显示器、打印机、磁盘、光盘等。
外部设备又可以细分为以下的几类。
首先是输入设备,最常用的是鼠标和键盘。键盘通常以矩阵的形式排列按键,用键盘输入信息主要分为三个步骤:查出按下的是哪一个按键-将该按键翻译为能被主机接收的编码-将编码传输给主机。鼠标则是在平面上移动,根据传感器感知移动方向和距离,从而在屏幕上做出相应的移动。
其次是输出设备。输出设备中显示器是最常见的,关于显示器有下面的几个参数:
①屏幕大小:一般用对角线长度表示
②分辨率:所能表示的像素个数,屏幕上的每一个光点就是一个像素,一般用长宽像素数目的积来表示。分辨率是计算中常用的量,一般一个像素需要一个单独的存储,这个存储的长度取决于颜色的数目。比如颜色数目有256个,那么就需要0-255也就是8位二进制来表示,也就是每个像素点就需要8位二进制。
③刷新率:单位时间刷新屏幕的次数
④显示存储器(VRAM):也称刷新存储器,是为了提高刷新图像的信号,需要将一帧图像的信息存储在刷新存储器中,也就是一次刷新屏幕上显示的内容。由于黑白计算机基本不存在了,所以直接换成颜色的范围,VRAM的容量等于分辨率×颜色数目位数,VRAM带宽等于分辨率×颜色数目位数×帧频。
除了显示器,打印机也是常用的输出设备。
外存储器也属于外部设备。外存储器又称辅助存储器,目前主要使用的是磁表面存储器,该类存储器的存储容量大且价格低、可重复使用、允许长期存储、非破坏性读出的优点,但是速度较慢且机械结构易损坏。
最常用的是磁盘存储器,一定要充分理解好磁盘存储器的结构,这在后面算延迟时间时很重要。首先一块硬盘有若干个记录面,每个记录面划分为若干个磁道,每个磁道又划分为许多扇区。扇区就是磁盘读写的最小单位。这里可以将一个硬盘看做一个圆柱,圆柱在竖直方向上切出好多圆面,每个圆面的上下两个面就是记录面,记录面是个圆面,圆面上可以划分出许多半径不同的同心圆,每个同心圆就是一个磁道,磁道是一个圆,圆上拆出许多的圆弧,这些圆弧就是扇区,也称块,磁盘是按照块存取的。
基于硬盘的结构,用磁头数表示记录面的数目,一个记录面对应一个磁头,用柱面数表示磁道的多少,这里之所以叫柱面,是因为许多平行的记录面相同半径的磁道组成的是一个圆柱的侧面,所以叫柱面,柱面描述的是每个记录面磁道的多少,用扇区数目表示每个磁道上有多少个扇区。
磁盘主要有以下的性能指标:
①磁盘容量:
一个磁盘所能存储的字节总数为磁盘容量,这个容量有格式化容量和非格式化容量。格式化容量指的是按照某种特定记录格式所能存储的信息的总量,而非格式化容量指的是磁记录表面可以利用的磁化单元总数。一般格式化容量要小于非格式化容量,这是因为在格式化存储时总需要一些空隙来表示单元之间的间隔。
②记录密度:
指的是盘面单位面积上记录的二进制信息量,分为道密度、位密度和面密度。道密度指的是磁盘半径方向上单位长度的磁道数目,位密度指的是磁道上单位长度存储的二进制代码位数,面密度则是一个记录面上存储的二进制位数,可以用位密度乘以道密度来表示。
③平均存储时间:
平均存储时间由三部分组成,首先是寻道时间,指的是磁头移动到磁盘对应位置上所需要的时间,其次是旋转延迟时间,指的是磁头到达要读写的扇区所用的时间,一般取旋转一周的时间的一半,最后是传输时间,指的是传输数据所要花费的时间。
④数据传输率:
指的是单位时间内向主机传送数据的字节数。
主存向磁盘控制器发出寻址信息时也需要有对应的磁盘地址,各部分的位数和寻址一样,也是按需分配的,如图所示:
磁盘在工作时,主要是三步操作:寻址、读盘、写盘。硬盘属于机械式部件,读写操作是串行的,不能在同一时刻同时读写,也不能在同一时刻读两组数据或者写两组数据。
微小型计算机中常使用速度更快的闪存作为硬盘来记录数据,称为固态硬盘,除了需要闪存之外还需要其他的软硬件支持。
接口是主机与外设之间的交接界面,设置接口主要是为了解决主机和外设在信息形式、工作速度等方面的差异。
IO接口主要功能如下:
IO接口在主机侧通过IO总线与内存、CPU相连,通过数据总线在数据缓冲寄存器与内存或CPU的寄存器之间进行数据传送,同时接口和设备的状态也被记录在状态寄存器中,通过数据线传送到CPU、状态寄存器和控制寄存器在传送方向是相反的。接口中的地址线用于给出要访问的IO接口中的寄存器的地址,它和读写控制信号一起被送 到IO接口的控制逻辑部件,其中地址信息用以选择和主机交换信息的寄存器,通过控制线传送来的读写信号确认是读寄存器还是写寄存器,此外控制线还会传送一些仲裁信号和握手信号。
从不同的角度来看,IO接口可以分为不同的类型,根据数据传送方式可以分为并行接口(一字节或者一个字的所有位同时传送)和串行接口(一位一位地传送),根据主机访问IO设备的控制方式可以分为程序查询接口、中断接口和DMA接口,根据功能选择的灵活性可以分为可编程接口和不可编程接口。
IO端口是指接口电路中可以被CPU直接访问的寄存器。主要有数据端口、状态端口和控制端口,若干端口加上相应的控制逻辑电路组成接口。通常,CPU能对数据端口执行读写操作,但对状态端口只能执行读操作,对控制端口只能执行写操作。
IO端口想要被CPU访问,就需要像寻址那样给一个端口的编号,每个端口对应一个端口地址,而端口的编址方式又分为两种:存储器统一编址和独立编制。
统一编址是指将IO端口看做存储器的单元地址进行访问,这样做不需要设置专门的IO指令,但是端口会占用存储器的地址,使得内存容量变小。
独立编址指的是IO端口的地址空间与主存的地址空间是分开的两部分,互不干扰,这样子输入输出指令是明显区别的,程序编制清晰,但是需要CPU提供存储器读写和IO设备读写的两组控制信号,增加了控制的复杂性。
输入输出系统实现主机与IO设备之间的数据传送,可以采用不同的控制方式,主要有程序查询方式、程序中断方式、DMA方式和通道,这部分是整章最困难的一部分。
首先最基础的方法是程序查询方式,信息交换的控制完全由主机执行程序实现,此方式下,接口中设置一个数据缓冲存储器和一个设备状态寄存器,主机要进行IO操作时,先发出询问信号,读取设备的状态,再根据设备状态决定下一步是进行操作还是等待。
在程序查询方式中,CPU一旦要执行IO,就必须停止当前的程序,转而去执行IO操作,而IO设备如果没有准备就绪,CPU就会原地踏步,出现快速的CPU等待慢速的IO设备的现象,这是计算机最不希望出现的。此方式下CPU与IO设备串行工作,虽然接口简单设计简单,但是CPU资源严重浪费,并且在一段时间内只能与一台外设交换信息,效率极低。
程序中断方式是在程序查询方式的基础上就行改进,主要是利用了CPU中的中断系统来解决中断的各类共性问题。
首先,程序中断是指在计算机执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序。简单来说中断就是当前干的事情被一个更紧急的事情插队了,紧急的事情做完再回来做刚才在干的事情。
利用中断系统,CPU在程序中安排好于某个时刻启动某个外设,但是在外设启动的过程中,CPU不是像程序查询方式那样原地踏步,而是继续执行之前在做的任务,当外设完成数据传送的准备工作,就向CPU发送中断请求,请求CPU来为自己服务,在可以相应中断的情况下,CPU就暂时中止正在执行的任务,转而去执行中断服务程序为外设服务,完成传送后CPU再返回原来的程序。
下面先科普中断相关的概念。首先,中断请求指的是中断源向CPU发送中断请求信号,中断源指的是请求CPU中断的设备或者事件。中断根据不同的分类标准,可以进行以下的分类:
①内中断和外中断
一台计算机允许有多个中断源,根据中断源的类别,可以分为内中断和外中断。外中断指的是来自处理器和内存以外的部件引起的中断,包括IO设备的中断和各种定时器的时钟中断。内中断指的是在处理器和内存内部产生的中断,包括程序运算引起的错误,比如地址非法、运算溢出等。
②硬件中断和软件中断
从名字就可以看出,硬件中断指的是外部硬件而产生的中断,软件中断指的是某条指令引起的中断。硬件中断是外中断,软件中断指的是内中断。
③非屏蔽中断和可屏蔽中断
非屏蔽中断是一种硬件中断,这种中断不受关中断的影响,及时设置了关中断也会被强制执行。可屏蔽中断也是一种硬件中断,但是受关中断影响,在关中断的情况下不接受这类中断请求。也就是说非屏蔽中断和可屏蔽中断都是外中断。
由于中断在任何一个瞬间只能响应一个中断源的请求,所以当多个中断源同时提出请求时就需要进行判优来确定该相应哪一个中断源的请求。这个过程可以由硬件来实现也可以由软件来实现。一般来说,硬件故障属于最高级,其次是软件中断,非屏蔽中断优于可屏蔽中断,DMA请求优于IO设备的中断请求。
CPU只有在满足一定条件时才会响应中断源的中断请求。必须满足:中断源有中断请求、CPU允许中断、一条指令执行完且没有更紧迫的任务。CPU响应中断的时间是在每条指令执行阶段的结束时刻,这里正好对应了前面指令周期中的中断周期。
CPU在相应中断后,会经过某些操作转而去执行中断服务程序,这些操作直接由硬件实现,称为中断隐指令。中断隐指令并不是指令系统中的一条真正的指令,它没有操作码,是一种不能为用户所使用的指令。它主要实现下面的三个操作:
①关中断:
主要是为了保护现场,期间不能被新的中断打断,否则容易让现场被破坏从而丢失中断之前的程序进度。所以需要关中断,让当前的操作不能被打断。
②保存断点:
将原来程序的断点(PC中的内容)保存起来,保证中断执行完后可以回到原来的位置。
③引出中断服务程序:
将中断服务程序的入口取出并传给PC。
由于每个设备都有自己不同的中断服务程序,所以每个中断服务程序都有一个入口地址,CPU必须要找到这个地址,这个地址就称为中断向量,将系统中全部的中断向量集中放在存储器中的某个区域,称为中断向量表。这里需要区分,中断向量表存储的是中断向量,即中断服务程序的地址,而中断向量地址指的是中断向量表中的地址,是中断服务程序地址的地址。
所以,总的中断处理程序基本步骤如下:
其中,前三步由硬件自动实现,即中断隐指令自动完成,后面的步骤则是由对应的中断服务程序来实现。对于中断服务程序的步骤,不难发现,每次对现场的保护和恢复都需要对中断进行开关,以此来保证原来的程序执行不被破坏。
若CPU在执行中断服务程序的过程中,又出现了新的更高优先级的中断请求,而CPU对新的中断请求不予响应,则这种中断称为单重中断。若CPU暂停现行的中断服务程序,转去处理新的中断请求,则这种中断称为多重中断,又称中断嵌套。
中断屏蔽技术主要用于多重中断,需要满足:设置开中断指令、优先级高的中断源中断优先权低的中断源。这里又引出了屏蔽字的相关知识。每个中断源都有一个屏蔽触发器,1表示屏蔽该中断源的请求,0表示可以正常申请,所有屏蔽触发器组合在一起便构成一个屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字。这部分可以结合后面的典型题来理解。
DMA方式则是在程序中断方式的基础上继续完善。从程序查询方式到程序中断方式,是砍掉了CPU的原地踏步,而DMA则是砍掉了程序中断方式中的中断。DMA方式是一种完全由硬件进行信息传递的控制方式,在数据准备阶段CPU与外设并行工作,它在内存和外设之间开辟了一条直接数据通道,信息不再需要经过CPU,所以也就不需要保护维护CPU的工作现场了。这种方式适用于高速、大批量设备的数据传送。DMA方式仍然需要中断,但是中断的作用仅限于故障和正常传送结束时的处理。
由于主存和DMA接口之间有一条直接数据通路,所以传送不需要经过CPU,不需要中断,IO与主机并行工作,程序与传送并行工作。这里如果要抠字眼的话,这条直接的数据通路是建立在主存和DMA接口之间的,而不是主存和IO设备之间的,IO设备先和DMA接口连接,再通过DMA总线与主存相连。DMA方式具有以下的特点:
在DMA方式中,对数据传送过程进行控制的硬件称为DMA控制器,也叫做DMA接口,IO需要进行数据传送时,由DMA控制器向CPU提出DMA传送请求,CPU会在每个存储周期结束后检查是否有DMA请求,CPU响应之后,让出系统总线,由DMA控制器接管总线来进行数据传输。这是DMA方式中最独特的一点,DMA传送过程中,DMA控制器接管地址总线、数据总线和控制总线,CPU的主存控制信号被禁用,当DMA传送结束后,将恢复CPU的权利再让其继续执行之前的操作。可见DMA具有控制系统总线的能力。
DMA方式不需要经过CPU,但是当IO设备和CPU同时访问主存时,会发生冲突,为了有效使用主存,一般采用以下的三种方式使用主存:
①停止CPU访问主存:
DMA控制器发出信号,CPU让出总线控制权,等到DMA控制器传送完数据之后,再恢复CPU的控制权,这种传送过程中CPU保持不工作或者原始状态。
②DMA与CPU交替访存:
适用于CPU工作周期比主存存取周期长的情况。将一个CPU时钟周期拆成两部分,一部分专供DMA控制器访存,另一部分则供CPU访存,这种方式不需要总线使用权的申请,而是由周期分时控制的。
③周期挪用:
这种方法是前两种方式的折中,IO设备没有DMA请求时,CPU按照程序要求访问主存,一旦IO设备有了DMA请求,就会有三种情况
a、此时CPU不在访存,不会冲突
b、CPU正在访存,等待存取周期结束之后CPU让出总线占有权
c、IO和CPU同时访存,CPU暂时让出总线占有权,由IO设备挪用一个或者几个存储周期
DMA的数据传输分为三个阶段:
①预处理:
由CPU来完成一些必要的准备工作,由CPU执行几条IO指令来测试IO设备的状态,之后CPU继续执行原来的任务,等待IO设备准备好再由DMA控制器向CPU发出总线请求。
②数据传送:
可以按照字节或者字为基本单位,也可以按照数据块为基本单位进行数据传送。这个过程完全由DMA控制器来实现。
③后处理:
DMA控制器向CPU发中断请求,CPU中断服务程序来做DMA的结束处理。
三种IO方式中,最重要的是DMA方式和中断方式,对比如下:
对其中几条做一下说明:第二条中DMA请求可以在任何时刻,但是不能打破计算机内部最小时间单位机器周期,所以才说是在每个机器周期结束时,第六条,从数据传送确实是中断方式完全靠程序,但是中断隐指令仍然是硬件来完成的。
这道题考察的是汉字的存储,汉字在计算机内实际上可以看作是存储了一张图,这个图的大小是16×16,所以一个汉字需要16×16/8=32B,7500个汉字的容量为32B×7500=240000B,约等于240KB。
这道题考察的是屏幕的刷新,分辨率为1600×1200,一个颜色深度为24位,相当于每个像素都需要24位的空间,帧率为85HZ表示每秒刷新85次,所以刷新屏幕需要的带宽就是24b×1600×1200×85,最后总的显存带宽再乘以二,得到结果为7833600000b/s,约等于7834Mb/s,D项正确。
这两道题考察的是关于磁盘结构的计算,转速常用来求旋转延时,7200转每分钟,相当于每秒钟120转,每个磁道有160个扇区,每个扇区是512字节,所以每个磁道上存储了81920B的信息,每秒转120转,再乘以120得到数据传输率为9600KB/s。第二道则是在考察平均时间,这种求时间的题目,关键在于按照平均时间的定义去求出里面的三个部分的值,寻道时间和延迟已经给出,要算的是传输数据的时间和旋转延迟,旋转延迟用转速来求,10000转每分钟,相当于0.006秒一转,旋转延迟取一圈时间的一半,所以是3ms,读写时间直接用4KB/20MB/s得到读写数据的时间为0.2ms,总耗时为3+6+0.2+0.2=9.4ms。
同样是求平均存取时间,这道题的独特之处在于求数据传输时间,由于没有与数据相关的量,所以只能用已知量来算,根据转速求出旋转延迟为4.17ms,传输时间也用转速来求,7200转每分钟,即每转是60/7200秒,相当于每个扇区的访问时间是(60/7200)/1000,再加上8ms的寻道时间,结果约等于12.2ms
这道题题目描述不好理解,百度上所有的解析都是复制粘贴出来的,个人理解是400ns发出一次中断请求,延迟为50ns,所以不管这个中断请求是在400ns中0-50ns的哪一个时刻发出的,400ns内都有100ns是用于中断处理,所以相当于是100/400=25%
有抠字眼的嫌疑,DMA请求是由外部设备发出的,而DMA控制器发出的是总线请求信号。
数据缓存为32位,即4B,设备每秒传送50kB,所以需要传送12.5K次,每次需要1000个时钟周期,所以需要12.5M次,而每秒有1000M个时钟周期,所以百分比为12.5/1000=1.25%
这道题就是考察中断屏蔽字,屏蔽字并不难,表格里面为1表示的是横向所在的行可以屏蔽竖向所在的列,比如说第四行第二列的位置是个1,说明中断源4可以屏蔽中断源2,即4的优先级更高。按照这个道理,只要按照屏蔽字的二进制对应十进制的大小就可以派出中断处理次序:3-1-4-2。第二问主要是有一个排队次序和一个处理次序,两个次序可能会有很大的迷惑性。排队次序表示的是到来的顺序,1先来,CPU先响应1,后面过来的2由于优先级不够,只能等着,3优先级高,插队让1中断,先跳转去执行3,执行完后执行优先级更高的1,在之后还剩一个2和一个4,2在前所以CPU先响应2,然后被优先级高的4插队中断,跳转去执行4之后处理2,总的执行轨迹如下:
这种大题属于很恐怖的存在。首先前面几问必然是送分的,第一问该计算机的MIPS,这个需要看题干,CPU主存为80MHZ,即每秒80M个时钟周期,CPI为4,所以每秒执行20M条指令。cache的命中率为99%,所以缺失的次数为20M×1.5×1%=300K次。每秒300K次的缺失,意味着需要300K次从主存加载到cache,而每次交换的块大小为16B,所以每秒交换4.8MB,即带宽4.8MB/S。第二问接着第一问继续算,0.0005%的缺页率,直接用300K×0.0005%得到缺页的次数为15次。数据缓冲存储器为32位,即4B,而一页是4KB,所以一次缺页就要DMA传送1K次,所以每秒需要DMA请求1.5K次。第三问,显然是DMA控制器的优先级更高,但是原因不太好表达,这里标准答案是如果DMA请求不及时响应,会导致IO的数据丢失。第四问,4体低位交叉存储器,50ns内向四个体存入了4B,所以带宽为4×4B/50ns=320MB/S。
第一问采用定时查询,即程序查询方式,一次IO是10条指令,每条指令是4个时钟周期,查询必须赶在数据缓冲寄存器满之前进行,而A产生32位即4B的数据用时为4B/2MB/S=2毫秒。百分比则可以用时钟周期来计算,一秒需要1/(2×10^-6)次查询,每次查询是10×4=40个时钟周期,所以需要2×10^7个时钟周期,用这个数除以主频,得到的就是百分比,结果为4%。
第二问换用程序中断方式,每次中断为400个时钟周期,即0.8毫秒,而B产生4B的数据仅用0.1毫秒,也就是说没等CPU处理完,产生的数据就又把寄存器挤满了,显然是不能采用这种中断方式的。也可以换种思路,B每秒产生40MB的数据,就需要10M次的中断,每次中断需要400个时钟周期,即4000M个时钟周期,按照主频,需要8秒才能执行完这么多的时钟周期,显然与一秒的时间冲突,所以不能采用程序中断方式。
第三问换用了DMA方式,每次传送1000B,所以一秒就会需要40000次的DMA请求,而一次DMA请求需要500个时钟周期,所以占比为4%。
计算机组成原理搞完,可喜可贺,めでたし。