目录
一 I/O设备的基本概念和分类
什么是I/O设备
按使用特性分类:
- 人机交互类外部设备
- 存储设备
- 网络通信设备
按传输速率分类:
- 低速设备
- 中速设备
- 高速设备
按信息交换的单位分类:
- 块设备(传输快,可寻址)
- 字符设备(传输慢,不可寻址)
二 I-O控制器
I-O控制器的组成
I/O设备由机械部件和电子部件(即I/O控制器,起到CPU和I/O的中介作用)组成,用于实现对I/O设备的控制
I-O设备的组成:CPU与控制器的接口(实现CPU与控制器之间的通信)+I/O逻辑(负责接收和识别CPU的各种指令)+控制器与设备的接口(用于实现控制器和设备之间的通信)
内存映像I/O和寄存器独立编址
内存映像I/O,控制器中的寄存器与内存地址统一编址。(可以采用对内存进行操作的指来对控制器进行操作)
寄存器独立编址,控制器中的寄存器使用单独的地址。(缺点:需要设置专门的指令)
I-O控制器的功能
- 接受和识别CPU发出的指令(I-O控制器中有相应的控制寄存器来存放命令和参数)
- 向CPU报告设备的状态(I-O控制器中有相应的状态寄存器记录设备的状态,如空闲、忙碌)
- 数据交换(I-O控制器中有相应的数据寄存器。输出时,暂存CPU发来的数据。输入时,取走寄存器中的数据)
- 地址识别(类似于内存的地址)
三 I-O控制方式
4种控制方式CPU干预频率逐渐降低,实现内存到外设的传输
程序直接控制方式
- CPU不断轮寻(key word)检查控制器的状态
- CPU干预的频率很频繁
- 数据传送的单位,每次读/写一个字
- 数据的流向
读操作(数据输入):I/O设备–>CPU–>内存
写操作(数据输出):内存–>CPU -->IO设备 - 主要缺点和优点
优点:实现简单
缺点:CPU和I/O只能串行工作,CPU需要一直轮询检查,长期处于“忙等”状态,CPU利用率低。
中断驱动方式
引入中断机制,将等待的I/O进程阻塞。CPU检测到中断信号再去执行中断程序处理该中断。
- CPU会在每个指令周期的末尾检查中断
- 中断处理过程中需要保存、恢复进程的运行环境
这个过程需要一定时间开销,频率太高也会影响性能。 - I/O操作开始前和完成后需要CPU介入,等待I/O完成的过程中CPU可以切换到别的进程执行。
- 主要优点和缺点:
优点:CPU和I/O设备可并行执行,CPU利用率提高
缺点:这个过程需要一定时间开销,频率太高也会消耗CPU处理时间。
对于速率为9.6KB/s的数据通信来说,如果说设置一个具有8位的缓冲寄存器,则CPU中断时间和响应时间大约分别为( )。
(A)0.8ms,0.8ms (B)8ms,1ms
(C)0.8ms,0.1ms (D)0.1ms,0.1ms
本题的考核要点是中断时间和响应时间的计算。设计的内容为:
①.已知传输速率为9.6KB/s的数据通信,产生中断的频率为9.6KHZ。题中引用了8位的缓冲寄存器可使中断频率降为1/8,即,9.61024/8。那么,CPU的中断时间为T1:
T1=8/(9.61024)≈0.8ms。
②.CPU的响应时间T2为:
T2=1/(9.6*1024) ≈0.1ms。
(注意:若再增设一个8位的缓冲寄存器,响应时间也可放宽到0.8ms。)
用流程图描述设备中断的处理过程
①. 唤醒被阻塞的驱动程序进程。
②. 保护被中断进程的CPU现场信息。
③. 分析中断原因,转入相应的中断处理程序执行。
④. 进行中断处理。对于输入设备中断处理来说,需要将读入的数据从缓冲区转到用户区;对于输出设备来说,可将用户区中的下一批数据转到缓冲区。无论输入还是输出,都可重新启动外部设备进行下一次I/O,同时,还要将等待I/O的进程唤醒。
⑤. 恢复被中断程序的现场。
流程图为:
DMA方式
直接存储器存取
- 数据的传送单位是“块”,每次读写的只能是连续的多个块,这些块读入内存够在内存中也必须是连续的
- 数据的流向是直接从设备到内存
- 仅在传送一个或多个数据块的开始和结束才需要CPU干预(CPU把工作“外包”给DMA)
- 优点:并行性提升 缺点:每次读写的只能是连续的多个块
DMA控制器
DMA工作流程
①CPU需要访问外存时,便发送一条访问命令给DMA的命令寄存器CR、一个内存地址码给DMA的内存地址寄存器MAR、本次要传送的字节数给DMA的数据计数器DC、外存地址给DMA的I/O控制逻辑中。
②启动DMA控制器,然后CPU转其他任务处理。
③DMA控制器负责控制数据在内存与外存之间传送。每传送一个字节就需挪用一个内存周期,按MAR从内存读出或写入内存一个字节,修改MAR和计数器DC。
③当DC修改为0,表示传送结束,由DMA向CPU发出中断请求。
通道控制方式
通道:一种硬件,“弱鸡版的CPU”,可以识别并执行一系列通道指令,但是可以执行的指令很单一,并且通道程序是放在主机内存中的,与CPU共享内存。
在硬件结构中只有数组多路通道支持多个通道程序并发执行。
① 字节多路通道含有多个子通道。每个子通道连接一台低速设备,以轮流方式共享主通道。任一子通道交换完一个字节后就将主通道让给下一个子通道。
② 数组选择通道可连接多台高速外设,具有较高的传输速率。它有一台分配型子通道,一段时间内只能执行一道通道程序,使一台设备独占通道以进行数据交换,直到交换完后才可让给其他的设备。
③ 数组多路通道含有多个非分配型子通道,每个子通道连接一台高速外设,以轮流方式共享主通道。任一子通道交换完若干字节后就将主通道让给下一个子通道。
例6.11下面是一段简单的通道程序,则四个选项中叙述不正确的是( )。
操作 P R 计数 内存地址
WRITE 0 1 90 743
WRITE 0 1 100 250
READ 0 1 230 1200
WRITE 0 0 120 400
WRITE 0 1 120 350
READ 1 1 70 2000
(A)该段通道程序包括六条、两类通道指令
(B)这些指令涉及的数据内存地址有相邻接的地方
(C)该段通道程序共处理了5条记录
(D)单记录最大为230个字节
本题考核的是通道程序的功能。涉及的概念有:
①.每一行就是一条指令;该段通道程序的6条指令可分为WRITE和READ两类通道指令。
①. 在6条指令中,第2条和第5条指令访问的内存地址是邻接的。
②. 在通道指令中,域R是记录的结束标志。R=0表明本通道指令与下一条通道指令处理的数据属于同一条记录;R=1表明本指令处理完数据后,记录就结束了。因此上面的程序涉及5条记录。
③. 程序中的第4条指令和第5条指令共同处理一条记录,即第4条记录。记录的长度为240(120+120)字节。
答案应为D。
四 I-O软件层次结构
设备独立性软件和设备驱动程序和中断处理程序属于I-O核心子系统
从用户到硬件发出I/O请求,从硬件到用户发出I/O应答
- 用户层软件实现与用户交互的接口,享受提供方便易用的库函数
- 设备独立性软件(设备无关性软件):
①向上一层提供调用接口,用于系统调用
②设备的保护
③差错处理
④设备的分配与回收
⑤数据缓冲区管理
⑥建立逻辑设备到物理设备名的映射关系
为什么要引入设备独立性?如何实现设备独立性?
①设备独立性又称为设备无关性。它指的是应用程序在使用设备进行I/O时,使用的是逻辑设备,而系统在实际执行时使用的是物理设备,由操作系统负责逻辑设备与物理设备的映射。引入设备独立性可以使设备的分配具有极大的灵活性,并易于实现I/O重定向。
②系统为每个进程设置一张“逻辑设备表”(LUT)。当某进程用逻辑名来请求设备时,系统查阅“系统设备表”SDT,为它分配相应的可用物理设备。系统将这种用户逻辑设备与系统物理设备的映射,建立在该用户的LUT中,并将该物理设备的驱动程序入口地址填入LUT中。以后,该进程利用逻辑设备名请求I/O操作时,系统通过查找LUT即可找到物理设备及其驱动程序。
- 设备驱动程序:设置寄存器、检查设备状态
① 将抽象要求转化为具体要求,
② 检查用户I/O请求的合法性,了解外设的状态,设置设备的工作方式
③ 向设备发出I/O命令,启动设备,实现I/O。
④ 响应通道发来的中断请求,根据中断类型调用响应的中断处理程序。
⑤ 构造通道程序。
设备驱动程序又称设备处理程序,主要特点有:
①将进程的I/O请求传送给设备控制器,并将设备控制器记录的设备状态、I/O完成情况反馈给进程。
②设备驱动程序与设备的紧密性相关,不同的设备应配置不同的设备驱动程序。
③设备驱动程序与I/O控制方式紧密相关,四种控制方式应当各不相同。
④设备驱动程序与硬件紧密相关,部分程序必须用汇编语言编写。目前,驱动程序的基本操作都被固化到ROM中了。
- 中断处理程序:
当设备完成了I/O之后,设备控制器向CPU发送一个中断请求,CPU响应后即可转向中断处理程序。中断处理程序的工作可分为以下几步:
①唤醒等待该项I/O的进程。 ②保护被中断进程的CPU运行环境。 ③分析中断原因,转入相应的中断处理程序。 ④进行中断处理。
⑤恢复被中断进程的现场。
- 硬件:执行I/O操作,由机械部件、电子部件组成
五 I-O核心子系统
设备独立性软件和设备驱动程序和中断处理程序
六 I-O假脱机技术
脱机技术
手工操作阶段,主机直接从I/O设备获得数据,I/O设备速度很慢,主机速度很快,需要浪费主机时间等待。
批处理阶段引入脱机输入/输出技术(用磁带完成)
输入时将数据输入到更快速的磁带上,主机通过磁带读取数据
输出时宿主机将数据输出到磁带上,然后再传给外围控制机。
脱机(脱离主机的控制进行输入输出操作)
假脱机技术(SPOOLing技术)
用软件的方式模拟脱机技术
输入进程和输出进程。输入进程实现的是收容输入和提取输入,模拟输入时的外围控制机。在收容输入时,负责将输入设备的数据通过内存输入缓冲区转存到磁盘的输入井中;提取输入时,负责将磁盘输入井的数据送入内存用户区。
输出进程实现的是收容输出和提取输出,模拟输出时的外围控制机,过程与输入过程相反。
输入输出井。这是在磁盘上开辟两个大空间,一个是输入井,用来收容输入设备上的数据(模拟拖机输入的磁盘);另一个是输出井,用来收容用户进程的输出数据(模拟脱机输出的磁盘)。
输入缓冲区和输出缓冲区。这是内存中开辟的两个缓冲区,一个是输入缓冲区,暂存输入设备来的数据,以后再传送到输入井;另一个是输出缓冲区,暂存输出井送来的数据,以后传送到输出设备。
请求打印队列
共享打印机
独占设备–只允许各个进程串行使用的设备。
共享设备–允许多个进程“同时”使用的设备。
打印机是一种独占式设备,可以用SPOOLing技术改成“共享式设备”
1系统在磁盘的输出井中申请一个空闲缓冲区,并将要打印的数据送入其中;
2为用户申请一张空白的打印请求表,并将用户的打印请求填入表中,再将该表挂到假脱机文件队列上。
当打印机空闲时,输出进程会从文件队列的队头申请一张打印请求表,并根据表中的要求将要打印的数据从输出井传送到输出缓冲区,再输出到打印机进行打印。
SPOOLing技术把一台物理设备虚拟成逻辑上的多台设备(系统在输出井为每一个进程分配了一个存储区),可以将独占式设备改造成共享式设备。
七 设备的分配与回收
应考虑的因素
固有属性
- 独占设备
- 共享设备
- 虚拟设备
设备分配算法
先来先服务
优先级高者优先
短任务优先
…
设备分配的安全性
安全分配方式:为进程分配一个设备后就将进程阻塞,本次I/O完成后才能将进程唤醒
一个时间段内每个进程只能使用一个设备
优点:破坏了“请求和等待”条件,不会死锁
缺点:对于一个进程来说,CPU和I/O设备只能串行工作
不安全分配方式:进程发出I/O请求后,系统为其分配I/O设备,进程可继续执行,之后还可以发出新的I/O请求。只有I/O请求得不到满足才将其阻塞。
优点:CPU和I/O设备可以并行工作
缺点:可能发生死锁
静态分配和动态分配
静态分配:进程运行前为其分配全部所需资源,运行结束后归还资源(破坏了“请求和保持”条件,不会发生死锁)
TIPS:四个死锁必要条件的破坏方式
互斥:不容易破坏
请求和保持:静态资源分配
环路等待:进程按顺序访问资源
不可抢占:外界撤销某些进程
死锁的预防即不允许死锁的发生,可以从破除死锁发生的四个必要条件入手。因为如果不具备上述四个必要条件,那么死锁就一定不会发生。
(1)互斥:不容易破除
(2)占有并等待:静态资源分配,资源不够不开始。
(3)不可抢占:外界撤销某些进程。
(4)环路等待:进程按顺序访问资源(执行)。
死锁的预防即不允许死锁的发生,可以从破除死锁发生的四个必要条件入手。因为如果不具备上述四个必要条件,那么死锁就一定不会发生。
(1)互斥:不容易破除
(2)占有并等待:静态资源分配,资源不够不开始。
(3)不可抢占:外界撤销某些进程。
(4)环路等待:进程按顺序访问资源(执行)。
动态分配:进程运行过程中动态申请设备资源
安全分配和不安全分配
①安全分配是一种“摈弃请求和保持条件”的资源分配方式。在这种方式中,一个进程请求资源一旦获得(比如I/O请求时获得所需的设备),该进程就由运行状态变为阻塞状态,使它不可能再请求新的资源。相反,当该进程开始运行时(比如I/O完成后被唤醒),它已不占有资源。因此,这种分配摈弃了造成死锁的一个条件,分配是安全的。这种分配方式的缺点是进程推进速度慢,因为CPU与I/O是串行的。
②不安全的分配方式是指,进程在提出资源请求时(比如I/O请求)并不将它阻塞,而是允许它继续使用CPU,并提出第二次资源请求。这样,若第二次请求的资源已被其他进程占用使该进程被阻塞时,则该进程具备了“请求和保持”条件,可能产生死锁,因而说,这种分配是不安全的分配。
设备分配管理中的数据结构
一个通道可控制多个设备控制器,每个设备控制器可控制多台设备
设备控制表DCT:系统为每个设备配置一张DCT,用于记录设备情况
控制器控制表COCT:每个设备控制器都会对应一张COCT,操作系统根据COCT的信息对控制器进行操作和管理
通道控制表CHCT:每个通道都会对应一张CHCT,操作系统根据CHCT的信息对通道进行操作和管理。
系统设备表SDT:记录了系统中的全部设备的情况,每个设备对应一个表目。
设备分配步骤
- 根据进程请求的物理设备名(即设备标识符)查找SDT
- 根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程
- 根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程
- 根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程
只有设备、控制器、通道三者都分配成功,这次设备才算分配成功,之后便可启动I/O设备进行数据传输。
缺点:
用户必须知道“物理设备名”,底层细节对用户不透明。
若换了一个设备,则程序无法运行
若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待
设备分配步骤的改进
建立逻辑设备名和物理设备名的映射机制,用户编程时只需要提供逻辑设备名(即设备类型)
- 根据进程请求的逻辑设备名(即设备类型)查找SDT
- 根据SDT找到用户指定类型并且空闲的设备,将其分配给该进程。操作系统在逻辑设备表(LUT)中新增一个表项。
- 根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程
- 根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程
逻辑设备名 | 物理设备名 | 驱动程序入口地址 |
---|---|---|
/dev/printer | 3 | 1024 |
/dev/tty | 5 | 2046 |
… | … | … |
逻辑设备表(LUT)的设置问题:
整个系统只有一张LUT:各用户所用的逻辑设备名不允许重复,只适用于单用户操作系统
每个用户一张LUT:不同的逻辑设备名可重复,适用于多用户操作系统
逻辑设备表(LUT)的主要功能是将物理地址映射为逻辑地址和设备独立性。LUT是系统为每个进程配置的一种数据结构。该结构被保存到进程的PCB中,内含两个域:逻辑设备名和指向系统设备的指针。
设备独立性的优点有:
• 方便用户编程。用户不必知道设备在系统中的标识。
• 便于程序移植。程序中使用的是逻辑设备,与具体的物理设备无关,因此便于移植到其他系统中。
• 资源利用率提高。如果一台设备忙或者有故障,可换另外一台。
• 能适应多用户多进程的需要。
设备驱动程序是设备管理的底层软件,用于控制I/O设备进行具体输入输出操作。此外,当输入输出操作完成时,产生的外中断信号由系统予以响应,转入设备中断处理程序,根据操作的状态进行相应的处理。
八 缓冲区管理
缓冲区概念
缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可以利用内存作为缓冲区
硬件作为缓冲区的成本较高,容量也较小
一般更多利用内存作缓冲区。
缓冲区的作用:
- 缓和CPU与I/O设备之间速度不匹配的矛盾
- 减少对CPU的中断频率,放宽对CPU中断相应时间的限制
- 解决数据粒度不匹配的问题
- 提高I/O设备和CPU之间的并行性
单缓冲
操作系统会在主存中为其分配一个缓冲区。
当缓冲数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据冲走。当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区冲满后才能把数据传出。
eg:计算每处理一块数据平均需要多久?
技巧:假定一个初始状态,分析下次到达相同状态需要多少时间,这就是处理一块数据的平均所需时间。单缓冲区题型可假定初始工作区满,缓冲区空。
初始状态:工作区满,缓冲区空
假设T>C
t=T+M
假设T<C
t=C+M
故t=M+max(T,C)
双缓冲
操作系统为主存分配两个缓冲区
eg:计算每处理一块数据平均需要多久?
假设T>C+M
假设初始状态:工作区空,其中一个缓冲区满,一个缓冲区空
t=max(T,C+M)
双缓冲区可以实现两个机器的双向传输
循环缓冲
将多个大小相等的缓冲区链接成一个循环队列
多缓冲用于输出时的情况
一般情况下,需要将多缓冲区形成一个环。环上设置两个指针:Nexti和Nextg。前者指出数据的存入位置,后者指出数据的提取位置。下图是由6个缓冲区组成的环,其中,带阴影的表示是装满数据的缓冲区,不带阴影的是空缓冲区。
当需要将环中的一个缓冲区数据输出时,①用P操作独占该环;②判断Nexti与Nextg是否重合,若是重合则表示环中数据已空,需要通过V操作释放该环,并阻塞等待。③若Nexti与Nextg没有重合,则从Nextg处取出一个缓冲区的数据,将Nextg顺序向后推一个位置,需要通过V操作释放该环。
缓冲池
缓冲池由系统中共用的缓冲区组成。
按使用情况分为
- 空缓冲队列
- 装满输入数据的缓冲队列
- 装满输出数据的缓冲队列
按功能不同又分为:收容输入,提取输入,收容输出,提取输出的缓冲区
通常,缓冲池中有3个队列:em队列(空白缓冲区队列)、in队列(装满输入数据的缓冲区队列)、out队列(装满输出数据的缓冲区队列)。
令参数type表示缓冲队列类型,number表示缓冲区号。缓冲池管理中负责数据输入的过程可包括:
(1) 过程get_buf(type,number):以某种选取规则从type指定的缓冲区队列中摘取一个缓冲区number。
(2) 过程put_buf(type,number):将number 缓冲区程将缓冲区放入相应缓冲区队列。
使用上述操作,输入过程可被描述如下:
(1) 输入进程调用过程get_buf(em,number)从空白缓冲区队列em中取出一个缓冲区,返回的号码为number。将该空白缓冲区命名为hin。
(2) 将输入的数据装入缓冲区hin,当hin中装满了由输入设备输入的数据之后,系统调用过程put_buf(in,hin)将该缓冲区插入输入缓冲队列in中。
①当需要输入数据时,调用GetBuf(emq)过程从空闲队列上摘下一个空缓冲区,作为收容输入工作缓冲区hin,输入的数据被装入hin中,装满hin后,调用PutBuf(inq,hin)过程将hin挂入输入队列inq中。
②当需要输出数据时,调用GetBuf(outq)过程从输出队列上摘下一个装满数据的缓冲区,作为提取输出工作缓冲区sout,将sout中的数据提取输出,sout的数据被提取完后,调用PutBuf(emq,sout)过程将sout挂入空闲队列中。