本文是《操作系统:以程序员的角度》第三章,本章的主题是从程序员的角度来理解操作系统到底是如何工作的。本篇承接上文《操作系统是如何获取键盘按键的》以下为本篇目录:
-
急性子领导(CPU)与慢性子员工(外设)
-
中断一定比轮询高效吗
-
什么是中断
-
中断机制的实现
-
浏览器是如何加载网页的
-
总结
在这一节中我们聊一聊,操作系统管理外设的中断机制。
为什么要在这一节聊一聊操作系统如何管理外设呢,外设管理是操作系统的核心任务之一,理解操作系统的外设管理机制对于我们理解操作系统工作原理至关重要。通过第二章的讲解,我们已经知道了,利用系统调用这种机制,我们可以向操作系统发起请求来创建进程、读写文件等等,虽然我们还没有讲解操作系统如何进行进程管理文件管理等,至少操作系统的这一部分工作机制,也就是系统调用,对于我们来说已经不再神秘了,但是我们依然不清楚操作系统是如何管理外部设备(鼠标、键盘、USB设备、打印机、磁盘等等,以下简称外设)的,因此在这里我们有必要讲解一下操作系统管理外设的机制是什么。
急性子领导(CPU)与慢性子员工(外设)
作为程序员我们需要知道CPU同样是通过机器指令来管理外设的,至于通过哪些机器指令来控制外设目前还不是我们的关注重点,目前为止我们只需要知道,本质上,CPU是通过机器指令来控制外部设备就可以了。
CPU和外设是两种速度相差很大的硬件。相对于CPU的运行速度来说,各种外设简直不是一般的慢,这就好比一个波音747的速度一个是自行车的速度。两种运算速度相差如此迥异的设备之间该如何进行交流呢?如此高速的CPU该如何管理如此慢吞吞的外部设备呢?
注意,这里所说的管理,本质上就是:
-
CPU通过机器指令交给外设一项任务。
-
外设完成这项任务。
-
CPU需要知道这些任务是否完成。
所以你会看到其实CPU是管理者,外设是真正的执行者。管理者下达命令,执行者完成任务,同时管理者需要知道任务是否完成。我们面对的问题是这样的,CPU是个急性子(运算速度快),而外设恰恰相反是个慢性子,总是慢吞吞的(运算速度慢),如果是你要来设计这样一个管理方案的话,你该如何解决这个问题呢?在继续阅读下面的内容之前,希望读者能够先自己想想该如何解决。
如果你已经想得差不多了,那么接下来看看答案是否和你想的一样。
方案一:不断查询状态
我们能想到的最简单的方法就是CPU下达任务后不断的去问外设:“Hey,外设老兄,这个请求你处理完了吗?”,如果外设回答“还没有”那么CPU就一直不断的问下去直到外设回答“执行完毕”,如图所示:
这种方案非常简单,但是有一个缺点,那就是CPU要想知道外设是否完成任务,就只能不断的去查询外设的工作状态,这种不断查看设备状态的方法被称之为轮询,即Polling。在后面的课程中我们还会见到轮询在其它场景中的应用。我们需要意识到采用这种方案的话,CPU需要不断的去查看外设执行状态,在这期间CPU不能执行其它有用任务,不断轮询的这段时间CPU做的当然是无用功,因此这种方法有性能损耗,还有没有其它更好的方法吗?
本文剩余部分请参见这里《深入理解操作系统》。