当前课程知识点:操作系统 >  第二十三讲 I/O子系统 >  23.1 I/O特点 >  视频

返回《操作系统》慕课在线视频课程列表

视频在线视频

视频

下一节:816C80A0F5E3B8809C33DC5901307461

返回《操作系统》慕课在线视频列表

视频课程教案、知识点、字幕

今天我们来介绍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讨论区

--piazza访问和使用

--html

-0.2 在线实验平台

--实验平台使用帮助

--平台使用帮助

--Gitlab使用帮助

--IBM内部账号初始化

-0.2在线实验平台

--Raw HTML

第一讲 操作系统概述

-1.1 课程概述

--视频

-第一讲 操作系统概述--练习

-1.2 教学安排

--视频

-1.3 什么是操作系统

--Video

-1.4 为什么学习操作系统,如何学习操作系统

--Video

-1.5 操作系统实例

--视频

-1.6 操作系统的演变

--视频

-1.7 操作系统结构

--视频

第二讲 实验零 操作系统实验环境准备

-2.1 前言和国内外现状

--2.1 前言和国内外现状

-2.2 OS实验目标

--2.2 OS实验目标

-2.3 8个OS实验概述

--2.3 8个OS实验概述

-2.4 实验环境搭建

--2.4 实验环境搭建

-2.5 x86-32硬件介绍

--2.5 x86-32硬件介绍

-2.6 ucore部分编程技巧

--2.6 ucore部分编程技巧

-2.7 演示实验操作过程

--2.7 演示实验操作过程

--Q6

--Q7

--Q10

第三讲 启动、中断、异常和系统调用

-3.1 BIOS

--3.1 BIOS

-3.2 系统启动流程

--3.2 系统启动流程

-3.3 中断、异常和系统调用比较

--3.3 中断、异常和系统调用比较

-第三讲 启动、中断、异常和系统调用--3.3 中断、异常和系统调用比较

-3.4 系统调用

--3.4 系统调用

-第三讲 启动、中断、异常和系统调用--3.4 系统调用

-3.5 系统调用示例

--3.5 系统调用示例

-3.6 ucore+系统调用代码

--3.6 ucore+系统调用代码

第四讲 实验一 bootloader启动ucore os

-4.1 启动顺序

--4.1 启动顺序

-4.2 C函数调用的实现

--4.2 C函数调用的实现

-4.3 GCC内联汇编

--4.3 GCC内联汇编

-4.4 x86中断处理过程

--4.4 x86中断处理过程

-4.5 练习一

--4.5 练习一

-4.6 练习二

--4.6 练习二

-4.7 练习三

--4.7 练习三

-4.8 练习四 练习五

--4.8 练习四练习五

-4.9 练习六

--4.9 练习六

第五讲 物理内存管理: 连续内存分配

-5.1 计算机体系结构和内存层次

--5.1 计算机体系结构和内存层次

-5.2 地址空间和地址生成

--5.2 地址空间和地址生成

-5.3 连续内存分配

--5.3 连续内存分配

-5.4 碎片整理

--5.4 碎片整理

-5.5 伙伴系统

--5.5 伙伴系统

-第五讲 物理内存管理: 连续内存分配--5.6 练习

第六讲 物理内存管理: 非连续内存分配

-6.1 非连续内存分配的需求背景

--6.1 非连续内存分配的需求背景

-6.2 段式存储管理

-- 6.2 段式存储管理

-6.3 页式存储管理

--6.3 页式存储管理

-6.4 页表概述

--6.4 页表概述

-6.5 快表和多级页表

--6.5 快表和多级页表

-6.6 反置页表

--6.6 反置页表

-6.7 段页式存储管理

--6.7 段页式存储管理

-第六讲 物理内存管理: 非连续内存分配--6.8 练习

第七讲 实验二 物理内存管理

-7.1 了解x86保护模式中的特权级

--7.1 了解x86保护模式中的特权级

-第七讲 实验二 物理内存管理--7.1 了解x86保护模式中的特权级

-7.2 了解特权级切换过程

--7.2 了解特权级切换过程

-第七讲 实验二 物理内存管理--7.2 了解特权级切换过程

-7.3 了解段/页表

--7.3 了解段/页表

-第七讲 实验二 物理内存管理--7.3 了解段/页表

-7.4 了解UCORE建立段/页表

--7.4 了解ucore建立段/页表

-第七讲 实验二 物理内存管理--7.4 了解UCORE建立段/页表

-7.5 演示lab2实验环节

--7.5 演示lab2实验环节

第八讲 虚拟存储概念

-8.1 虚拟存储的需求背景

--8.1 虚拟存储的需求背景

-8.2 覆盖和交换

--8.2 覆盖和交换

-8.3 局部性原理

--8.3 局部性原理

-8.4 虚拟存储概念

--8.4 虚拟存储概念

-8.5 虚拟页式存储

--8.5 虚拟页式存储

-8.6 缺页异常

--8.6 缺页异常

第九讲 页面置换算法

-9.1 页面置换算法的概念

--9.1 页面置换算法的概念

-9.2 最优算法、先进先出算法和最近最久未使用算法

--9.2 最优算法、先进先出算法和最近最久未使用算法

-第九讲 页面置换算法--9.2 最优算法、先进先出算法和最近最久未使用算法

-9.3 时钟置换算法和最不常用算法

--9.3 时钟置换算法和最不常用算法

-第九讲 页面置换算法--9.3 时钟置换算法和最不常用算法

-9.4 Belady现象和局部置换算法比较

--9.4 Belady现象和局部置换算法比较

-第九讲 页面置换算法--9.4 Belady现象和局部置换算法比较

-9.5 工作集置换算法

--9.5 工作集置换算法

-第九讲 页面置换算法--9.5 工作集置换算法

-9.6 缺页率置换算法

--9.6 缺页率置换算法

-第九讲 页面置换算法--9.6 缺页率置换算法

-9.7 抖动和负载控制

--9.7 抖动和负载控制

第十讲 实验三 虚拟内存管理

-10.1 实验目标:虚存管理

--10.1 实验目标:虚存管理

-第十讲 实验三 虚拟内存管理--10.1 实验目标:虚存管理

-10.2 回顾历史和了解当下

-- 10.2 回顾历史和了解当下

-第十讲 实验三 虚拟内存管理--10.2 回顾历史和了解当下

-10.3 处理流程、关键数据结构和功能

--10.3 处理流程、关键数据结构和功能

-第十讲 实验三 虚拟内存管理--10.3 处理流程、关键数据结构和功能

-10.4 页访问异常

--10.4 页访问异常

-第十讲 实验三 虚拟内存管理--10.4 页访问异常

-10.5 页换入换出机制

--10.5 页换入换出机制

-第十讲 实验三 虚拟内存管理--10.5 页换入换出机制

第十一讲 进程和线程

-11.1 进程的概念

--11.1 进程的概念

-第十一讲 进程和线程--11.1 进程的概念

-11.2 进程控制块

--11.2 进程控制块

-第十一讲 进程和线程--11.2 进程控制块

-11.3 进程状态

--11.3 进程状态

-第十一讲 进程和线程--11.3 进程状态

-11.4 三状态进程模型

--11.4 三状态进程模型

-11.5 挂起进程模型

--11.5 挂起进程模型

-第十一讲 进程和线程--11.5 挂起进程模型

-11.6 线程的概念

--11.6 线程的概念

-第十一讲 进程和线程--11.6 线程的概念

-11.7 用户线程

--11.7 用户线程

-第十一讲 进程和线程--11.7 用户线程

-11.8 内核线程

--11.8 内核线程

-第十一讲 进程和线程--11.8 内核线程

第十二讲 进程控制

-12.1 进程切换

--12.1 进程切换

-第十二讲 进程控制--12.1 进程切换

-12.2 进程创建

--12.2 进程创建

-第十二讲 进程控制--12.2 进程创建

-12.3 进程加载

--12.3 进程加载

-第十二讲 进程控制--12.3 进程加载

-12.4 进程等待与退出

--12.4 进程等待与退出

-第十二讲 进程控制--12.4 进程等待与退出

第十三讲 实验四 内核线程管理

-13.1 总体介绍

--13.1 总体介绍

-13.2 关键数据结构

--13.2 关键数据结构

-13.3 执行流程

--13.3 执行流程

-13.4 实际操作

--13.4 实际操作

第十四讲 实验五 用户进程管理

-14.1 总体介绍

--14.1 总体介绍

-14.2 进程的内存布局

--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.5 进程复制

-14.6 内存管理的copy-on-write机制

--14.6 内存管理的copy-on-write机制

第十五讲 处理机调度

-15.1 处理机调度概念

--15.1 处理机调度概念

-第十五讲 处理机调度--15.1 处理机调度概念

-15.2 调度准则

--15.2 调度准则

-15.3 先来先服务、短进程优先和最高响应比优先调度算法

--15.3 先来先服务、短进程优先和最高响应比优先调度算法

-第十五讲 处理机调度--15.3 先来先服务、短进程优先和最高响应比优先调度算法

-15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架

--15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架

-第十五讲 处理机调度--15.4 时间片轮转、多级反馈队列、公平共享调度算法和uc

-15.5 实时调度和多处理器调度

--15.5 实时调度和多处理器调度

-第十五讲 处理机调度--15.5 实时调度和多处理器调度

-15.6 优先级反置

--15.6 优先级反置

-第十五讲 处理机调度--15.6 优先级反置

第十六讲 实验六 调度器

-16.1 总体介绍和调度过程

--16.1 总体介绍和调度过程

-16.2 调度算法支撑框架

--16.2 调度算法支撑框架

-16.3 时间片轮转调度算法

--16.3 时间片轮转调度算法

-16.4 Stride调度算法

--16.4 Stride调度算法

第十七讲 同步互斥

-17.1 背景

--17.1 背景

-17.2 现实生活中的同步问题

--17.2 现实生活中的同步问题

-第十七讲 同步互斥--17.2 现实生活中的同步问题

-17.3 临界区和禁用硬件中断同步方法

--17.3 临界区和禁用硬件中断同步方法

-第十七讲 同步互斥--17.3 临界区和禁用硬件中断同步方法

-17.4 基于软件的同步方法

--17.4 基于软件的同步方法

-第十七讲 同步互斥--17.4 基于软件的同步方法

-17.5 高级抽象的同步方法

--17.5 高级抽象的同步方法

-第十七讲 同步互斥--17.5 高级抽象的同步方法

第十八讲 信号量与管程

-18.1 信号量

--18.1 信号量

-第十八讲 信号量与管程--18.1 信号量

-18.2 信号量使用

--18.2 信号量使用

-第十八讲 信号量与管程--18.2 信号量使用

-18.3 管程

--18.3 管程

-第十八讲 信号量与管程--18.3 管程

-18.4 哲学家就餐问题

--18.4 哲学家就餐问题

-18.5 读者-写者问题

--18.5 读者-写者问题

第十九讲 实验七 同步互斥

-19.1 总体介绍

--19.1 总体介绍

-19.2 底层支撑

--19.2 底层支撑

-第十九讲 实验七 同步互斥--19.2 底层支撑

-19.3 信号量设计实现

--19.3 信号量设计实现

-第十九讲 实验七 同步互斥--19.3 信号量设计实现

-19.4 管程和条件变量设计实现

--19.4 管程和条件变量设计实现

-第十九讲 实验七 同步互斥--19.4 管程和条件变量设计实现

-19.5 哲学家就餐问题

--19.5 哲学家就餐问题

第二十讲 死锁和进程通信

-20.1 死锁概念

--20.1 死锁概念

-第二十讲 死锁和进程通信--20.1 死锁概念

-20.2 死锁处理方法

--20.2 死锁处理方法

-第二十讲 死锁和进程通信--20.2 死锁处理方法

-20.3 银行家算法

--20.3 银行家算法

-第二十讲 死锁和进程通信--20.3 银行家算法

-20.4 死锁检测

--20.4 死锁检测

-第二十讲 死锁和进程通信--20.4 死锁检测

-20.5 进程通信概念

--20.5 进程通信概念

-第二十讲 死锁和进程通信--20.5 进程通信概念

-20.6 信号和管道

--20.6 信号和管道

-第二十讲 死锁和进程通信--20.6 信号和管道

-20.7 消息队列和共享内存

--20.7 消息队列和共享内存

-第二十讲 死锁和进程通信--20.7 消息队列和共享内存

第二十一讲 文件系统

-21.1 文件系统和文件

--21.1 文件系统和文件

-第二十一讲 文件系统--21.1 文件系统和文件

-21.2 文件描述符

--21.2 文件描述符

-第二十一讲 文件系统--21.2 文件描述符

-21.3 目录、文件别名和文件系统种类

--21.3 目录、文件别名和文件系统种类

-第二十一讲 文件系统--21.3 目录、文件别名和文件系统种类

-21.4 虚拟文件系统

--21.4 虚拟文件系统

-第二十一讲 文件系统--21.4 虚拟文件系统

-21.5 文件缓存和打开文件

--21.5 文件缓存和打开文件

-第二十一讲 文件系统--21.5 文件缓存和打开文件

-21.6 文件分配

--21.6 文件分配

-第二十一讲 文件系统--21.6 文件分配

-21.7 空闲空间管理和冗余磁盘阵列RAID

--21.7 空闲空间管理和冗余磁盘阵列RAID

-第二十一讲 文件系统--21.7 空闲空间管理和冗余磁盘阵列RAID

第二十二讲 实验八 文件系统

-22.1 总体介绍

--22.1 总体介绍

-第二十二讲 实验八 文件系统--22.1 总体介绍

-22.2 ucore 文件系统架构

--22.2 ucore 文件系统架构

-第二十二讲 实验八 文件系统--22.2 ucore 文件系统架构

-22.3 Simple File System分析

--22.3 Simple File System分析

-第二十二讲 实验八 文件系统--22.3 Simple File System分析

-22.4 Virtual File System分析

--22.4 Virtual File System分析

-第二十二讲 实验八 文件系统--22.4 Virtual File System分

-22.5 I/O设备接口分析

--22.5 I/O设备接口分析

-第二十二讲 实验八 文件系统--22.5 I/O设备接口分析

-22.6 执行流程分析

--22.6 执行流程分析

第二十三讲 I/O子系统

-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

--html

视频笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。