5-2输入/输出管理-I/O核心子系统

I/O核心子系统主要提供的服务:I/O调度、缓冲与高速缓存、设备分配与回收、假脱机、设备保护、差错处理
在这里插入图片描述

一.I/O调度

用某种算法确定一个好的顺序来处理各个I/O请求,使进程之间公平的共享设备访问,减少I/O完成所需要的平均等待时间

如:磁盘调度(先来先服务算法、最短寻道优先算法、SCAN算法、C-SCAN算法、LOOK算法、C-LOOK算法)。当多个磁盘I/O请求到来时,用某种调度算法确定满足I/O请求的顺序。
同理,打印机等设备也可以用先来先服务算法、优先级算法、短作业优先等算法来确定I/O调度顺序。

二.设备保护

操作系统需要实现文件保护功能,不同的用户对各个文件有不同的访问权限(如:只读、读和写等)。在UNIX系统中,设备被看做是一种特殊的文件,每个设备也会有对应的FCB。当用户请求访问某个设备时,系统根据FCB中记录的信息来判断该用户是否有相应的访问权限,以此实现“设备保护”的功能。

三.SPOOLing技术(假脱机技术)

在手工操作阶段,主机直接从l/O设备获得数据,由于设备速度慢,主机速度很快。人机速度矛盾明显,主机要浪费很多时间来等待设备。

为了缓和CPU的高速性和I/O设备低速性之间的矛盾,批处理阶段引入了脱机输入/输出技术(用磁带完成)。在外围控制机的控制下,慢速输入设备的数据先被输入到更快速的磁带上。之后主机可以从快速的磁带上读入数据,从而缓解了速度矛盾。
在这里插入图片描述
在这里插入图片描述

SPOOLing技术是用软件的方式模拟脱机技术,是操作系统中采用的一项将独占设备改造成共享设备的技术。

(1)SPOOLing系统组成

在这里插入图片描述
(2)共享打印机原理分析
打印机是独占设备,通过SPOOLing技术可以将其改造成共享打印机。

当多个用户申请使用打印机时,假脱机管理进程在磁盘输出井中为进程申请一个空闲缓冲区,并将要打印的数据送入其中。然后为用户进程申请一张空白的打印请求表,并将用户的打印请求填入表中,再将该表挂到假脱机文件队列上。

在这里插入图片描述

当打印机空闲时,输出进程会从文件队列的队头取出一张打印请求表,并根据表中的要求将要打印的数据从输出井传送到输出缓冲区,再输出到打印机进行打印。用这种方式可依次处理完全部的打印任务。

虽然系统中只有一个台打印机,但每个进程提出打印请求时,系统都会为在输出井中为其分配一个存储区(相当于分配了一个逻辑设备),使每个用户进程都觉得自己在独占一台打印机,从而实现对打印机的共享。

四.设备的分配与回收

1.设备分配时应该考虑的因素

(1)设备特性
①独占式设备(独占设备)
②分时式共享使用设备(共享设备)
③以SPOOLing方式使用外部设备(虚拟设备):将独占设备改造成虚拟的共享设备

(2)设备分配算法
先来先服务、优先级高者优先、短任务优先等

(3)设备分配中的安全性
①安全分配方式
每当进程发出I/O请求后便进入阻塞态,直到其I/O操作完成时才被唤醒。
优点:设备分配安全
缺点:CPU和I/O设备是串行工作的
②不安全分配方式
进程在发出I/O请求后继续运行,需要时又发出第二个、第三个I/O请求。仅当进程所请求的设备已被另一进程占用时,才进入阻塞态
优点:进程的计算任务和I/O任务可以并行处理,一个进程可以同时操作多个设备,从而迅速推进进程
缺点:可能产生死锁

2.静态分配和动态分配

(1)静态分配:进程运行前为其分配全部所需资源,运行结束后归还资源
(2)动态分配:进程运行过程中动态申请设备资源

3.设备分配管理中的数据结构

一个通道可控制多个设备控制器,每个设备控制器可控制多个设备。
在这里插入图片描述
用于设备分配的数据结构:
设备控制表DCT(Device Control Table)
控制器控制表COCT(Controller control table)
通道控制表CHCT(Channel Control Table)
系统设备表SDT(System Device Table)

(1)设备控制表DCT(Device Control Table)

每个设备有一张DCT,系统为每个设备配置一张DCT,以记录本设备的情况。DCT中的每个表目有一个指向COCT的指针。

在这里插入图片描述

(2)控制器控制表COCT(Controller control table)

每个控制器有一张COCT,系统为每个控制器都设置一张用于记录本控制器情况的COCT。
设备控制器控制设备与内存交换数据,设备控制器又需要请求通道为它服务,因此COCT中有一个CHCT指针。

在这里插入图片描述

(3)通道控制表CHCT(Channel Control Table)

系统为每个通道配置一张CHCT,以记录通道情况。
一个通道可为多个设备控制器服务,因此CHCT中必有一个指针指向一个表,这个表上的信息表达的是CHCT提供服务的那几个设备控制器,因此CHCT中有一个COCT指针

在这里插入图片描述

(4)系统设备表SDT(System Device Table)

SDT整个系统中只有一张,它记录系统中全部设备的情况,是系统范围内的数据结构。SDT中有一个DCT指针。

在这里插入图片描述

4.设备分配的步骤

①根据进程请求的物理设备名查找SDT(注:物理设备名是进程请求分配设备时提供的参数)
②根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程。
③根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
④根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。

只有设备、控制器、通道三者都分配成功时,这次设备分配才算成功,之后便可启动I/0设备进行数扩据传送

缺点:
①用户编程时必须使用“物理设备名”,底层细节对用户不透明,不方便编程
②若换了一个物理设备,则程序无法运行
③若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待

5.设备分配步骤的改进方法

为了解决上述缺点,可以建立逻辑设备名与物理设备名的映射机制,用户编程时只需提供逻辑设备名

①根据进程请求的逻辑设备名查找SDT(注:用户编程时提供的逻辑设备名其实就是“设备类型”)
②查找SDT,找到用户进程指定类型的、并且空闲的设备,将其分配给该进程。操作系统在逻辑设备表(LUT)中新增一个表项。
③根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
④根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。

在这里插入图片描述
逻辑设备表(LUT)建立了逻辑设备名与物理设备名之间的映射关系。某用户进程第一次使用设备时使用逻辑设备名向操作系统发出请求,操作系统根据用户进程指定的设备类型(逻辑设备名)查找系统设备表,找到一个空闲设备分配给进程,并在LUT中增加相应表项。如果之后用户进程再次通过相同的逻辑设备名请求使用设备,则操作系统通过LUT表即可知道用户进程实际要使用的是哪个物理设备了,并且也能知道该设备的驱动程序入口地址。

五.缓冲区管理

1.什么是缓冲?为什么要引入缓冲

(1)缓冲是一种为了使通信双方的速度匹配而引入的一种中间层次的技术,这个中间层次的速度介于通信双方之间。
缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可利用内存作为缓冲区。使用硬件作为缓冲区的成本较高,容量也较小,一般仅用在对速度要求非常高的场合(如存储器管理中所用的联想寄存器,由于对页表的访问频率极高,因此使用速度很快的联想寄存器来存放页表项的副本)。但更多的是使用内存作为缓冲区,“设备独立性软件”的缓冲区管理就是要组织管理好这些缓冲区

在这里插入图片描述

(2)引入缓冲
①缓解CPU和I/O设备间速度不匹配的矛盾
②减少对I/O的中断频率,放宽对CPU中断响应时间的限制
③解决基本数据单元大小不匹配的问题。输出进程每次生成一整块的数据,而I/O设备每次只能输出一个字符,采用缓冲区,输出进程将一整块数据放入缓冲区,I/O设备可以从缓冲区中逐个字符取。
④提高CPU和I/O设备之间的并行性

  • 当处理机和外部设备速度差距较大时,并且此时不想让其中一方等待,有什么办法可以解决问题?
    可以采用缓冲技术来缓解处理机与外部设备速度上的矛盾,即在某块地方设立一片缓冲区,外部设备与处理机的输入/输出都经过缓冲区,这样外部设备和处理机就都不用互相等待。

2.单缓冲

在设备和处理机之间设置一个缓冲区。设备和处理机交换数据时,先把被交换数据写入缓冲区,然后需要数据的设备或处理机从缓冲区取走数据。

满可取,空可冲(入数据)

设从磁盘把一块数据输入缓冲区的时间为T,操作系统将该缓冲区中的数据传送到用户区的时间为M,CPU对这一块数据处理的时间为C

在这里插入图片描述
假设初始工作区满,缓冲区空。

若T>C,则当工作区数据处理完成后(时间C),缓冲区还没充满。又经过T-C的世界,缓冲区充满,此时停止冲入数据。然后缓冲区向工作区传送数据。工作区满后缓冲区正好为空,用时M。整个过程用时T+M

若T<C,整个过程用时C+M

因此单缓冲区处理每块数据用时为 max{T,C}+M

3.双缓冲

假设某用户进程请求某种块设备读入若干块的数据。若采用双缓冲的策略,操作系统会在主存中为其分配两个缓冲区(若题目中没有特别说明,一个缓冲区的大小就是一个块)

假设初始工作区空,其中缓冲区1满,缓冲区2空
在这里插入图片描述
若T>C+M,缓冲区1开始向工作区传送数据,缓冲区2开始冲入数据,当工作区充满数据并处理完后,用时C+M,又过了T-(C+M)缓冲区2充满。整个过程用时T

若T<C+M,缓冲区1开始向工作区传送数据,缓冲区2开始冲入数据。当工作区充满数据后,缓冲区1为空,时间为M,然后工作区开始处理数据,缓冲区2继续冲入数据。因为此时只有一个I/O设备,因此此时缓冲区1为空但不能冲入数据。当缓冲区2充满数据后,设备空闲。再过(C+M)-T工作区数据处理完毕,但在这期间设备也向缓冲区1冲入了一部分数据。此时并不能很好的找到下一个初始状态。整个过程用时C+M

双缓冲区处理每块数据用时为 max{T,C+M}

可以看出,当M+C<T时,可使块设备连续输入;当M+C>T时可使CPU不必等待设备输入

【单缓冲和双缓冲在通信时的区别】
两台机器之间通信时,可以配置缓冲区用于数据的发送和接受。

若两个相互通信的机器只设置单缓冲区,在任一时刻只能实现数据的单向传输。
在这里插入图片描述
若两个相互通信的机器设置双缓冲区,则同一时刻可以实现双向的数据传输。
在这里插入图片描述

4.循环缓冲

将多个大小相等的缓冲区链接成一个循环队列。

橙色表示已充满数据的缓冲区,绿色表示空缓冲区
在这里插入图片描述

5.缓冲池

缓冲池由系统中共用的缓冲区组成。这些缓冲区按使用状况可以分为:空缓冲队列、装满输入数据的缓冲队列(输入队列)、装满输出数据的缓冲队列(输出队列)

在这里插入图片描述

根据一个缓冲区在实际运算中扮演的功能不同,又设置了四种工作缓冲区:用于收容输入数据的工作缓冲区(hin)、用于提取输入数据的工作缓冲区(sin)、用于收容输出数据的工作缓冲区(hout)、用于提取输出数据的工作缓冲区(sout)

在这里插入图片描述

①某输入进程请求输入数据,系统从空缓冲队列的队头取下空缓冲区,做为用于作为用于收容输入数据的缓冲区,当缓冲区充满之后挂到输入队列的队尾。
②计算进程要想取得一块输入数据,操作系统会从输入队列的队头取下一个缓冲区,把它作为提取输入的工作缓冲区。该缓冲区中的数据被传送到计算进程的工作区中,当缓冲区数据取空后,挂到空缓冲队列的队尾。
如果此时计算进程想要将准备好的数据冲入缓冲区,系统会从空缓冲队列的队头取下一个空闲缓冲区,作为收容进程想要输出数据的工作缓冲区,该缓冲区被充满,被挂到输出队列的队尾。
④某输出进程请求输出数据,系统会从输出队列的队头取下一块缓冲区,把他作为提取输出数据的工作缓冲区,当缓冲区被取空之后,将其挂到空缓冲区队列的队尾

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡__卡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值