在计算机发展初期,CPU的计算能力非常有限。计算资源稀缺而王贵。
最早的时候一个CPU只能同时运行一个任务,这简直让人无法忍受。
什么叫只能运行一个程序呢?
这就像大学上自习占座一样,一旦一本书、一张纸、一个包或一个活人
占有了那个桌子,其他人就再也没法用了,无论是在这个人出去上厕所,
踢球,你都不能去用那个桌子。如果胆大包天去偷着坐,这时候
就会有个神秘人突然拍拍你的肩膀告诉你“同学,这里有人”,这就是传说
中的“见鬼的故事”。故事里的作为就是CPU,无论当前任务在使用CPU进行计算,
还是在读写磁盘IO或者进行网络交互,Y都得占用CPU,黑客极客和各种无证
程序员都觉得,这不科学!
于是大家试图通过各种方式来改变这一现象。
首先出现的是多通道程序,程序员们很快写了一个监控程序,发现当前任务不用
CPU计算时,就唤醒其他等待CPU资源的程序,让CPU资源能够得到充分利用。但多通道
的问题是调度乏力,不分青红皂白和轻重缓急,不管是急诊还是普通门诊,该等还是得等。
第二个出场的是分时系统,分时系统是一种协作模式,每个程序运行一小段都得主动把CPU
让出来给其他程序,这样每个程序都有机会得到CPU的一小段时间。这是操作系统的监控
程序也完善了一些,能够处理相对复杂的请求。早期的Window和Mac
OS都是采用这种方式来调用程序的。但是分时系统的问题是,一旦某个程序死循环,系统就
没招了,只能干等着,就像死机一摸一样,程序员说这是不可能接受的。
第三个是多任务系统,程序员们让操作系统接管了所有的硬件资源,变得更加高级智能,
系统进程开始分级,有的是特权级别,有的是平民级别(你就知道,在计算机世界都TM是这个样子),
所有的应用程序以进程和线程方式运行,CPU的分配方式采用了抢占式,就是说操作系统可以强制把CPU
的资源分配给目前最需要的程序。程序员们成功了,几乎完美的控制了一切,并造成了很多任务都是
同时运行的假象,如果用两个字来形容的话,那就是“和谐”,目前OS
X,Unix,Linux,Windows都是采用这种方式进行任务管理的。
抢占式。现行进程在运行过程中,如果有重要或者紧迫的进程到达(其状态必须为就绪),则现运行
进程将被迫放弃处理机,系统将处理机立刻分配给新的到达的进程。
以上都是单核单CPU的情况,但无论线程间的切换多么快,这些都是并发,而不是并行。
-
并发
Concurrency如果一个系统支持两个或多个动作(Action)同时存在,那就是一个并发的系统。
-
并行
Parallelism如果一个系统支持两个或多个动作同时执行,那就是一个并行系统。
单个CPU永远无法同时执行两个或以上的任务,但是允许任务同时存在。
所以,只有多核或多个CPU才可能发生并行,如果单核单CPU只能发生并发行为。
参考
MacTalk-人生元编程