【OS】操作系统的 I/O

文章目录

I/O管理
核心目标
隐藏硬件细节
实现设备独立性
提高CPU与I/O并行度
硬件基础
I/O设备分类
块设备
字符设备
I/O控制器
功能与组成
数据传输方式
程序直接控制
中断驱动
DMA
通道控制
软件层次结构
用户层软件
设备独立性软件
设备驱动程序
中断处理程序
关键技术
缓冲技术
设备分配与回收
SPOOLing技术
核心算法
磁盘调度算法

下面,我们将依据这个框架,深入展开每个知识点。

一、I/O系统的基本功能与目标

操作系统管理I/O设备,首要目标是隐藏物理设备的细节 ,向用户提供统一的、抽象的接口(如read/write系统调用),从而简化编程。与之紧密相关的是设备独立性 ,允许用户程序使用逻辑设备名请求I/O,而无需关心具体的物理设备,这极大地提高了操作系统的可移植性和易适应性。

此外,I/O系统还致力于提高处理机和I/O设备的利用率 ,通过让两者并行操作来提升系统整体效率;对I/O设备进行控制 ,选择合适的控制方式(如中断、DMA);并确保对设备的正确共享 (区分独占设备与共享设备)以及进行错误处理

二、I/O硬件原理

1. I/O设备的分类

I/O设备种类繁多,通常有以下几种分类方式:

  • 按信息交换的单位分类 :这是最核心的分类。
    • 块设备:数据传输的基本单位是"块"(如磁盘)。特点是可寻址,能随机读写任意一块。
    • 字符设备:数据传输的基本单位是"字符"(如键盘、鼠标)。特点是不可寻址,通常采用中断驱动方式。
  • 按传输速率分类:分为低速设备(如键盘)、中速设备(如打印机)和高速设备(如磁盘)。
2. I/O控制器(设备控制器)

CPU无法直接控制I/O设备的机械部件,因此需要I/O控制器作为"中介"。其主要功能包括:

  • 接受和识别CPU或通道发来的命令
  • 实现数据交换,包括设备与控制器之间、控制器与主存之间的数据传送。
  • 标识和报告设备的状态(如忙碌/空闲)。
  • 实现地址识别 ,区分控制器中的不同寄存器。
    一个I/O控制器可能控制多个设备,其组成通常包括:CPU与控制器接口、I/O逻辑、控制器与设备接口。控制器中的寄存器编址方式有两种:内存映射I/O (寄存器与内存统一编址)和独立编址(使用专用I/O地址空间)。

三、I/O控制方式:数据传输的四种模式

这是本章的重点之一,描述了CPU如何控制数据在内存与I/O设备间传输。其演进过程体现了CPU效率的不断提高。

控制方式 核心思想 CPU干预程度 数据传输单位 主要特点
程序直接控制方式 CPU直接查询设备状态,等待操作完成。 极高(不断轮询,完全串行) 简单但效率极低,CPU利用率差。
中断驱动方式 CPU发出命令后转去做其他事,设备完成后通过中断信号通知CPU。 中等(响应中断、处理数据) 实现了CPU与I/O设备一定程度的并行,但频繁中断开销大。
DMA方式 由DMA控制器接管总线,控制数据直接在设备与内存间传输,完成后中断CPU。 (仅开始和结束时参与) 数据块 大大减少了CPU对I/O的干预,适合高速块设备。
通道控制方式 通道是一种专用I/O处理器,执行通道程序来控制多个I/O控制器,完成I/O任务后中断CPU。 极低 一组数据块 独立性最强,CPU干预最少,适合大型系统。

💡 核心辨析:中断方式和DMA方式都会产生中断信号,但本质不同。中断方式下,数据仍需通过CPU中转;而DMA方式下,数据在设备和内存间直接传输,CPU几乎不参与数据搬运过程。

四、I/O软件层次结构

I/O软件采用分层结构,自下而上依次为:

  1. 中断处理程序:I/O系统的最底层,直接与硬件交互。当设备完成操作发来中断信号时,由其进行相应处理,通常包括保存现场、分析中断原因、执行中断服务程序、恢复现场等。
  2. 设备驱动程序 :与硬件直接相关,是进程和设备控制器之间的通信程序。其主要功能是将上层发来的抽象I/O请求(如读块)转换为对设备控制器的具体命令和参数,并启动设备。每类设备配置一个驱动程序
  3. 设备独立性软件 :这是I/O软件的核心层次,负责实现设备独立性 。其功能包括:
    • 执行所有设备公有操作:设备分配与回收、逻辑设备名到物理设备名的映射、设备保护、缓冲管理、差错控制等。
    • 向用户层提供统一接口:无论何种设备,都提供统一的读写等操作接口。
  4. 用户层I/O软件:实现与用户交互的接口,用户可直接调用库函数进行I/O操作,这些库函数通过系统调用进入内核。

五、I/O核心子系统与关键技术

1. 缓冲技术

引入缓冲的主要原因是为了缓和CPU与I/O设备速度不匹配的矛盾减少对CPU的中断次数 ,并提高CPU和I/O设备之间的并行性

  • 单缓冲:设备和CPU之间设置一个缓冲区。设备输入时,先把数据写入缓冲区,CPU再从缓冲区取数据。
  • 双缓冲:设置两个缓冲区,I/O设备输入数据时,两个缓冲区交替使用,进一步提高了并行度。
  • 循环缓冲区:包含多个缓冲区,形成循环队列,适用于I/O操作频繁且数据量较大的情况。
2. 设备分配与回收

对于独占设备,系统需要根据一定的策略进行分配,常见的策略有先来先服务、优先级高者优先等。分配过程中会涉及设备控制表、控制器控制表、通道控制表等数据结构。

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

SPOOLing是"Simultaneous Peripheral Operation On-Line"的缩写,即"外部设备联机并行操作"。其核心思想是用软件的方式模拟脱机输入/输出技术,将一台独占设备改造成共享设备

SPOOLing系统主要由以下几部分组成:

  • 输入井和输出井:在磁盘上开辟的两个存储区域,用于暂存输入数据和输出数据。
  • 输入缓冲区和输出缓冲区:在内存中开辟,用于缓和CPU与磁盘速度不匹配的矛盾。
  • 输入进程和输出进程 :模拟脱机输入/输出时的外围控制机,负责将数据从低速设备输入到输入井,或将数据从输出井输出到低速设备。
    典型应用------共享打印机:当用户进程请求打印时,SPOOLing系统并不是立即分配打印机,而是在磁盘的"输出井"中为它申请一个空闲盘块,将打印数据写入其中,并建立一张请求打印表挂到打印队列。打印进程从队列中取出请求,将数据从输出井通过输出缓冲区传送给打印机进行实际打印。这样,用户感觉自己在独占打印机,而实际上打印机被多个进程共享使用。

六、磁盘调度算法

对于磁盘这类共享设备,多个进程可能同时请求访问不同的磁道。磁盘调度算法的目标是减少寻道时间,从而提高磁盘I/O效率。常见的算法有:

  • 先来先服务(FCFS):按请求到达的先后顺序调度。简单但可能产生较长的寻道时间。
  • 最短寻道时间优先(SSTF):优先选择与当前磁头位置最近的请求。贪心策略,可能导致"饥饿"现象。
  • 扫描算法(SCAN,电梯算法):磁头沿一个方向移动,处理该方向上的所有请求,直到没有请求后再反向移动。避免了饥饿,但响应频率不均。
  • 循环扫描算法(C-SCAN) :在SCAN基础上,磁头单向移动,返回时直接快速移至起始端而不处理请求,提供了更均匀的等待时间。
    在实际应用中,SCAN和C-SCAN算法常被优化为LOOKC-LOOK算法,即磁头移动方向上无请求时立即改变方向,无需到达磁盘边缘,进一步提高了效率。
相关推荐
creaDelight2 小时前
编写你的第一个 Django 应用(官网demo)
python·django·sqlite
chushiyunen2 小时前
django venv虚拟环境
后端·python·django
tryCbest3 小时前
Django 基础入门教程(第三篇):Admin后台与ORM进阶(单表、多表、聚合查询)
python·django
chushiyunen3 小时前
django数据库配置
数据库·python·django
java1234_小锋3 小时前
Python常见面试题:请解释或描述一下Django的架构?
python·架构·django
chushiyunen3 小时前
django WSGI服务器gunicorn笔记
笔记·django·gunicorn
ding_zhikai3 小时前
【Web应用开发笔记】Django笔记11:Django使用Google邮箱功能
笔记·后端·python·django
源码之屋4 小时前
毕业设计源码:python网易云音乐数据分析可视化平台 Flask+ECharts 多维度数据可视化分析 人工智能 大数据 机器学习 (建议收藏)✅
人工智能·python·信息可视化·django·毕业设计·echarts·课程设计
FL16238631294 小时前
基于yolov11+django+deepseek的交通标志识别系统带登录界面python源码+onnx模型+精美web界面
python·yolo·django