当前课程知识点:操作系统 > 第二十三讲 I/O子系统 > 23.1 I/O特点 > 视频
今天我们来介绍I/O子系统
I/O子系统是我们计算机操作系统当中
负责与外设打交道的部分
那么在这里呢
我们首先会来介绍
I/O子系统里头它的I/O特征
这里主要是说我们在系统里头
可以连接的设备是有很多种的
速度有很大的差异
那么这些各种设备的访问特征
直接影响到我们
用什么样的方式来跟设备进行交互
在了解它的特征之后
我们会来介绍
I/O的结构和它的数据传输
最后两个部分是
我们在这里举了一个实际的例子 磁盘
对于磁盘的I/O来说
我们会又涉及到两个问题
一个是磁盘的调度
这里指的是说我们在磁盘访问的时候
由于磁头有机械的移动
所以这个时间是会很长
所以在这里头呢我们需要
有相应的一些算法来提高它的性能
这就是我们这里的磁盘调度
另外一个呢是磁盘缓存
也就是说我们把磁盘上的数据
读到内存当中来使用
写回去的数据还需要写回到磁盘里头
这读和写呢
我们可以在内存里头加缓存
从而提高它的访问效率
如何来控制这个磁盘缓存
也是我们这里要讨论的问题
首先我们对I/O设备的接口
进行一个分类
在这里头我们大致的分类有这样三类
字符设备 块设备和网络设备
这三类设备呢
各有一些各自的特点
字符设备通常情况下它的速度很慢
比如说在这里举的例子是
串口 键盘和鼠标
而块设备呢通常是我们的存储设备
比如说磁盘 磁带和光驱
而网络设备呢
是计算机系统与外界打交道的
最重要的手段
你比如说在这里头
我们的以太网 802.11无线网 蓝牙等等
这些都算是网络设备
那么这三种不同的设备呢
它的访问是具有不同的特征的
首先第一个字符设备
所谓字符设备呢
它的访问是以字节为基本的访问单位
然后是顺序访问的
比如说像我们的键盘你敲一个键之后
每次你只能敲一个
如果两个在一块的话它是组合的
对于计算机系统来说它也是一个
那这个输入是
一个字节一个字节来进行输出的
像串口它也是两个方向
每个方向也是
一个字节一个字节为单位往外输出的
这时候呢
它的访问通常由get put
这样两个I/O的命令
在这里我们通常把它封装成一个文件
用文件访问的接口和语义
来对这些字符设备进行访问
这是第一类
第二类呢是块设备
块设备它最主要的特征是
底下的访问是以基本的数据块
为最小访问单位的
也就是说读写是以一个数据块为单位
这种访问呢是比较均匀的
它的数据量也是比较大的
那我们在访问的时候呢
通常情况下可以使用文件的接口
我们实际上在前面的文件系统里
就是这样在讨论的
为了提高性能也可以使用原始的I/O接口
也就是说我直接对磁盘上的扇区
进行读写控制
我们也说到第三种方式
我可以把磁盘映射到内存当中
用内存映射文件
来对磁盘上的数据进行访问
第三种呢是网络设备
网络设备它的最主要特征呢
是它的交互是比较复杂的
我们有一门专门的网络原理课程
来讨论这一协议
这个地方就是以格式化的报文交换
是它最主要的特征
为了应对这种特征呢
它的I/O命令是专门的网络报文收发接口
send/receive
然后我们多种不同的网络协议呢
是封装在这个网络接口下面的
以使用不同的协议
跟不同的对象进行交互
这是我们在这儿呢
对设备访问的特征有一个大致的描述
有了这些描述之后
我们更主要的问题是会来讨论
CPU与设备之间的交互
那这种交互关系呢
也就是我们这里说的同步和异步I/O
这张图给出了我们用户的进程
与设备进行I/O操作的时候
它的一个大致的结构
用户发出I/O请求
然后这个请求会送到
操作系统内核当中的设备驱动
设备驱动呢会把它转换成硬件的控制
控制你的硬件进行相应的操作
硬件操作完成之后呢
它会产生中断
由内核当中的中断处理例程进行响应
最后送到设备驱动 然后回到用户态
这是进行I/O的一个过程
这个过程实际上
我们说到的第一种方式是阻塞I/O
也就是说我发出请求到数据回来
中间我进程是要处于等待状态的
一直到有数据回来
这种特征对应过来的
收和发分别是这样的
你在读数据的时候
我把命令发出去之后
进程进入等待状态
一直到完成数据的读出
而如果说是写数据
那么是我发出写请求之后
进程进入等待状态
一直到设备完成数据的写入处理
也就是说如果是磁盘的话
它真实写到磁盘扇区了
那这时候我才结束
这个过程到我们这张图里
就变成是用户的请求
首先通过系统调用到设备驱动
设备驱动会把用户请求转换成
实际的硬件控制命令
下来的时候是绕过中间的中断处理的
中断只是在返回的时候有处理
直接控制硬件进行相应的操作
操作结束之后呢
它会产生中断请求
然后转到设备驱动
最后通过系统调用的返回 到用户态
用户得到相应的结果
这是第一种方式
在这种方式里头呢
进程是需要等待的
等待一定会读到数据
或者一定会把数据完成写
第二种方式是非阻塞I/O
也就是说进程在执行的过程当中
我把命令发出去之后我就不等待
这种不等待呢
转换过来是对于读写操作
把系统调用发出命令之后立即返回
返回的值是你进行成功传送的字节数
读或者写的字节数
这时候你在读写的过程当中呢
有可能什么也没读到 什么也没写进去
返回的值是零 这种情况呢
我们还是在这张图里表示出来
那就是写
然后它就直接返回了
这是第二种方式
第二种方式 它可能读写不成功
或者说读写的数据量
跟我想写出去的数据量不一致
于是我们就有了第三种方式
异步I/O
异步I/O是把同步和异步两者结合起来
它在读数据的时候是
我把我要做的事情标记好
把缓冲区设好
那这样的话告诉内核然后它就返回了
操作系统内核在完成相应的数据处理
并且把读到的数据放到缓存区之后
它会通知用户
而写呢是反过来
我标记好我的数据在什么地方
操作系统完成写到实际的设备上之后
它会通知用户
这个过程在这张图里表现出来是这样的
我先通过系统调用
把我要写的数据告诉设备驱动
然后设备驱动控制硬件设备进行操作
控制完成之后
我不会去等它结果我直接就返回了
而设备操作完成之后它会通过中断
这时候返回出相应的结果
在这个阶段
驱动里头是会需要等待的
而我的应用程序这一段
是可以干别的事情的
这是我们说到的三种I/O操作的方式
-0.1 Piazza讨论区
--html
-0.2 在线实验平台
--实验平台使用帮助
--平台使用帮助
-0.2在线实验平台
--Raw HTML
-1.1 课程概述
--视频
-第一讲 操作系统概述--练习
-1.2 教学安排
--视频
-1.3 什么是操作系统
--Video
-1.4 为什么学习操作系统,如何学习操作系统
--Video
-1.5 操作系统实例
--视频
-1.6 操作系统的演变
--视频
-1.7 操作系统结构
--视频
-2.1 前言和国内外现状
-2.2 OS实验目标
-2.3 8个OS实验概述
-2.4 实验环境搭建
-2.5 x86-32硬件介绍
-2.6 ucore部分编程技巧
-2.7 演示实验操作过程
--Q6
--Q7
--Q10
-3.1 BIOS
--3.1 BIOS
-3.2 系统启动流程
-3.3 中断、异常和系统调用比较
-第三讲 启动、中断、异常和系统调用--3.3 中断、异常和系统调用比较
-3.4 系统调用
--3.4 系统调用
-第三讲 启动、中断、异常和系统调用--3.4 系统调用
-3.5 系统调用示例
-3.6 ucore+系统调用代码
-4.1 启动顺序
--4.1 启动顺序
-4.2 C函数调用的实现
-4.3 GCC内联汇编
-4.4 x86中断处理过程
-4.5 练习一
--4.5 练习一
-4.6 练习二
--4.6 练习二
-4.7 练习三
--4.7 练习三
-4.8 练习四 练习五
-4.9 练习六
--4.9 练习六
-5.1 计算机体系结构和内存层次
-5.2 地址空间和地址生成
-5.3 连续内存分配
-5.4 碎片整理
--5.4 碎片整理
-5.5 伙伴系统
--5.5 伙伴系统
-第五讲 物理内存管理: 连续内存分配--5.6 练习
-6.1 非连续内存分配的需求背景
-6.2 段式存储管理
-- 6.2 段式存储管理
-6.3 页式存储管理
-6.4 页表概述
--6.4 页表概述
-6.5 快表和多级页表
-6.6 反置页表
--6.6 反置页表
-6.7 段页式存储管理
-第六讲 物理内存管理: 非连续内存分配--6.8 练习
-7.1 了解x86保护模式中的特权级
-第七讲 实验二 物理内存管理--7.1 了解x86保护模式中的特权级
-7.2 了解特权级切换过程
-第七讲 实验二 物理内存管理--7.2 了解特权级切换过程
-7.3 了解段/页表
-第七讲 实验二 物理内存管理--7.3 了解段/页表
-7.4 了解UCORE建立段/页表
-第七讲 实验二 物理内存管理--7.4 了解UCORE建立段/页表
-7.5 演示lab2实验环节
-8.1 虚拟存储的需求背景
-8.2 覆盖和交换
-8.3 局部性原理
-8.4 虚拟存储概念
-8.5 虚拟页式存储
-8.6 缺页异常
--8.6 缺页异常
-9.1 页面置换算法的概念
-9.2 最优算法、先进先出算法和最近最久未使用算法
-第九讲 页面置换算法--9.2 最优算法、先进先出算法和最近最久未使用算法
-9.3 时钟置换算法和最不常用算法
-第九讲 页面置换算法--9.3 时钟置换算法和最不常用算法
-9.4 Belady现象和局部置换算法比较
-第九讲 页面置换算法--9.4 Belady现象和局部置换算法比较
-9.5 工作集置换算法
-第九讲 页面置换算法--9.5 工作集置换算法
-9.6 缺页率置换算法
-第九讲 页面置换算法--9.6 缺页率置换算法
-9.7 抖动和负载控制
-10.1 实验目标:虚存管理
-第十讲 实验三 虚拟内存管理--10.1 实验目标:虚存管理
-10.2 回顾历史和了解当下
-第十讲 实验三 虚拟内存管理--10.2 回顾历史和了解当下
-10.3 处理流程、关键数据结构和功能
-第十讲 实验三 虚拟内存管理--10.3 处理流程、关键数据结构和功能
-10.4 页访问异常
-第十讲 实验三 虚拟内存管理--10.4 页访问异常
-10.5 页换入换出机制
-第十讲 实验三 虚拟内存管理--10.5 页换入换出机制
-11.1 进程的概念
-第十一讲 进程和线程--11.1 进程的概念
-11.2 进程控制块
-第十一讲 进程和线程--11.2 进程控制块
-11.3 进程状态
-第十一讲 进程和线程--11.3 进程状态
-11.4 三状态进程模型
-11.5 挂起进程模型
-第十一讲 进程和线程--11.5 挂起进程模型
-11.6 线程的概念
-第十一讲 进程和线程--11.6 线程的概念
-11.7 用户线程
-第十一讲 进程和线程--11.7 用户线程
-11.8 内核线程
-第十一讲 进程和线程--11.8 内核线程
-12.1 进程切换
-第十二讲 进程控制--12.1 进程切换
-12.2 进程创建
-第十二讲 进程控制--12.2 进程创建
-12.3 进程加载
-第十二讲 进程控制--12.3 进程加载
-12.4 进程等待与退出
-第十二讲 进程控制--12.4 进程等待与退出
-13.1 总体介绍
-13.2 关键数据结构
-13.3 执行流程
-13.4 实际操作
-14.1 总体介绍
-14.2 进程的内存布局
-14.3 执行ELF格式的二进制代码-do_execve的实现
--14.3 执行ELF格式的二进制代码-do_execve的实现
-14.4 执行ELF格式的二进制代码-load_icode的实现
--14.4 执行ELF格式的二进制代码-load_icode的实现
-14.5 进程复制
-14.6 内存管理的copy-on-write机制
-15.1 处理机调度概念
-第十五讲 处理机调度--15.1 处理机调度概念
-15.2 调度准则
-15.3 先来先服务、短进程优先和最高响应比优先调度算法
--15.3 先来先服务、短进程优先和最高响应比优先调度算法
-第十五讲 处理机调度--15.3 先来先服务、短进程优先和最高响应比优先调度算法
-15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
--15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
-第十五讲 处理机调度--15.4 时间片轮转、多级反馈队列、公平共享调度算法和uc
-15.5 实时调度和多处理器调度
-第十五讲 处理机调度--15.5 实时调度和多处理器调度
-15.6 优先级反置
-第十五讲 处理机调度--15.6 优先级反置
-16.1 总体介绍和调度过程
-16.2 调度算法支撑框架
-16.3 时间片轮转调度算法
-16.4 Stride调度算法
-17.1 背景
--17.1 背景
-17.2 现实生活中的同步问题
-第十七讲 同步互斥--17.2 现实生活中的同步问题
-17.3 临界区和禁用硬件中断同步方法
-第十七讲 同步互斥--17.3 临界区和禁用硬件中断同步方法
-17.4 基于软件的同步方法
-第十七讲 同步互斥--17.4 基于软件的同步方法
-17.5 高级抽象的同步方法
-第十七讲 同步互斥--17.5 高级抽象的同步方法
-18.1 信号量
--18.1 信号量
-第十八讲 信号量与管程--18.1 信号量
-18.2 信号量使用
-第十八讲 信号量与管程--18.2 信号量使用
-18.3 管程
--18.3 管程
-第十八讲 信号量与管程--18.3 管程
-18.4 哲学家就餐问题
-18.5 读者-写者问题
-19.1 总体介绍
-19.2 底层支撑
-第十九讲 实验七 同步互斥--19.2 底层支撑
-19.3 信号量设计实现
-第十九讲 实验七 同步互斥--19.3 信号量设计实现
-19.4 管程和条件变量设计实现
-第十九讲 实验七 同步互斥--19.4 管程和条件变量设计实现
-19.5 哲学家就餐问题
-20.1 死锁概念
-第二十讲 死锁和进程通信--20.1 死锁概念
-20.2 死锁处理方法
-第二十讲 死锁和进程通信--20.2 死锁处理方法
-20.3 银行家算法
-第二十讲 死锁和进程通信--20.3 银行家算法
-20.4 死锁检测
-第二十讲 死锁和进程通信--20.4 死锁检测
-20.5 进程通信概念
-第二十讲 死锁和进程通信--20.5 进程通信概念
-20.6 信号和管道
-第二十讲 死锁和进程通信--20.6 信号和管道
-20.7 消息队列和共享内存
-第二十讲 死锁和进程通信--20.7 消息队列和共享内存
-21.1 文件系统和文件
-第二十一讲 文件系统--21.1 文件系统和文件
-21.2 文件描述符
-第二十一讲 文件系统--21.2 文件描述符
-21.3 目录、文件别名和文件系统种类
-第二十一讲 文件系统--21.3 目录、文件别名和文件系统种类
-21.4 虚拟文件系统
-第二十一讲 文件系统--21.4 虚拟文件系统
-21.5 文件缓存和打开文件
-第二十一讲 文件系统--21.5 文件缓存和打开文件
-21.6 文件分配
-第二十一讲 文件系统--21.6 文件分配
-21.7 空闲空间管理和冗余磁盘阵列RAID
-第二十一讲 文件系统--21.7 空闲空间管理和冗余磁盘阵列RAID
-22.1 总体介绍
-第二十二讲 实验八 文件系统--22.1 总体介绍
-22.2 ucore 文件系统架构
-第二十二讲 实验八 文件系统--22.2 ucore 文件系统架构
-22.3 Simple File System分析
-第二十二讲 实验八 文件系统--22.3 Simple File System分析
-22.4 Virtual File System分析
-第二十二讲 实验八 文件系统--22.4 Virtual File System分
-22.5 I/O设备接口分析
-第二十二讲 实验八 文件系统--22.5 I/O设备接口分析
-22.6 执行流程分析
-23.1 I/O特点
--视频
-第二十三讲 I/O子系统--23.1 I/O特点
-23.2 I/O结构
--816C80A0F5E3B8809C33DC5901307461
-第二十三讲 I/O子系统--23.2 I/O结构
-23.3 I/O数据传输
--C58221E14388B9DB9C33DC5901307461
-第二十三讲 I/O子系统--23.3 I/O数据传输
-23.4 磁盘调度
--567A3F1FCBFB3F4C9C33DC5901307461
-第二十三讲 I/O子系统--23.4 磁盘调度
-23.5 磁盘缓存
--C327536B80D25CE79C33DC5901307461
-第二十三讲 I/O子系统--23.5 磁盘缓存
-html
--html