文章目录
- 第五章 IO管理
-
- 00-IO设备的概念和分类
-
- 概念’
- 01-IO控制器
- 02-IO控制方式
-
- 2.1 程序直接控制方式
- 2.2 中断驱动方式
- 2.3DMA方式 ——直接存储器存取
- 2.4通道控制方式
- 03-IO软件层次结构
- 04-核心子系统
- 05-假脱机技术
- 06-设备的分配与回收
-
- 设配分配考虑的因素
- 静态分配和动态分配
- 设备分配管理当中的数据结构
- 设备分配的具体步骤
- 07-缓冲区管理
-
- 缓冲区的作用(为什么要引入)
- 单缓冲
- 双缓冲
- 循环缓冲区
- 缓冲池
第五章 IO管理
00-IO设备的概念和分类
概念’
IO设备
UNIX系统把外部设备抽象为一种特殊的文件,用户可以使用与文件操作相同的方式对外部设备进行操作
Write操作:向外部设备写出数据
Read操作:从外部设备读入数据
分类
-
人机交互类
-
存储设备
-
络通信
-
块设备(磁盘块、内存块)——速率高,可寻址
-
字符设备(鼠标、键盘,)——不可寻址,常采用中断驱动方式
01-IO控制器
-
机械部件
- 执行具体的物理操作
-
电子部件(IO控制器或者叫设备控制器)
-
通常是主办扩充槽的印刷电路板
-
功能
- 是CPU和机械部件的中介
- 接收和识别CPU发出的命令——有相应的控制寄存器来存储CPU发出的命令和参数
- 向CPU 告设备的状态————状态寄存器
- 数据交换——————————数据寄存器:CPU和物理设备之间的数据缓冲
- 地址识别——————————为了区分设备控制器的各个寄存器,需要给各个寄存器设置一个特定的“地址”。IO控制器通过CPU提供的地址来判断要做什么事
-
-
IO控制器的组成
-
CPU与控制器的接口——各种需要的寄存器
-
I / O逻辑
? 对设备发出命令
-
控制器与设备的接口
?
-
-
CPU用控制线和地址线让IO逻辑给出指令,同时CPU给各个**寄存器(在IO控制器的与CPU接口的部分)**基于数据,IO逻辑返回给状态寄存器状态
-
blablabla
-
注意:
-
io控制器连接着多个设备
-
各种寄存器可能有多个
- 所以要针对状态寄存器编址
- 内存映像IO
- 顺着内存的地址继续往下编址
- 优点:简化了指令,直接当是在操作内存
- 寄存器独立编址
- 寄存器自己有从0开始的寄存器
- 内存映像IO
- 所以要针对状态寄存器编址
02-IO控制方式
- 复习点:
-
- 完成一次读写操作的流程
- CPU干预的频率
- 数据传送的单位
- 数据的流向
- 主要缺点和主要优点
-
2.1 程序直接控制方式
-
完成一次读写操作的流程(轮询)
-
CPU干预频率很频繁
-
数据传送的单位——每次一个字
-
数据的流向——
读操作——IO设备-CPU-内存
写操作——内存-CPU-IO设备
-
优缺点:实现简单但是串行工作效率奇低
2.2 中断驱动方式
当CPU发出读写命令后,让等待IO进程的阻塞,CPU检测到中断信 之后,会保存当前进程的运行环境信息,去处理中断程序处理这个IO的事
-
完成一次读写操作的流程
-
CPU干预的频率
- 低很多
-
数据传送的单位
- 还是一个字
-
数据的流向
- 同上
-
主要缺点和主要优点
相对程序直接控制方式CPU不用轮询了
每个字和IO设备之间传输都要CPU停一下当前做的事,中断这个事需要保存和恢复当前运行进程的环境信息,时间开销大
2.3DMA方式 ——直接存储器存取
相对于中断驱动方式,用于块设备的IO有这样几个改进
-
数据传送单位是块(磁盘块,内存块)
-
数据直接在设备和内存之间流动
-
仅在传输一组数据的开始和结束时才需要CPU干预
-
数据的流向
- IO和内存(没有CPU)
-
优缺点:
- 减少了CPU的介入,
- 但是没办法让CPU读写多个离散存储的数据块,还是会多次中断
2.4通道控制方式
弱鸡版的CPU
-
流程
- CPU给通道发指令
- 通道执行内存中的通道程序
- 执行完向CPU发中断信 CPU进行后续处理(完成IO后需要做的事)
-
CPU干预的频率极低
-
数据传送的单位
- 一组数据块(可以是离散的)
-
数据的流向
- 内存和设备之间
5.优缺点
? 缺点:实现复杂,需要专门的通道硬件支持
优点:CPU、通道、IO设备可并行工作,资源利用率很高
03-IO软件层次结构
用户层软件 ————假脱机技术(SPOOLing技术) |
---|
设备独立性软件————与设备硬件特性无关的功能都在这里实现————IO调度、设备保护、设备分配与回收、缓冲区管理 |
设备驱动程序—————厂家实现的对设备的具体控制—————— |
中断处理程序—————有点像回调函数 |
硬件—————————机械部件和IO控制器 |
04-核心子系统
重点功能:
【IO调度】
用算法确定好的顺序处理各个请求
【设备保护】
设备有相应的FCB,也有访问权限控制
【假脱机技术】
【SPOOLing技术】
【设备分配与回收】
【缓冲区管理】
05-假脱机技术
SPOOLing技术,用软件的而方式模拟脱机技术
Spooling
- spooling系统的组成
- 输入井和输出井——模拟脱机输入输出时的磁带
- 输入进程和输出进程——模拟脱机输入输出的外围机
- 输入缓冲区和输出缓冲区——内存中的缓冲区
- spooling如何共享打印机
-
- 磁盘输出井中为进程申请空闲缓冲区、把数据放在缓冲区里面
- 给用户进程申请一个打印请求表,把打印请求表填入表中,再把这个表挂到假脱机文件队列上
- 输出进程根据假脱机文件队列取一个请求表,进行输出
-
06-设备的分配与回收
设配分配考虑的因素
-
设备的固有属性:独占设备、共享设备、虚拟设备
- 独占设备——一个时段只能分享给一个进程
- 共享设备——宏观共享微观交替
- 虚拟设备——采用SPOOLing技术将独占设备改造成虚拟的共享设备,可分配给多个进程使用
-
设备分配算法
- 先来先服务
- 优先级高者优先
- 短任务优先
-
设备安全分配方式
- 安全分配方式:为进程分配一个设备后就将进程阻塞,完成IO之后才将进程唤醒(串行的优缺点)
- 不安全分配方式:只有当某个io请求得不到满足的时候阻塞(并行的优缺点)
静态分配和动态分配
-
静态分配
- 进程运行之前就给他分配所需的全部的资源
-
进程运行过程中动态的申请设备资源
设备分配管理当中的数据结构
一个通道可以控制多个设备控制器,每个设备控制器可以控制多个设备
系统会给每一个设备配备一个设备控制表DCT,用于记录设备情况
-
DCT
- 设备类型
- 设备(唯一)标识符
- 设备状态
- 指向控制器表的指针
- 重复执行次数或时间(用于记录失败了几次,足够数量才认为这次io失败)
- 设备队列的对手指针(正在等待该设备的进程队列(由进程PCB组成队列))
每个设备控制器都有一张控制器控制表COCT。操作系统根据COCT的信息对控制器进行操作和管理
-
COCT
- 控制器(唯一)标识符
- 控制器状态
- 指向通道表的指针
- 控制器队列的队首指针(指向了正在等待这个设备控制器的进程)
- 控制器队列的队尾指针(指向了正在等待这个设备控制器的进程)
**通道控制表CHCT:**每个通道都对应一张CHCT。
-
CHCT
- 通道标识符
- 通道状态
- 与同道链接的控制器表首地址
- 通道队列的队首指针(指向等待通道的进程的等待队列)
- 通道队列的队尾指针(指向等待通道的进程的等待队列)
**系统设备表SDT:**记录了系统中全部设备的情况(用户用设备名请求的时候,系统从这里找)
- SDT
- 每一个设备对应一个表目
- 【设备类型】【设备标识符】【DCT设备控制表】【驱动程序入口】
- 每一个设备对应一个表目
设备分配的具体步骤
-
- 根据进程请求的物理设备名查找SDT(物理设备名是进程请求分配设备时提供的参数)
- 根据SDT找DCT(操作系统在逻辑设备表LUT中新增一个表项)
- 根据DCT找COCT
- 根据COCT找CHCT
缺点:
- 用户变成需要用【物理设备名】,用户不方便变成
- 换个设备就运行不了
- 进程请求的物理设备正在忙,即使系统中还有同类型的设备,进程也必须等待
改进方法
? 建立逻辑设备与物理设备名的映射机制,用户编程只用提供逻辑设备名
? 第一步更改成根据进程请求的逻辑设备名查找
两种逻辑设备表设置方式:
- 整个系统只有一张LUT:各个用户使用的逻辑设备不允许重复,,适合单用户操作系统
- 每个用户一张LUT:不同用户逻辑设备名可重复,适合多用户操作系统
07-缓冲区管理
缓冲区的作用(为什么要引入)
- 缓和CPU和IO设备速度不匹配
- 减少CPU的中断频率,
- 解决数据粒度不匹配的问题
- 提高COU和IO设备的并行性
单缓冲
假设某用户进程请求某种块设备读入若干的数据。
操作系统会在主存中为其分配一个缓冲区(默认是一个块)
缓冲区数据非空时,不能往缓冲区冲入数据,只能把缓冲区数据传出,才可以。且必须缓冲区满了才可以传出数据
求平均处理一个块要多久
假设初始状态为工作区满,缓冲区空,
- 计算时间就是
- 每次缓冲区给工作区数据的时间,CPU处理和块设备缓冲都不能工作,所以是个单独的时间
- 当缓冲区把数据都给工作区了之后,CPU处理和块设备缓冲一起开始工作,无论这两个哪个先完成都不能进行下一次缓冲传送,
- 所以一次的时间就是缓冲区把数据给工作区的时间加上CPU处理和块设备缓冲中时间更长的哪个
双缓冲
假设某用户进程请求某种块设备读入若干的数据。
操作系统会在主存中为其分配两个个缓冲区(默认是两个块)
循环缓冲区
多个大小相等的缓冲区连接成一个循环队列
in指针指向下一个可以冲入数据的空缓冲区
out指针指向下一个可以取出数据的满缓冲区
缓冲池
缓冲池由系统的共用的缓冲区组成
-
根据使用状况分为:
- 空缓冲队列
- 装满输入数据的缓冲队列
- 装满输出数据的缓冲队列
-
根据功能分为:
- 收容输入的工作缓冲区
- 提取输出的工作缓冲区
- 提取输入的工作缓冲区
- 收容输出的工作缓冲区
-
四种操作:
-
输入进程请求输入数据
-
- 【空缓冲队列】队头取下一块空缓冲区作为【收容输入的工作缓冲区】,
- 等上面 的【收容输入的工作缓冲区】充满了之后把它挂到【输入队列】的队尾上
-
-
计算进程想要取得一块输入数据
-
- 【输入队列】的队头取下一块缓冲区把它作为【提取输入的工作缓冲区】
- 等上面【提取输入的工作缓冲区】被取空了之后就把他挂到【空缓冲队列】的队尾上
-
-
计算进程想要将准备好的数据冲入缓冲区
-
- 从【空缓冲队列】队头取下一块作为【收容输出数据的工作缓冲区】
- 等上面的【收容输出数据的工作缓冲区】充满后再挂到【输出队列】的队尾
-
-
输出进程请求输出数据
-
- 从【输出队列】队头取下一块作为【提取输出数据的工作缓冲区】
- 等上面的【提取输出数据的工作缓冲区】释放没了,再把它挂到【空缓冲队列队尾上】
-
-
输入进程请求输入数据
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!