简介

操作系统的I/O管理(input/output mannagment)是协调,控制计算机与外部设备(如磁盘,键盘,网络接口)等之间数据交换的核心功能。实现可靠高效且统一(隐藏设备差异,如磁盘、串口、网卡的硬件特性)的设备访问

前几章讲述的CPU管理,内存管理,文件管理。都是在计算机主机内部进行的操作。

而I/O管理是对外部设备进行操作。这中间一定会有一层"抽象"层

I/O控制器

CPU无法直接控制I/O设备的机械部分(比如硬盘的磁臂,显示器的灯珠等),因此I/O设备还要有一个电子设备作为"中转",由I/O设备提供给CPU,实现CPU对I/O设备的控制。这个设备叫做I/O控制器

I/O控制器需要有如下几个功能

  1. 接受和识别CPU发出的指令

    解析CPU发送的I/O指令,转化为设备可识别的操作,比如磁盘的寻址,扇区读写。

  2. 向CPU报告设备状态

    I/O控制器中会有相应的状态寄存器,来表示设备状态。忙碌or空闲

  3. 数据交互

  4. 地址识别

以CPU向I/O设备输出数据为例子:

  1. CPU通过控制线向I/O控制器发送指令,并在地址线上说明要操作哪一个设备。
  2. CPU通过数据总线,得出I/O控制器的状态,假定状态空闲。
  3. CPU通过数据总线,将指令的参数放入控制寄存器。随后从后者取值
  4. CPU通过数据总线,输出数据到数据寄存器。随后从后者取值。
  5. 与设备进行交互。

I/O控制方式

I/O控制方式主要有四种:

  1. 程序直接控制方式(Programmed I/O, Polling)

    原理:cpu通过不断轮询,查询状态寄存器。直到设备ready。

    优点:无需硬件中断,实现简单。

    缺点:性能浪费,CPU空转。

场景:单片机电路开关,LED指示灯。

  1. 中断驱动 I/O 方式(Interrupt-Driven I/O)

    原理:CPU发送I/O请求后执行其它任务,I/O设备就绪时主动向CPU发送中断信号,触发CPU暂停当前任务,转为处理I/O中断。

    优点:提高CPU利用率,且提高响应(鼠标移动)

    缺点:中断每次都需要保存/恢复上下文。高频中断会导致CPU效率降低。

场景:鼠标、键盘、打印机等设备运行

  1. 直接内存访问方式(Direct Memory Access,DMA)

    原理:通过专用的DMA控制器代替数据总线,直接在设备与内存之间传输数据,无需CPU干预。CPU仅仅在传输开始前配置DMA参数,传输完成后处理中断。

    优点:CPU利用率接近100%,仅处理启动和完成中断。

    缺点:需要硬件支持(DMAC),且多个设备可能有竞争。如果CPU要读写离散的多个数据,需要发出多条I/O指令,无法做到多路复用。

场景:磁盘、SSD、网卡(需传输大量数据,如 GB 级文件读写)。显卡通过 DMA 直接访问内存帧缓冲区,提升图像渲染效率

与中断驱动相比,DMA的传输单位变为了"block",不再是一个字一个字的传输

数据直接与内存交互,不再需要CPU作为快递小哥传输

  1. 通道控制方式(Channel I/O)

    原理:引入独立于CPU的I/O通道处理器,专门负责处理 I/O 指令和设备通信。通道可执行专用的 “通道程序”,控制多个设备的并发操作,相当于一个弱鸡版的CPU

    优点:解放CPU,无需CPU处理。一次性处理多条数据,多路复用。

    缺点:成本极高,需要专用硬件。生态欠缺,需要依赖硬件厂商编写驱动程序。

场景:大型机、数据中心服务器(同时处理磁盘I/O ,网络I/O)。

特性 程序直接控制 中断驱动 DMA 通道控制
CPU参与度 全程参与(轮询) 仅处理中断 仅配置/收尾 仅发起请求
数据传输方式 CPU直接读写 CPU通过控制器读写 DMA控制器直接读写内存 通道处理器独立控制
适用设备 低速简单设备 中速交互式设备 高速块设备(磁盘、网卡) 多设备高并发(大型机)
CPU利用率 极低 中等 接近100%
典型场景 嵌入式传感器 键盘、打印机 磁盘文件读写 大型机数据中心
硬件依赖 中断控制器 DMA控制器 专用通道处理器
传输单位 一组块

I/O软件的层次结构

在操作系统中,I/O 软件层次结构通过分层设计将复杂的输入输出功能解耦,实现硬件无关性、模块化和高效管理。

  1. 硬件层

    执行具体操作,比如磁盘寻道,数据读写;生产中断信号;处理设备与内存之间的数据传输(DMA)。
  2. 中断处理程序

    响应中断;保存/恢复现场;通知驱动设备,比如数据就绪or错误。
  3. 设备驱动程序

    设备初始化;命令转换;I/O请求调度;状态监控
  4. 与设备无关的 I/O 层

    提供设备无关接口,比如通过文件描述符将设备视为“文件”,比如VFS系统;设备分配与回收;错误处理;缓冲区管理;元数据管理;
  5. 用户层 I/O 软件

    将系统调用封装为库函数;假脱机,多任务环境下,将独占设备模拟为共享设备,比如通过磁盘缓冲区实现打印机的多任务排队。

假脱机技术,又称“SPOOling技术”,全程Simultaneous Peripheral Operations On-Line。是操作系统用于将独占设备虚拟为共享设备的核心技术,通过磁盘作为中间缓冲区,使得多个进程能并发访问独占设备,提高系统利用率。

设备的分配与回收

根据设备的使用方式,设备分为3类:

  1. 独占设备

    同一时间只能被一个进程占用,采用 静态或动态分配,分配后独占直到释放。
  2. 共享设备

    允许多个进程并发访问(通过分时或调度),采用 动态分配,效率高但需调度算法
  3. 虚拟设备

    通过磁盘缓冲区将独占设备模拟为共享设备,分配的是缓冲区资源而非物理设备本身

为了安全,高效的使用这些设备,分配设备时,需要遵循如下几个目标:

  1. 资源利用率最大化

    减少设备空闲时间,避免CPU忙等或阻塞
  2. 避免死锁
  3. 公平性与优先级

    平衡各个进程之间的需求,优先处理高优先级任务。比如同时发生鼠标移动事件与打印机打印事件,孰轻孰重要拎得清。

设备的数据结构

  1. 设备控制表(DCT)

    每个物理设备一张表,记录设备类型,状态,当前占用进程,阻塞进程队列。
  2. 控制器控制表(COCT)

    记录控制器状态,对应通道的指针,等待队列。
  3. 通道控制表(CHCT)

    记录通道状态及分配情况(通道是控制外设与内存数据传输的硬件部件,需与控制器、设备配合使用)
  4. 系统设备表(SDT)

    全局表,列出系统所有设备的基本信息(类型、标识符、驱动程序入口等)

设备的分配策略

从分配方式来说,可以分为两种:

  1. 静态分配

    原理:在进程启动前分配所有所需设备及相关资源(比如控制器,通道),进程结束后统一回收。

    优点:简单,不会死锁。

    缺点:利用率低,进程很有可能"占着茅坑不拉屎"。

  2. 动态分配

    原理:进程运行时按需申请设备,使用完毕后立即释放。

    优点:提高设备利用率。

    缺点:可能因资源竞争导致死锁。

演化与内存分配方式的演化是一个套路,因此对于分配算法不再介绍,先来先服务,优先级高有限等等。都是一个思路。

对于一个设备,他被调用时,分配流程如下。

  1. 请求设备

    进程通过系统调用(如open())申请设备,指定设备类型或逻辑名(设备无关性)
  2. 检索数据结构

    操作系统根据逻辑设备名/物理设备名找到SDT,再根据SDT找到DCT,若设备忙则将PCB挂到设备等待队列中,不忙则将设备分配给进程。

    然后根据DCT找到COCT,若控制器忙则将PCB挂到控制器等待队列中,不忙则将控制器分配给进程。

    然后根据COCT找到CHCT,若通道忙则将PCB挂到通道等待对流中,不忙则将通道分配给进程。

只有设备,控制器,通道 三个都分配成功时,这次设备分配才算成功,之后才能对I/O设备进行操作。

缓冲区管理

为什么需要缓冲区?

  1. 主要是为了缓和CPU与I/O设备之间速度不匹配的矛盾

    CPU 处理速度远快于磁盘 I/O,缓冲区暂存数据可减少 CPU 等待外设的时间
  2. 减少中断次数

    批量数据传输,将多个数据块积攒起来,一次性写入到磁盘,降低CPU处理中断的频率。

    如果是字符型设备,每输出一个字符就要向CPU发送一次中断信号
  3. 解决数据颗粒度不匹配的问题

    外设以块为单位传输,CPU 以字节为单位处理,缓冲区作为数据转换的中间层

缓冲区类型

  1. 单缓冲

    原理:仅在内存中开辟一个缓冲区,CPU与I/O共享此缓冲区。

    缺点:因为共享的缘故,CPU与I/O设备需串行工作,效率比较低

  2. 双缓冲

    原理:两个缓冲区(缓冲区 A 和 B)。CPU与I/O各自独占。

    优点:实现 CPU 与外设的双向并行,提升效率。

    缺点:仅适用于双向数据传输且数据量均衡的场景,否则就会出现一方等待另一方的现象。

  3. 循环缓冲区

    原理:多个固定大小的缓冲区连城环形队列,通过in/out指针管理,写指针指向可用缓冲区,读指针指向待处理缓冲区

本质上就是环形数组

  1. 缓冲池

    原理:多个共享缓冲区组成的池,按用途分为不同队列(如空缓冲队列、装满输入数据的缓冲队列、装满输出数据的缓冲队列)。

重生之我是操作系统(十)----I/O管理的更多相关文章

  1. 轻量级操作系统FreeRTOS的内存管理机制(一)

    本文由嵌入式企鹅圈原创团队成员朱衡德(Hunter_Zhu)供稿. 近几年来,FreeRTOS在嵌入式操作系统排行榜中一直位居前列,作为开源的嵌入式操作系统之一,它支持许多不同架构的处理器以及多种编译 ...

  2. 2023 年十大 API 管理趋势

    本文探讨了 API 管理在数字化转型中的重要性,以及 API 管理面临的挑战和发展机遇.文章重点介绍了十大 API 管理发展趋势,包括 API 安全性.API 标准化.云端 API 管理解决方案.低代 ...

  3. 十.oc内存管理

    引用百度百科图 栈(stack)又名堆栈. 栈定义:栈是限定仅在表头进行插入和删除操作的线性表(有序).(又称:后进先出表) (动态)数据展示存储的地方.(举例:升降电梯)特点:先进后出(FILO—F ...

  4. Linux学习之CentOS(十二)----磁盘管理之 认识ext文件系统(转)

    认识ext文件系统 硬盘组成与分割 文件系统特性 Linux 的 EXT2 文件系统(inode) 与目录树的关系 EXT2/EXT3 文件的存取与日志式文件系统的功能 Linux 文件系统的运行 挂 ...

  5. 操作系统(2)_进程管理_李善平ppt

    所有程序都有CPU和io这两部分,即使没有用户输入也有输出. CPU最好特别忙,io空闲无所谓. 程序/数据/状态 三个维度来看进程. 等待的资源可能是io资源或者通信资源(别的进程的答复). 一个进 ...

  6. 操作系统——输入输出(I/O)管理

    目录 一.I/O 管理概述 1.1 I/O 控制方式 1.2 I/O 软件层次结构 二.I/O 核心子系统 2.1 I/O 调度概念 2.2高速缓存与缓冲区 2.3设备分配与回收 2.4假脱机技术(S ...

  7. MySQL学习笔记十:日志管理

    1.错误日志文件 MySQL的错误日志文件记录错误信息,还会记录mysqld进程的关闭和启动的信息,但也不是什么错误信息都会记录,只记录mysqld进程运行过程中发生的关键性错误. 错误日志的启动,可 ...

  8. 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存

    一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存.一.缓存的基本原理: 1.持久化层的缓存 ...

  9. 《objective-c基础教程》学习笔记(十)—— 内存管理

    本篇博文,将给大家介绍下再Objective-C中如何使用内存管理.一个程序运行的时候,如果不及时的释放没有用的空间内存.那么,程序会越来越臃肿,内存占用量会不断升高.我们在使用的时候,就会感觉很卡, ...

  10. Oracle学习(十四):管理用户安全性

    --用户(user) SQL> --创建一个名为 grace password是password 的用户,新用户没有不论什么权限 SQL> create user grace identi ...

随机推荐

  1. Kotlin:【初始化】主构造函数、在主构造函数里定义属性、次构造函数、默认参数、初始化块、初始化顺序

  2. java集合中的迭代器Iterator和数组内置方法以及常见的报错

    删除Map的中某一项报错 package part; import java.util.HashMap; import java.util.Set; public class Java01 { pub ...

  3. VScode导入Vue项目

    VScode导入Vue项目 1.使用VScode打开文件夹 2.找到运行按钮 3.判断有没有默认的配置文件存在 4.若文件夹存在就检查配置文件是否存在 (1)打开launch.json,把如下代码粘贴 ...

  4. Nim 从入门到实战

    Nim Nim 是一个与其 1.0 版本相似的新颖且令人兴奋的命令式编程语言.我使用 Nim 是为了它的性能与优雅,这无疑让我感到了莫大的乐趣.在这篇文章中我将向您展示一个我写的 Nim 项目的全部流 ...

  5. P4774 [NOI2018] 屠龙勇士 题解

    传送门 题解 思路 由题目可知,一条龙被攻击 \(x\) 次并回复若干次后生命值恰好为 \(0\) 则死亡,可以得出如下式子: \[\large ATK_i \cdot x \equiv a_i(\m ...

  6. 深入浅出 Vue3:组件与模板基础全解析

    一.Vue3 组件结构详解 1.1 单文件组件(SFC)架构 Vue3采用.vue单文件组件模式,一个典型组件包含三个区块: <template> <!-- 组件的HTML模板 -- ...

  7. YASKAWA安川机器人DX100轴控制基板维修解析知识

    ASKAWA安川机器人DX100轴控制基板的维修是一项复杂而精细的工作,要求具备丰富的知识和实践经验.通过与子锐机器人维修联系,希望能企业提供一些有益的参考和帮助,在面对轴板故障时能够迅速准确地找到问 ...

  8. Deepseek学习随笔(2)--- 快速上手DeepSeek

    注册与登录 要开始使用 DeepSeek,你需要先注册一个账号.以下是具体步骤: 访问 DeepSeek 官网. 使用邮箱或手机号注册账号. 登录后进入控制台,开始使用. 控制台功能介绍 DeepSe ...

  9. Typecho 引入 DPlayer

    想在文章中插入视频,尝试 iframe 和 video 标签后发现 m3u8 流会触发下载无法播放,用 hls 该问题后,碰到了 403 forbbiden.联想到前些天新浪图床加 referrer ...

  10. QQ/微信域名防红方法,打开网站跳转浏览器打开

    简单通用QQ/微信跳转浏览器打开代码 使用方法: 将代码全部复制 粘贴到 网站根目录下index.php文件的顶端 注意:不要覆盖了 index.php里面的原代码,原代码保留(请尽快把样式以及图片本 ...