linux的多任务

晨曦之光 发布于 2012/04/10 15:00
阅读 1K+
收藏 0

写过一篇关于linux多用户的文章,在提到多用户的时候,多任务的概念也是有必要提出的,实际上,多用户必然意味着多任务,每个用户起码一个任务。这么看来。多任务是比多用户更加基本的一个概念和特性了。

在计算机的远古时代,人们用作业来表示需要计算机代劳的任务,随之有了批处理系统,在批处理系统中,用户和机器无法很好的进行交互,进一步分时系统就出来 了。这个时期为了不浪费计算机资源,人们想到一台机器连接多个终端,其实也就是在这个时候,用户的概念才被单列出来,此时产生了终端,每个终端如果有任务 的话起码一个任务,那么如何将整台机器资源合理的分配给这么多个终端就成了一个问题,分时就是这个问题的解决方案。按照将整块时间分成一个个时间片,然后 将这些时间片分配给多个任务,那么如何分配时间片也相应的成了一个问题。如何分配时间片的解决方案就是一个调度策略。我们来看一下这里的层次问题:计算机 作为资源可以被共享是机制,多用户多任务是实现之的策略;更高的层次上多任务是机制,分时是实现多任务的一个策略;再往上,分时是机制,任务的时间片调度 是实现分时的策略。多用户在一个意义上可以理解为多任务的细化,该细化方案也是一个策略,只是说明任务可以按照用户(终端)来分配,这个意义上可以理解为 多任务是机制,而多用户是策略。

上面的是多任务的理论,那么unix是如何实现多任务的呢?我们知道,unix天生就具有多任务多用户的血统,那么继承unix基因的linux也具有这 样的性质。说到unix多任务的实现,当然就没有其多用户的实现那么复杂了,毕竟我们是在“多用户是多任务的一个策略”这个意义上来讨论的。机制说起来总 是要比策略更简单。说到底,unix的fork实现了多任务,既然linux带有unix的基因,那么就以linux来说吧。linux并没有把任务和可 执行文件必然联系,它仅仅把任务作为一个执行绪来看待,以下就把任务说成进程,至于任务,作业,程序,进程的区别以及称呼演变就不谈了,用中文谈这些没有 意义的,在原汁原味的英文中可能可以看出个一二三来。linux没有把进程和可执行文件联系,试想在没有磁盘只有磁带的年代,可执行文件怎么定义?磁带的 速度...所谓进程就是一个跑在计算机上的执行绪,这是一个很纯朴的概念。虽然真正可执行的用户任务仍然要从磁带或者磁盘获取,但是那已经不是进程本身的 问题了,这正是接下来要说的,这也是一个机制和策略的问题。linux的进程架构为fork/exec,这里fork仅仅是进程的机制,而策略由exec 提供,fork使一件事成了进程,exec则定义了具体的事,fork产生一个一模一样的进程,然后exec可以运行不同的策略。为何unix开始的时候 采用这种方式呢?进程也要机制和策略分离?这样非常有用,其很重要的优点就是创建进程十分快速,fork就是克隆一个进程,也就是原本复制,现在又有了写 时复制,速度就更快了。还有一个fork/exec机制策略分离的好处就是操作系统本身不用介入用户进程,操作系统的功能之一就是进程管理,它管理的就是 进程本身,而不管是哪个用户的哪个进程,这样很有必要抽象出一个单独的进程机制让操作系统便于管理,仅此就够了。比如linux中的进程 task_struct就是这个东西,fork出来的就是这个东西,调度的也是这个东西,至于用户进程到底是什么,就不是task_struct了,而是 其类行为mm_struct的字段。fork用最快的速度产生一个进程,舞台就有了,至于想演什么戏,那就看exec的策略了,快速产生的进程马上进入操 作系统的管理队列被管理,这样整个多任务机制就形成了,fork出新的进程以后新进程和老进程共享地址空间直到新进程写地址空间(今天我忽略了进程的树形 关系,这也是unix/linux进程架构的一大块内容)。这样linux操作系统多任务机制的核心进程管理器就根本不用接触到任何用户的策略,也可以丝 毫不用管别的管理模块,比如内存管理,它只负责管理好进程就可以了,进程的具体策略由exec加载的地址空间来描述。因此可以说fork提供了进程机 制,exec提供了进程策略。

unix/linux被如此设计出来的原因就是用户将计算机作为一个资源而操作系统负责在多个用户和多个进程之间合理分配资源,它们被设计出来的意义就是 用户和进程真的可以很好的共享资源。unix/linux的用户和进程将计算机看作可以被共享的资源,而Dos个人操作系统的用户则仅仅把计算机作为一台 机器,相应的dos操作系统不必采用分时机制,因而它只需要将设备进行抽象就可以了,dos无非就是改变了一下用户使用机器的方式,原来用户只是用插, 拔,拧的方式使用机器,现在只用输入命令就可以了,提供了设备抽象的dos做的事情就是这些。个人计算机顾名思义就是为个人代工小任务的计算机,它的设计 意义就没有必要有多用户支持。个人操作系统的意义就在于为用户提供一个使用机器的尽可能友好的接口而不是在多个用户或者进程之间仲裁如何使用机器,故而个 人操作系统离用户更近一些,有时用户界面会超过unix的X window就不足为奇了。如果你真的理解了unix和dos它们历史的不同,那么你就理解了为何windows下CreateProcess有一个可执 行文件的路径参数而unix/linux的fork参数为空,你也会理解exec在windows和unix/linux下的实现为何有如此的差异(参见 《鸠占鹊巢还是功成身退》)。在《UNIX编程艺术》一本书中在比较众多操作系统时说windows是逐步堆积而成的,当你理解了windows的多任务 历程你就会明白这一点了,最起码在多任务的实现这一个方面理解了windows的方式。作为个人操作系统的佼佼者,在用户接口方面真的是无人匹敌的,但是 多任务和多用户可能天生就是属于大型机/工作站/服务器的,windows 3.x引入了多任务,在dos的基础上只是简单实现了协作式多任务,协作式的多任务意味着进程之间必须通过协作来实现多任务,这样就把任务调度策略留给了 用户或者进程,这在运行大型服务的非个人机上是行不通的,windows NT真正实现了多任务管理,可是仍然比较复杂,它根本做不到unix的fork机制那样简洁,要想简洁,必然要使机制和策略分离,操作系统必需在用户或者 进程不知情的情况下进行进程的多任务管理,比如时间片的分配策略不要让进程和用户参与,这样的话必然不能使用协作多任务,机制和策略杂糅在一起总不是什么 好事。

fork机制实现了unix/linux的多任务,fork/exec+uid实现了多任务中的多用户,如此简洁,让人惊叹!这一切怎么做到的,还用说 吗?看看它们的出身就知道了,一切仅仅是一个必然结果而已。于是如果你想评价两款操作系统,一味从性能和安全性这些单独的点上去评价很容易使人迷失,应该 看它们最开始的样子,最开始的需求往往决定了以后的设计,虽然自古英雄不问出处,但是问一下出处有时也是必要的,子不教父之过嘛!袁老头(袁萌)天天 (everyday)拿着个ubuntu和vista比来比去的真没劲!


原文链接:http://blog.csdn.net/dog250/article/details/5303661
加载中
返回顶部
顶部