操作系统——输入输出(I/O)管理
目录
一、I/O 管理概述
1.1 I/O 控制方式
1、程序直接控制方式
计算机从外部设备读取数据到存储器,每次读一个字的数据
对读入的每个字,CPU 需要对外设状态进行循环检查直到确定该字已经在 I/O 控制器的数据寄存器中
2、中断驱动方式
允许 I/O 设备主动打断 CPU 的运行并请求服务,从而“解放” CPU,使得设备向 I/O 控制器发送读命令后可以继续做其他有用的工作
3、DMA(直接存储器)方式
在 I/O 设备和内存之间开辟直接的数据交换通路,彻底“解放” CPU
特点:
- 基本单位是数据块
- 数据从设备直接送入内存,或者相反
- 仅在传送一个或多个数据块的开始和结束时才需 CPU 干预,整块数据的传送在 DMA 控制器的控制下完成
为了在主机与控制器之间实现成块数据的直接交换,必须在 DMA 控制器中设置如下4类寄存器:
- 命令/状态寄存器(CR)。接收从 CPU 发来的 I/O 命令,或有关控制信息,或设备的状态
- 内存地址寄存器(MAR)。在输入时,它存放把数据从设备传送到内存的起始目标地址;在输出时,它存放由内存到设备的内存源地址
- 数据寄存器(DR)。暂存从设备到内存或从内存到设备的数据
- 数据计数器(DC)。存放本次要传送的字(节)数
4、通道控制方式
I/O 通道是指专门负责输入/输出的处理器,是 DMA 方式的发展,能够进一步减少 CPU 的干预,即把对一个数据块的读(或写)为单位的干预,减少为对一组数据块的读(或写)及有关控制和管理为单位的干预
I/O 通道与一般处理器的区别:通道指令类型单一且没有自己的内存;通道所执行的通道程序是放在主机内存中的,即通道与 CPU 共享内存
I/O 通道与 DMA 方式的区别:DMA 方式需要 CPU 控制传输的数据块大小、传输的内存位置,而通道方式中这些信息由通道控制。另外,每个 DMA 控制器对应一台设备与内存传递数据,而一个通道可以控制多台设备与内存的数据交换
1.2 I/O 软件层次结构
整个 I/O系统可以视为具有5个层次的系统结构,如图
各层次及其功能如下:
- 用户层 I/O 软件。实现与用户交互的接口,用户可直接调用在用户层提供的、与 I/O 操作有关的库函数,对设备进行操作
- 设备独立性软件。用于实现用户程序与设备驱动器的统一接口、设备命令、设备保护及设备分配与释放等,同时为设备管理和数据传送提供必要的存储空间
- 设备驱动程序。与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动 I/O 设备工作的驱动程序
- 中断处理程序。用于保护被中断进程的 CPU 环境,转入相应的中断处理程序进行处理,处理完并恢复被中断进程的现场后,返回到被中断程序
- 硬件设备。I/O 设备通常包括一个机械部件和一个电子部件。为了达到设计的模块性和通用性,一般将其分开。电子部件称为设备控制器(或适配器),机械部件则是设备本身
二、I/O 核心子系统
I/O设备种类繁多,功能和传输速率差异巨大,需要多种方法来进行设备控制
这些方法共同组成了操作系统内核的 I/O子系统,它将内核的其他方面从繁重的 I/O设备管理中解放出来
I/O核心子系统提供的服务主要有:I/O调度、缓冲与高速缓存、设备分配与回收、假脱机等
2.1 I/O 调度概念
I/O调度就是确定一个好的顺序执行 I/O请求
应用程序发布的系统调用顺序不一定总是最佳选择,需要 I/O调度来改善系统整体性能,使进程之间公平地共享设备访问,减少输入输出所需要的平均等待时间
通过为每个设备维护一个请求队列来实现调度:当一个应用程序执行阻塞 I/O系统调用时,该请求就加到相应设备的队列上,I/O调度会重新安排队列顺序以改善系统总体效率和应用程序的平均响应时间
I/O子系统还可以使用主存或磁盘上的存储空间的技术,如缓冲、高速缓存、假脱机等来改善计算机效率
2.2高速缓存与缓冲区
1、磁盘高速缓存(Disk Cache)
操作系统使用磁盘高速缓存技术来提高磁盘的 I/O速度,对高速缓存数据的访问要比对原始数据的访问更为高效。例如,正在运行的进程的指令既存储在磁盘上,也存储在物理内存上,也被复制到 CPU的二级和一级高速缓存中
磁盘高速缓存技术不同于通常意义下的介于 CPU与内存之间的小容量高速存储器,而是利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。因此,磁盘高速缓逻辑上属于磁盘,物理上则是驻留在内存中的盘块
高速缓存在内存中分为两种形式:
- 内存中开辟一个单独的存储空间作为磁盘高速缓存,大小固定
- 把未利用的内存空间作为一个缓冲池,供请求分页系统和磁盘 I/O 时共享
2、缓冲区(Buffer)
在设备管理子系统中引入缓冲区的目的:
缓和 CPU与 I/O设备间速度不匹配的矛盾
减少对 CPU的中断频率,放宽对 CPU中断响应时间的限制
解决基本数据单元大小(即数据粒度)不匹配的问题
提高 CPU和 I/O设备之间的并行性
其实现方法有:
- 采用硬件缓冲器,但由于成本太高,只有一些关键部件使用
- 采用缓冲区(位于内存区域)
缓冲区有一个特点,当缓冲区的数据非空的时候,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出
根据系统设置缓冲器的个数,缓冲技术可以分为:
1)单缓冲
在设备和处理器之间设置一个缓冲区,设备和处理器交换数据时,先把被交换数据写入缓冲区,然后需要数据的设备或处理机再从缓冲区取走数据
在块设备进行输入时,假定从磁盘把一块数据输入到缓冲区的时间为 T,操作系统将该缓冲区中的数据传送到用户区的时间为 M,而 CPU对这一块数据处理的时间为 C
若 T > C,从初始状态开始,当工作区数据处理完后,时间为 C,缓冲区还没冲满,当缓冲区冲满时,时间为 T,停止再冲入数据。然后缓冲区向工作区传送数据,当工作区满了以后,缓冲区的数据同时也为空,用时为 M,到达下一个开销状态,整个过程用时 M + T
若 T < C,同理,整个过程用时 M + C
所以单缓冲区处理每块数据用时为 Max(C, T) + M
2)双缓冲
根据单缓冲的特点,CPU在传送时间 M内处于空闲状态,由此引入双缓冲
I/O设备输入数据时先装填到缓冲区1,在缓冲区1填满后才开始装填缓冲区2,与此同时处理器可以从缓冲区1中取出数据放入用户进程处理,当缓冲区1中的数据处理完后,若缓冲区2已填满,则处理器又从缓冲区2中取出数据放入用户进程处理,而 I/O设备又可以装填缓冲区1。注意,必须等缓冲区2充满才能让处理器从缓冲区2取出数据
双缓冲机制提高了处理机和输入设备的并行操作程度
3)循环缓冲
包含多个大小相等的缓冲区,每个缓冲区中有一个链接指针指向下一个缓冲区,最后一个缓冲区指针指向第一个缓冲区,多个缓冲区构成一个环形
循环缓冲用于输入/输出时,还需要有两个指针 in和 out。对输入而言,首先要从设备接收数据到缓冲区中,in指针指向可以输入数据的第一个空缓冲区;当运行进程需要数据时,从循环缓冲区中取一个装满数据的缓冲区并提取其中的数据,out指针指向可以提取数据的第一个满缓冲区。输出则正好相反
4)缓冲池
由多个系统的公用缓冲区组成
缓冲区按其使用状况可以形成三个队列:
- 空缓冲队列
- 装满输入数据的缓冲队列(输入队列)
- 装满输出数据的缓冲队列(输出队列)
缓冲区分为四种:
- 用于收容输入数据的工作缓冲区
- 用于提取输入数据的工作缓冲区
- 用于收容输出数据的工作缓冲区
- 用于提取输出数据的工作缓冲区
如图所示
当输入进程需要输入数据时,便从空缓冲队列的队首取得一个空缓冲区作为收容输入工作缓冲区,然后把输入数据输入其中,装满后再将它挂到输入队列队尾
当计算进程需要输入数据时,便从输入队列取得一个缓冲区作为提取输入工作缓冲区,计算进程从中提取数据,数据用完后再将它挂到空缓冲队列尾
当计算进程需要输出数据时,便从空缓冲队列的队首取得一个空缓冲区作为收容输出工作缓冲区,当其中装满输出数据后,再将它挂到输出队列队尾
当输出进程需要输出数据时,从输出队列中取得一个装满输出数据的缓冲区作为提取输出工作缓冲区,当数据提取完后,再将它挂到空缓冲队列的队尾
3、高速缓存与缓冲区对比
区别 | 高速缓存 | 缓冲区 |
---|---|---|
存放数据 | 存放的是低速设备上某些数据的复制数据,即高速缓存上有的低速设备上面必须有 | 存放的是低速设备传递给高速设备的数据(或者相反),而这些数据在低速设备(或高速设备)却不一定有备份,这些数据再从缓冲区传送到高速设备(或者低速设备) |
目的 | 高速缓存存放的是高速设备经常要访问的数据,如果高速设备要访问的数据不在高速缓存中,高速设备就需要访问低速设备 | 高速设备和低速设备的通信都要经过缓冲区,高速设备永远不会直接去访问低速设备 |
2.3设备分配与回收
1、设备分配概念
设备分配是指根据用户的 I/O请求分配所需的设备
总原则是充分发挥设备的使用效率,尽可能地让设备忙碌,又要避免由于不合理的分配方法造成进程死锁
从设备的特性可分为以下三种:
- 独占式使用设备。 在申请设备时,如果设备空闲就将其独占,不再允许其他进程申请使用,一直等到该设备被释放才允许其他进程申请使用
- 分时式共享使用设备。 独占式使用设备设备利用率很低,当设备没有独占使用的要求时,可以通过分时共享使用提高利用率
- 以假脱机方式使用外部设备。实质上是对 I/O操作进行批处理,以空间换取时间;请求分页系统中的页面调度算法是以时间换空间
2、设备分配的数据机构
设备分配依据的主要数据结构有设备控制表 (DCT) 、控制器控制表 (COCT) 、通道控制表 (CHCT) 和系统设备表(SDT)
各数据机构功能:
一个设备控制表只表征一个设备,这个控制表中的表项就是设备的各个属性
每个设备分为机械部件和电子部件两部分,其中负责解析上层传达的命令并控制解析部件运作的是电子部件(控制器)。每个设备控制表都需要一个表项来表示控制器,也就是指向控制器控制表
整个系统只有一张系统设备表。它记录已连接到系统中的所有物理设备的情况,每个物理设备占一个表目
由于多道程序系统中进程数多于资源数,会引起资源的竞争。因此要有一套合理的分配原则,主要考虑的因素有:I/O设备的固有属性、I/O设备的分配算法、I/O设备分配的安全性以及I/O设备的独立性
3、设备分配的策略
①设备分配原则
设备分配应根据设备特性、用户要求和系统配置情况
分配的总原则:既要充分发挥设备的使用效率,又要避免造成死锁,还要将用户程序和具体设备隔离开
②设备分配方式
设备分配方式有静态分配和动态分配两种
静态分配主要用于对独占设备的分配。在用户作业开始执行前,由系统一次性分配该作业所要求的全部设备、控制器(如通道等)。一旦分配后,这些设备、控制器(和通道)就一直为该作业所占用,直到该作业被撤销。静态分配方式不会出现死锁,但设备的使用效率低,不符合分配的总原则
动态分配是在进程执行过程中根据执行需要进行。当进程需要设备时,通过系统调用命令向系统提出设备请求,系统按照事先规定的策略给进程分配所需要的设备、I/O控制器,用完之后立即释放。动态分配方式有利于提高设备的利用率,但如果分配算法使用不当,则有可能造成进程死锁
③设备分配算法
常用的动态设备分配算法有先请求先分配、优先级高者优先等
独占设备既可以用动态分配方式也可以采用静态分配方式,往往采用静态分配方式。共享设备可被多个进程所共享,一般采用动态分配方式,但在每个 I/O传输的单位时间内只被一个进程所占有,通常采用先请求先分配和优先级高者优先的分配算法
4、设备分配的安全性
设备分配的安全性是指设备分配中应防止发生进程死锁
①安全分配方式
每当进程发出 I/O请求后便进入阻塞状态,直到其 I/O操作完成时才被唤醒。这样进程已经获得某种设备后便阻塞,不能再请求任何资源,而且阻塞时也不保持任何资源
优点:设备分配安全。缺点:CPU和 I/O设备是串行工作的(对同一进程而言)
②不安全分配方式
进程在发生 I/O请求后继续运行,需要时又发出第二个、第三个 I/O请求等。仅当进程所请求的设备已被另一进程占用时,才进入阻塞状态
优点:一个进程可同时操作多个设备,从而使进程推进迅速。缺点:这种设备分配有可能产生死锁
5、逻辑设备名到物理设备名的映射
为了提高设备分配的灵活性和设备的利用率,方便实现 I/O重定向,引入设备独立性。设备独立性是指应用程序独立于具体使用的物理设备
为了实现设备独立性,在应用程序中使用逻辑设备名来请求使用某类设备
系统中设置一张逻辑设备表(LUT),用于将逻辑设备名映射为物理设备名,LUT表项包括逻辑设备名、物理设备名和设备驱动程序入口地址。当进程用逻辑设备名请求分配设备时,系统为它分配相应的物理设备,并在 LUT中建立一个表项,以后进程再利用逻辑设备名请求 I/O操作时,系统通过查找 LUT来寻找相应的物理设备和驱动程序
系统采取两种方式建立逻辑设备表:
- 整个系统中只设置一张 LUT。所有进程的设备分配情况都记录在这张表中,不允许有相同的逻辑设备名,主要适用于单用户系统中
- 为每个用户设置一张LUT。当用户登录时,系统便为该用户建立一个进程,同时也为之建立一张 LUT,并将该表放入进程的 PCB中
2.4假脱机技术(SPOOLing技术)
为了缓和 CPU的高速性与 I/O设备的低速性之间的矛盾,引入了脱机输入/输出技术
该技术利用专门的外围控制机,将低速I/O设备上的数据传送到高速磁盘上,或者相反
SPOOLing是外部设备同时联机操作,又被称为假脱机输入/输出操作,是操作系统中采用的一项将独占设备改造成共享设备的技术
SPOOLing系统组成如图所示
1、输入井和输出井
在磁盘上开辟的两个存储区域。输入井模拟脱机输入时的磁盘,用于收容 I/O设备输入的数据;输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据
2、输入缓冲区和输出缓存区
在内存中开辟的两个缓冲区。输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输出设备。
3、输入进程和输出进程
输入进程模拟脱机输入时的外围控制机,将用户要求的数据从输入机通过输入缓冲区再送到输入井。当 CPU需要输入数据时,直接将数据从输入井读入内存
输出进程模拟脱机输出时的外围控制机,把用户要求输出的数据先从内存送到输出井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备
共享打印机是使用 SPOOLing技术的一个实例,这项技术已被广泛地用于多用户系统和局域网络中。当用户进程请求打印输出时,SPOOLing系统同意为它打印输出,但并不真正立即把打印机分配给该用户进程,而只为它做两件事:
- 由输出进程在输出井中为之申请一个空闲磁盘块区,并将要打印的数据送入其中
- 输出进程再为用户进程申请一张空白的用户请求打印表,将用户的打印要求填入其中,再将该表挂到请求打印队列上
SPOOLing系统的主要特点:提高了I/O的速度,将独占设备改造为共享设备,实现了虚拟设备功能
操作系统——输入输出(I/O)管理的更多相关文章
- 轻量级操作系统FreeRTOS的内存管理机制(一)
本文由嵌入式企鹅圈原创团队成员朱衡德(Hunter_Zhu)供稿. 近几年来,FreeRTOS在嵌入式操作系统排行榜中一直位居前列,作为开源的嵌入式操作系统之一,它支持许多不同架构的处理器以及多种编译 ...
- 操作系统——第五章 输入输出(I/O)管理
这就是SDT表和DCT表
- linux输入输出及vim管理
一.理解系统的输入输出 输入输出系统是计算机重要组成部分,是沟通计算机与外界的桥梁. 二.管理输入输出的符号 1.输出重定向 > ##重定向正确输出 ...
- 操作系统(2)_进程管理_李善平ppt
所有程序都有CPU和io这两部分,即使没有用户输入也有输出. CPU最好特别忙,io空闲无所谓. 程序/数据/状态 三个维度来看进程. 等待的资源可能是io资源或者通信资源(别的进程的答复). 一个进 ...
- 网络操作系统 第七章 管理TCP/IP网络
本章小结 本章介绍了TCP/IP的相关概念,并且在此处基础上,介绍了Windows Server 2008中使用TCP/IP网络配置工具实现网络连接和管理的方法,在Linux系统中,讲解了是如何使用图 ...
- 操作系统(5)_内存管理_李善平ppt
i386先通过段是管理,在通过页是管理
- 基于操作系统原理的Webmin管理工具的安装使用
一.实验目的 1.了解Webmin管理工具的功能. 2.掌握Webmin的安装. 3.掌握Webmin管理工具的使用 二.实验内容 1.下载Webmin安装包. 2.在Linux主机中安装Webmin ...
- 吴裕雄--天生自然Linux操作系统:Linux 磁盘管理
Linux磁盘管理好坏直接关系到整个系统的性能问题. Linux磁盘管理常用三个命令为df.du和fdisk. df:列出文件系统的整体磁盘使用量 du:检查磁盘空间使用量 fdisk:用于磁盘分区 ...
- ucore操作系统学习(四) ucore lab4内核线程管理
1. ucore lab4介绍 什么是进程? 现代操作系统为了满足人们对于多道编程的需求,希望在计算机系统上能并发的同时运行多个程序,且彼此间互相不干扰.当一个程序受制于等待I/O完成等事件时,可以让 ...
随机推荐
- mysql那些事(5)建表存储引擎的选择
在mysql见表的时候,会遇到选择存储引擎:MyISAM和InnoDB.究竟用哪种存储引擎好呢? 1.MyISAM:表锁:支持全文索引:读并发性能较好. 2.InnoDB:行锁:支持事务,支持外键:写 ...
- react-starter-projects
react-starter-projects These are repositories that you copy and modify to create your own React app. ...
- 通过Javascript 创建POST提交, 无页面刷新下载
前端准备: //Download the template through "POST" request function getTargertContainer() { var ...
- springcloud+kafka集群
上节说了kafka在linux环境下怎么搭建集群.这节写一下怎么在springcloud中以stream流方式去做kafka集群对接. 1.yml配置 #spring Cloud kafka -- s ...
- eNSP 简介及基础操作
eNSP 一. eNSP简介 eNSP是一款由华为自主研发的.免费的.可扩展的.图形化操作的网络仿真工具平台,主要对企业网络路由器.交换机及相关物理设备进行软件仿真,支持大型网络模拟.界面如下: 界面 ...
- C 可变参数函数的本质
C语言支持定义可变参数的函数,方法是在函数的参数列表最后加上 " ... ",代表变长的参数列表,例如: void Func(int num, ...) { } 需要注意 “... ...
- CF 1136A 1136B 1136C 1136D 1136E(Round546ABCDE)题解
题目地址:https://codeforces.com/contest/1136 A: Nastya Is Reading a Book 题解:挨个判断即可,水题. 参考代码: #include< ...
- Python之Flask项目开发【入门必学】
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:藤藤菜丶 Flask 安装Flask模块 创建一个Flask项目 运行 ...
- windows下安装ssdb
官方下载 http://ssdb.io/docs/install.html 这是官方网站 官方建议 Do not run SSDB server on Windows system for a pro ...
- 2019年终总结:10场演讲、内推20人、公众号2万粉丝、Code Runner 1000万下载
2019年是值得记录的一年,成长许多,也收获许多. 做了 10 场大会的技术演讲,成功内推 20 人拿到微软 Offer,知乎 Live 2000 听众,公众号 2 万粉丝,GitHub 2万 sta ...