【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算法,即磁头移动方向上无请求时立即改变方向,无需到达磁盘边缘,进一步提高了效率。
相关推荐
hanxiuchao2 天前
告别客户端臃肿!网页端 M3U8 播放调试方案,适配全办公场景
运维·python·django·m3u8·m3u8播放
程序员羽痕2 天前
基于深度学习的眼疾识别系统
人工智能·pytorch·深度学习·分类·django
流云鹤3 天前
1. 配置环境、创建导航栏
python·django
流云鹤3 天前
2.登录模块
python·django
流云鹤3 天前
专题栏说明
python·django
XGeFei4 天前
【Django学习笔记】—— Django 高并发通俗讲解
笔记·学习·django
weixin_BYSJ19874 天前
springboot美食食谱小程序---附源码24044
java·spring boot·python·spring cloud·django·tomcat·php
许彰午5 天前
87_Python Django模型与数据库
数据库·python·django
weixin_BYSJ19876 天前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
Database_Cool_7 天前
RAG 混合检索首选:阿里云 Lindorm 向量+全文一体化检索
数据库·阿里云·django·云计算