当前课程知识点:操作系统 > 第二十三讲 I/O子系统 > 23.3 I/O数据传输 > C58221E14388B9DB9C33DC5901307461
下面我们来讨论I/O数据传输
在I/O子系统当中
设备和CPU之间的数据传输性能
也是我们这里关注的一个重要的问题
CPU和设备之间的数据传输
有这样两种方式
第一种是程序控制I/O
也就是说CPU通过in/out指令
或者说load/ store指令
如果说后一种情况
你是做了内存映射的话
那它是通过load和store指令
来完成设备和CPU之间的数据交换
那这种方式由于需要CPU的参与
它的硬件实现相对简单
编程也是比较容易的
它的问题主要是在于消耗的CPU时间
和你要传输的数据量是成正比的
数据量越大
它的传输时间开销也就越大
这时候它适用于简单的小型的设备I/O
如果说你传送数据量大的话
这种方式对CPU的占用就是比较多的
第二种方式是DMA直接存储访问
它是让设备控制器
直接可以访问系统总线
然后设备控制器和内存之间
直接进行数据交换
这种方式呢 它的特点是
CPU可以在数据传输的过程当中干别的
不受影响
当然它的开始和结束也需要CPU的参与
这时候它适用于高吞吐量的设备I/O
这是我们CPU和系统之间的
两种数据传输方式
我们在这儿
再用磁盘数据读取这个过程
来细化一下
看它的交流过程是什么样子的
首先我们看到
这是我们系统里的连线图
CPU通过系统总线
连到内存和DMA控制器
然后DMA控制器
通过PCI总线连到我的磁盘设备
我们在这里
一次磁盘读取过程是什么样的
CPU在执行用户代码的过程当中
会产生磁盘读取请求
这个请求转到设备驱动
在内核里执行
设备驱动需要我把磁盘上的
什么地方的数据
读到内存的什么地方去
这个设备请求就会转换成
对磁盘控制器的操作
这个操作导致
磁盘控制器开始读取数据
读取数据之后初始化DMA传送
然后把数据通过PCI总线
传到DMA控制器
然后DMA控制器
再把数据传到内存的指定区域
也就是我们这里这个X
完成传送之后
它产生一个中断请求
CPU响应这个中断请求
来判断我最后这个操作是否结束
最后呢回到应用程序里
这是通过DMA和中断的方式
来完成磁盘数据读取的这个过程
另外还有一个方向是说
设备如何通知CPU
如何通知操作系统
在这里操作系统需要知道设备的状态
完成时间
比如说遇到的错误之类的
然后在这儿有两种方式
一种是轮询 一种是设备中断
我们在这里一个一个来讨论
轮询是指I/O设备上定义了
一组状态和控制寄存器
操作系统定期的检查这些状态寄存器
从而知道设备的状态
比如说我的数据是否发送完了
我的缓冲区是否还有空地儿
或者说我的缓冲区里是否有数据
这种做法相对来说它是简单的
但是如果你在这里操作频繁
多长时间会产生一次 不可预测的话
那么这时候开销和延时都比较大的
在这里开销大是说
我需要频繁进行操作
延时大是因为我不知道
我什么时候能知道设备状态的改变
我只能在我查的时候才能知道
如果说设备状态改变之后
很长一段时间没有去查
这个延时就大了
所以这是第一种方式
第二种方式是设备中断
在这种方式里头
CPU布置好I/O操作之后
它就可以去忙活别的了
然后这时候I/O设备
进行相应的I/O请求处理
处理完之后 产生中断
触发CPU 让CPU响应
CPU接收中断
然后执行相应的中断处理例程
这是它的一个交互过程
那么在这个交互过程当中
它是处理不可预知事件效果比较好
只要你一产生中断
CPU马上就能给出响应
原因在于CPU是在每两条指令执行期间
会去检查一次是否有中断请求
如果中断比较多
那这时候CPU被中断的频率就会比较高
这时候它的开销相对来说
和DMA方式传送数据的时候
它的开销也是大的
实际的做法是什么呢
会是在一些高速设备
会把两种办法结合起来
比如说在我们这里的高速网络设备
第一次的时候
它是采用中断方式来进行响应的
如果有数据包的接收
那这时候呢
CPU会响应中断来处理这条数据
由于输入输出数据比较多 量比较大
那这时候第一次中断处理完
相应的数据之后它会再进行轮询
如果有数据马上就要处理
这样的话后面就变成轮询方式了
一直到没有的时候 它才结束
下一次中间隔的时间比较长的时候
它再会转到中断方式
这是设备中断
下面我们具体来看一下
中断I/O的处理流程
首先是CPU在执行指令的过程当中
产生了I/O请求
这时候设备驱动会初始化这个I/O请求
当中的I/O控制器会初始化I/O操作
然后由设备进行相应的操作
操作完成或者出错
这时候它产生中断
CPU在完成I/O请求初始化之后
它就可以去干别的了
这时候它在每执行一条指令之后
它会检查中断请求
如果不做这个检查的话
那你这边有请求之后
它是不能做到及时响应的
正是由于CPU在设计上就已经做到了
用硬件来检查每一条指令执行期间
是否有中断请求 如果有
它就不去进行下一条指令的执行
而转到中断的处理
那么这时候CPU接收到中断请求之后
在当前指令结束之后
它就可以来进行这个响应
所以你这个延时通常是
最长是一条指令的执行时间
那么收到这个请求之后
它分发给相应的中断服务例程
由相应的中断服务例程进行处理
这是它的处理
处理完毕之后
CPU恢复被中断的进程的执行
在这个执行的过程当中
又可能执行到某一个地方去
再产生新的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