图灵社区按: TEAP是什么?TEAP是Turingbook Early Access Program的简称,即早期试读,它公布的是图灵在途新书未经编辑的内容。一本书的翻译周期约为3到6个月,如果在翻译过程中,译者就能与读者进行沟通和交流,对整本书的翻译品质是有帮助的。通过TEAP,读者可以提前阅读将来才能出版的内容,译者也能收获宝贵的反馈意见,改进翻译,提高质量。

本书原名为「30日でできる! OS自作入門」,中文暂定名为《30天写出你的操作系统》,本篇选自第15章。本书作者川合秀实(Hidemi Kawai)生于1975年,是一位以“轻量化”编程思想见长的“非主流”开发者。他领导开发的OSASK项目是一个开源的32位微型操作系统,OSASK并非以Linux等内核为基础,而是完全从零开始开发,在一张软盘的容量下实现了GUI、多任务、多语言等高级特性,启动时间只需1秒。本书的内容可以看成是作者以自己开发的OSASK为蓝本,对从零开始开发一个操作系统所作的详尽介绍,可以让初学者在编写自己的操作系统的过程中,了解操作系统背后的更多知识。本书以课题为主导,边做边玩,抛开晦涩难懂的语言,行文风格十分随性,还充满了各种欢乐的吐槽,值得一看。

15.1 挑战多任务

“话说,多任务到底是啥呢?”我们今天的内容,就从这个问题开始吧。

多任务,在英语中叫做“multitask”,顾名思义就是“多个任务”的意思。简单地说,在Windows等操作系统中,多个应用程序同时运行的状态(也就是同时打开好几个窗口的状态),就叫做多任务。

对于生活在现代社会的各位来说,这种多任务简直是理所当然的事情。比如你会一边用音乐播放软件听音乐一边写邮件,邮件写到一半忽然有点东西要查,便打开Web浏览器上网搜索,我想对于大家来说这些都是家常便饭了吧。可如果没有多任务的话会怎么样呢?想写邮件的时候就必须关掉正在播放的音乐,要查东西的时候就必须先保存写到一半的邮件,然后才能打开Web浏览器……光想象一下就会觉得太不方便了。

然而在从前,没有多任务反倒是普遍的情形(虽然那个时候大家不用电脑听音乐,也没有互联网)。在那个年代,电脑只能同时运行1个程序,如果要同时运行多个程序的话,就得买好几台电脑才行。

就在那个时候,诞生了最初的多任务操作系统,大家都觉得太了不起了。从现在开始,我们也要准备给“纸娃娃系统”(译者注:本书中所开发的操作系统名称)添加多任务能力了。连这样一个小不点操作系统都能够实现多任务,真是让人不由得感叹它生逢其时呀。

稍稍思考一下我们就会发现,多任务这个东西还真是奇妙,它究竟是怎样做到让多个程序同时运行的呢?如果我们的电脑里面装了好多个CPU的话,同时运行多个程序也就顺理成章了,但实际上就算我们只有一个CPU,照样可以实现多任务。

真要说穿的话,其实这些程序根本没有在同时运行,不过它们看上去却好像是在同时运行一样:程序A运行一会儿,接下来程序B运行一会儿,再接下来轮到程序C,然后再回到程序A……如此反复,有点像日本忍者的“分身术”呢(笑)。

多任务的工作原理

时间轴
任务A
任务B
任务C
※1个CPU依靠反复切换来执行3个任务
※由于切换速度很快,看上去好像在同时执行3个任务一样

为了让这种分身术看上去更完美,需要让操作系统尽可能快地切换任务。如果每隔10秒才切换一次,那就连人眼都能察觉出来了,同时运行多个程序的戏码也就穿帮了。再有,如果我们给程序C发出一个按键指令,正巧这个瞬间系统切换到了程序A的话,我们就不得不等上20秒,才能重新轮到程序C对按键指令作出反应。这实在是让人抓狂啊(哭)。

在一般的操作系统中,这个切换的动作每隔0.01~0.03秒就会进行一次。当然,切换的速度越快,让人觉得程序在同时运行的效果也就越好。不过,CPU进行程序切换(我们称之为“任务切换”)这个动作,本身就需要消耗一定的时间,这个时间大约为0.0001秒左右,不同的CPU及操作系统所需的时间也有所不同。如果CPU以每隔0.0002秒的速度进行任务切换的话,该CPU处理能力的50%都要被任务切换本身所消耗掉。这意味着,如果同时运行2个程序,每个程序的速度就只有单独运行时的1/4,这样你会觉得开心吗?如果变成这种结果,那还不如干脆别搞多任务呢。

相比之下,即便是每隔0.001秒切换一次任务,单单在任务切换上面也要消耗CPU处理能力的10%。大概有人会想,10%也没什么大不了的吧?可如果你看看快10%的CPU卖多少钱,说不定你就会恍然大悟,“对啊,只要优化一下任务切换间隔,就相当于不花一分钱,换上了比现在更快的CPU嘛……”(笑),你也就明白了浪费10%也是很不值得的。正是因此,任务切换的间隔最短也就是0.01秒左右,这样一来只有1%的处理能力消耗在任务切换上,基本上就可以忽略不计了。