【简记】Operating System—— I/O

来源:互联网 发布:开淘宝店考试答案 名字 编辑:程序博客网 时间:2024/04/30 12:53

This memo is based on the course of Dr.Li with Operating System as the reference book.

本章内容:


传统的PC机总线结构:
这里写图片描述

总线( bus ) 是一组线和一组严格定义的可以描述在线上传输信息的协议。

I/O端口通常有4 种寄存器,即状态寄存器、控制寄存器、数据输入寄存器与数据输出寄存器。
· 数据输入寄存器被主机读出以获取数据.
. 数据输出寄存器被主机写入以发送数据。
· 状态寄存器包含一些主机可读取的位( bit ) . 这些位指示各种状态, 例如,当前任务是否完成,数据输入寄存器中是否有数据可以读取,是否出现设备故障等。
· 控制寄存器可以被主机用来向设备发送命令或改变设备状态


13.2.1 轮询
主机与控制器之间交互的完成协议可能很复杂,但基本握手概念则比较简单。下面举例解释握手概念。
假定有两个位来协调控制器与主机之间的生产者与消费者的关系。控制器通过状态寄存器的忙位( busy bit ) 来显示其状态(记住置位 (set a bit ) 就是将1 写到位中,而清位(Clear a bit)就是将0写到位中)。控制器工作时就置忙位,空闲时就清忙位。主机通过命令寄存器中命令就绪位来表示其意愿。当主机有命令需要控制器执行时,就置命令就绪位。例如, 当主机需要通过端口来写输出数据时,主机与控制器之间握手协调如下:
①主机不断地读取忙位,直到该位被清除。
②主机设置命令寄存器的写位,并向输出寄存器写入一个字节。
③主机设置命令就绪位。
④当控制器注意到命令就绪位已被设置, 则设置忙位。
⑤ 控制器读取命令寄存器,并看到写命令。它从数据输出寄存器中读取一个字节,并向设备执行I/O操作。
⑥ 控制器清除命令就绪位,清除状态寄存器的故障位表示设备I/O成功,清除忙位表示完成。

输出每个字节,都要执行以上循环。


13.2.2 中断
这里写图片描述


13.2.3 直接内存访问
这里写图片描述


13.3 I/O 应用接口

13.3.4 阻塞与非阻塞I/O

阻塞I/O:

系统调用接口的另一方面与阻塞与非阻塞I/O的选择有关。当应用程序发出一个阻塞系统调用时,应用程序的执行就被挂起。应用程序将会从操作系统的运行队列移到等待队列上去。在系统调用完成后,应用程序就移回到运行队列,并在适合的时候继续执行并能收到系统调用返回的值。由I/O设备执行的物理动作常常是异步的:其执行时间可变或不可预计。然而,绝大多数操作系统为应用程序接口使用阻塞系统调用, 这是因为阻塞应用代码比非阻塞应用代码更容易理解。

应用程序重叠I/O 执行的方法之一是编写多线程应用程序。有的线程执行阻塞系统调用,而其他线程继续执行。

非阻塞I/O:

有的用户级进程需要使用非阻塞I/O 。用户接口是其中的一个例子,它用来接收键盘和鼠标输入,同时还要处理并在屏幕上显示数据。
当应用进程要调用的I/O操作会导致该进程进入阻塞状态时,该I/O调用返回一个错误,一般情况下,应用进程需要利用轮询的方式来检测某个操作是否就绪。数据就绪后,实际的I/O操作会等待数据复制到应用进程的缓冲区中以后才返回。

异步I/O:

除了非阻塞系统调用外, 还有异步系统调用。异步系统调用不必等待I/O完成就可立即返回。应用程序继续执行其代码。在将来I/O 完成时可以通知应用程序,通知方式可以是设置应用程序地址空间内的某个变量, 或通过触发信号或软件中断, 或应用程序执行流程之外的某个回调函数。

非阻塞与异步系统调用的差别是非阻塞read()调用会马上返回任何可用的数据,其所读的数据可以等于或少于所要求的,或为零。
异步read()调用所要求的传输应完整地执行,但其具体执行可以是将来某个特定时间。

这里写图片描述

从上面图中可以看出,卷1中把I/O操作分为两个阶段,第一阶段等待数据可用,第二阶段将数据从内核复制到用户空间。前三种模型的区别在于第一阶段(阻塞式I/O阻塞在I/O操作上,非阻塞是I/O轮询,I/O复用阻塞在select/poll或者epoll上),第二阶段都是一样的,即这里的阻塞不阻塞体现在第一阶段,从这方面来说I/O复用类型也可以归类到阻塞式I/O,它与阻塞式I/O的区别在于阻塞的系统调用不同。而异步I/O的两个阶段都不会阻塞进程。

我们再来看看同步I/O与异步I/O(AIO),根据卷1的说明,同步I/O与异步I/O是由POSIX定义的两个术语:
同步I/O操作:实际的I/O操作将导致请求进程阻塞,直到I/O操作完成。
异步I/O操作:实际的I/O操作不导致请求进程阻塞。

由此定义来看,前面分类中的前三种:阻塞式I/O,非阻塞式I/O,I/O复用都属于同步I/O,因为第二阶段的数据复制都是阻塞的。而只有前面定义的异步I/O模型与这里的异步I/O操作吻合。

由异步I/O的定义来看,操作系统必须提供一种方式,在应用进程发出I/O操作后,可以在后台(而不是当前应用进程)完成数据等待和数据复制的工作,并最终通知应用进程I/O操作已经完成。

阅读全文
0 0
原创粉丝点击