操作系统自学笔记——IO设备 简述2

文章详细介绍了设备驱动程序的功能,包括与设备控制器的交互、命令转换、设备状态检查等。设备独立性软件提供统一接口,逻辑设备到物理设备的映射,使得应用独立于具体设备。IO缓冲区用于缓和CPU与设备速度差异,提高系统效率。文章还讨论了不同类型的IO控制方式,如轮询、中断和DMA,并提到了假脱机系统(Spooling)在提高IO性能和设备共享上的作用。最后,介绍了进程间的缓冲区同步问题及缓冲池的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 设备驱动程序
  • 设备独立性软件
  • 用户层的io
  • 缓冲区

设备驱动程序

功能

  1. 接收由与设备无关的软件发来的命令和参数,并将命令中的抽象要求转换与设备相关的低层操作序列
  2. 检查用户请求的合法性,了解I/O设备的工作状态,传递与IO设备操作有关的参数,设置设备的工作方式
  3. 发出I/O命令,如果设备空闲,便立即启动IO设备,完成指定的IO操作;如果设备忙碌,则将请求者的请求块挂在设备队列上等待
  4. 及时响应由设备控制器发来的中断请求,并根据其中断类型,调用相应的中断处理程序进行处理

特点

  • 驱动程序是实现在与设备无关的软件和设备控制器之间通信和转换的程序
  • 与设备控制器以及I/O设备的硬件特性紧密相关
  • 与I/O设备所采用的I/O控制方式紧密相关
  • 与硬件紧密相关(使用汇编语言)
  • 应允许可重入

设备处理方式

为每一类设备设置一个进程  专门用于执行这类设备的io操作

整个系统中设置一个io进程 专门用于执行系统中所有各类设备的io操作

不设置专门的设备处理进程 只为各类设备设置相应的设备驱动程序

设备驱动程序的主要任务:

        启动指定设备,完成上层指定的io工作

处理的过程

        将抽象的要求转换为具体的要求   在驱动程序中 将要求转换为命令 数据 参数 

        对服务请求进行校验  检查io请求该设备是否能够执行

        检查设备的状态 检查设备是否进去就绪状态

        传送必要的参数 在确定涉笔处于就绪状态后,可以将控制器的数据和本次数据传输有关的参数传送到相应的寄存器中

        启动io设备 驱动程序可以向控制器中的命令寄存器传输相应的控制命令

对io设备的控制方式

轮询的可编程io方式

        CPU干预的频率:频繁

        数据传送的单位:

        数据的流向:

                写: 内存 CPU IO

                读:IO CPU 内存

        实现简单

        CPU利用率低

   

中断的可编程io方式

        CPU干预的频率:只在io开始和完成干预

        数据传送的单位:

        数据的流向:

                写: 内存 CPU IO

                读:IO CPU 内存

        CPU和io可以并行工作

        要进行频繁的中断处理,会消耗较多的CPU时间

 

直接存储器访问方式

        CPU干预的频率:只有传送的开始和结束时干预

        数据传送的单位:

        数据的流向:

                写: 内存 IO

                读:IO 内存

        CPU介入频率大幅度降低

        每次发送一条IO指令,只能读写一个或者多个连续的数据块

io通道控制方式

        CPU干预的频率:极低

        数据传送的单位:一组数据块

        数据的流向:

                写: 内存 IO

                读:IO 内存

        CPU 通道 io设备可以并行工作 资源利用效率很高

        硬件设施复杂

        表中记录的信息: 执行的操作 程序结束位 记录结束 读写字节数 内存地址(读写内存首址)

设备独立性软件

与设备无关的软件

1. 以物理设备名使用设备

2. 引入逻辑设备名

        例如打印机:/dev/printer

        io重定向:用于io操作的设备可以更换,二不必改变应用程序

3. 逻辑设备名称到物理设备名称的转换

        程序执行的时候,要根据逻辑设备表,将逻辑地址转换为物理地址

功能:

设备驱动程序的统一接口

        每个设备驱动程序与io之间都有相近的接口

        将抽象的设备名称映射到适当的驱动程序上

缓冲管理

差错控制

        暂时性的错误:网络传输数据 磁盘传输数据

        持久性的错误:电源掉电 磁盘划痕 计算除以零

对独立设备进行分配与回收

设计提供大小统一独立于设备的逻辑数据块,隐藏差异

设备分配

DCT 设备控制表

        设备类型

        设备标识符

        设备状态:是否在等待 忙or闲

        指向控制表的指针

        重复执行的次数或者时间

        设备队列的队首指针

控制器控制表COCT

通道控制表 CHCT

系统设备表SDT

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

设备固有属性

独占设备 共享设备 虚拟设备

分配算法

先来先服务 优先级高者优先

安全性

安全分配方式 进程一旦获得某种设备便阻塞,不能再请求任何资源

不安全分配方式 进程持续发现io请求,知道请求设备被占用,才会被阻塞

逻辑设备名到物理设备映射的实现

逻辑设备表: 逻辑设备名 物理设备名 驱动程序入口地址

逻辑设备表的设置方法:

        整个系统设置一张LUT

        每个用户设置一张LUT

用户层的io

假脱机系统 Spooling

输入设备→输入缓冲区(内存)→输入井(磁盘)

输出设备←输出缓冲区(内存)←输出井(磁盘)

特点:

        提高了IO的速度

        独占设备改造为共享设备

        实现了虚拟设备功能

守护进程 daemon

守护进程+假脱机文件队列(目录)

        打印机守护进程

        服务器守护进程

        网络守护进程

      

缓冲区

解决的问题

        缓和CPUI/O设备间速度不匹配的矛盾

        减少对CPU的中断频率,放宽对CPU中断响应时间的限制

        解决数据粒度不匹配的问题

        提高CPUI/O设备之间的并行性

分类:

单缓冲区

双缓存区

环形缓冲区

进程间同步可能出现的问题

        输入进程数据的速度 > 计算进程处理数据的速度

                系统受计算的限制,缓冲区满

        输入进程数据的速度 < 计算进程处理数据的速度

                系统受io限制,无数据可算

缓冲池

        既可以用于输入,又可以用于输出

        公用,共享

组成:空白缓冲队列 输入队列 输出队列

Getbuf过程

//Getbuf

void Getbuf(unsigned type){
    Wait(RS(type));
    Wait(MS(type));
    B(number)=Takebuf(type);
    Signal(MS(type));
}

Putbuf过程

//Putbuf

void  Putbuf(unsigned type){
	Wait(RS(type));	
	Addbuf(type, number);
	Signal(MS(type));
	Signal(RS(type));
}

与缓冲区的区别:

缓冲区是一组内存块的链表

缓冲池是一个管理的数据结构,一组操作函数的管理机制

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值