Jack:hi,淫龙,有空吗?我们来讨论一下Linux的进程吧。
我:没空。不要烦我,最近正在郁闷。
Jack:郁闷啥呀?
我:最近大学城通了轻轨,房价涨得厉害,骂了隔壁。
Jack:不要郁闷了,来研究Linux内核吧。
我:你想知道什么呢?
Jack:我想知道在Linux里,进程到底是什么。
我:简单的说,进程是程序员意淫出来的bitch。
Jack:不是太明白是什么意思。在大学的操作系统课程里,进程的解释是“计算机中正在运行的程序实例”。
我:这种解释既肤浅又了然无趣。我也可以给进程下定义——Unix里的进程是可调度的任务的单位之一。你能明白这是什么意思吗?
Jack:所有的文字我都认识。不过,我仍然不是太明白进程是什么东西。
我:第一台计算机是没有操作系统的,直到上世纪60年代中期,IBM搞出了OS/360这样的操作系统。然后才有了进程的概念。
Jack:说重点吧。
我:恩。很多人都说之所以会有进程是计算机设计人员觉得计算机资源(CPU)利用率不高,不过,我觉得应该是“投资方”为了节约成本才搞出来的。
Jack:草,你说重点。
我:重点就是,有了进程之后,所有的“任务”(Task),可以一股脑丢进去,然后CPU根据某种策略执行他们。
Jack:我问的是进程,你讲任务(Task)搞JJ啊。
我:Jack不要急嘛。这里有一个误解,任务(Task)与进程(Process)的关系。对于CPU而言,进程是不存在。CPU只关心当前的CS、DS、IP等寄存器指向哪里。如果你感兴趣,可以参考下《Intel Architecture Software Developer’s Manual》。重复一下,进程是程序猿意淫出来的产物。
Jack:那你接下来是要口述程序猿如何意淫进程了?
我:理解进程必须分为两个部分。一部分是关于CPU的,另外一部分是C代码实现。Jack,如果你是一个操作系统设计工程师,在CPU层面你会考虑些什么东西呢?
Jack:操作系统首先要有进程,所以在CPU上要有“任务”(Task)的概念。任务是进程的原始雏形,如果没有任务,进程就无从谈起了。
我:大概是这个意思。不过,进程并不是操作系统的必要成分。想想早期的DOS系统吧。在386CPU里,有TR这个寄存器,这个寄存器描述了当前正在执行的任务的各种属性。最重要的是当前任务(Task)的代码的segment描述符(代码段、数据段、堆栈段)。当A任务(Task)执行JMP指令跳转到B任务的时候,B任务就running了。
Jack:明白了。在没有操作系统的时候,CPU可以采用这种方式实现多任务(而不是一个巨大无比的单任务)。
我:是的。这是最简单的多任务,但是还不能进行复杂的调度、抢占、让出等智能性操作。这个时候的系统还是一个小孩子,还不具备高度的“智力”。
Jack:那怎么样才能具备“高度的智力”呢?
我:午饭时间到了,我先去吃地沟油。咱回头再聊。