Processes 和 threads 是任何一个multitasking operating system(多任务操作系统, 例如UNIX, ox10, windows等等)中十分fundamental 的concept。

Process 翻译过来就是进程。 Thread翻译过来就是线程。 下面对这两个概念之间的不同之处简要分析。 

在操作系统中, 我们有很多的tools 可以去 manipulate and shut down processes to look at Threads and Thread priorities and try to see how your  system is functioning。

process 和 handle process和handle的区别_多线程




为了深入的理解进程和线程的区别, 我们首先需要了解CPU是如何工作的   的背景知识。

简单点, 我们先来说说单核CPU(single-core CPU )是如何执行命令的。

首先, 对于下面的一个程序, 单核CPU的工作过程如下。

a simple program(only 4 steps):

process 和 handle process和handle的区别_多任务_02


CPU 当然不会执行上述用高级语言编写的指令。 CPU执行的是二进制指令。 我们将上述的指令用Compiler翻译为机器语言(二进制)。 为了便于查看, 我们用16进制表示:

process 和 handle process和handle的区别_process 和 handle_03


注意, 对于不同的CPU, 上述编译得到的二进制代码指令集(instruction set) 是不同的。 例如Pentium CPU的机器指令和 ARM的CPU的机器代码指令就有很大的不同。 所以编译的时候一定选择好针对的CPU(或者操作系统), 然后将高级语言编译为对应的机器代码。


一个基本的CPU执行指令的系统如下(注意系统内存(又称RAM)。 我的只有3GB, 但是硬盘却很大达到几百G。 一定要注意RAM和Hard disc 的区别。 我们的电脑的CPU是从RAM直接取得指令去执行的,RAM是从硬盘中取得指令的。  程序却固化在硬盘中, 掉电当然不丢失。)。

注意BUS 是总线。 有三种, ABS(地址总线), DBS(数据总线), CBS(控制总线)。 CPU 与外部的所有的联系 都靠着三种总线。 包括从RAM中取指令, 读写等等。


process 和 handle process和handle的区别_多任务_04


为了执行我们的上述程序的指令(二进制形式), 我们的二进制指令需要存在RAM(又称系统内存, 或者直接简称内存)中。

如下图, 我们的program的binary code 从disk 中取出, 已经在RAM中等待CPU取出去执行, 如下:

process 和 handle process和handle的区别_多任务_05

CPU取指令的时候, 尽管总线取得我们program的binary code, 一行一行的取, 保存在CPU的类似与queue中, 这个类似与queue的东西被称为pipeline(管道)(pipeline具有很多的stages, 但是这里不考虑, 最终 我们的程序是从Queue中(即pipeline)一行行执行的):

process 和 handle process和handle的区别_优先级_06


指令从RAM中取出, 提前放在Pipeline 中。 然后CPU有很多的components 去执行pipeline中的指令。 这些component包括Math processor(加减等等科学运算), Execution EngineD等等。

另外注意, CPU是在时钟的控制下工作的。 时钟越快, 执行指令的速度越快。 上面我们假设CPU的clock 为2GHZ。


这就是single core CPU执行程序(Program)的过程。


下面我们再来看看Multi-Threaded application。

事实上, 我们可以将上述的的那个简单的program视为一个Thread。 可能这个Program(或者说Thread)组成了一个application(应用)。 例如, windows系统中, Word就是一个application(应用):

process 和 handle process和handle的区别_多任务_07


我们可以将一个Program(或者又称为application)为unit of execution(运行单元), 又被称为一个thread(线程)。

process 和 handle process和handle的区别_多线程_08


如上图。 我们说我们有一个单线程的应用(single thread application)。


上述的单线程是早期的MS-DOS操作系统的命令行时代下使用的。 

很快的, 随着Windows 的开发, MAc操作系统等等, 我们的操作系统 基本上是Multitasking operating system(多任务操作系统)。 此时我们可以同时打开多个applications, 举个例子, 我们打开了WORD应用, 又同时打开了EXCEL应用等等。 这些应用都在等待CPU 去执行。 显然, 我们只有一个CPU, 也就决定着我们在特定的时间内只能执行一个application的指令。  但是我们有两个Threads(一个是WORD , 一个是EXCEL等等)。

虽然实际上CPU不可能同时的执行这两个application(或者说Thread), 但是我们希望对于user来说, it appears to the user that they are being excuted at the same time。  我们知道CPU的晶振很大的。 所以CPU执行指令的速度很快。 基本上1ms 可以执行几百万条指令。 当然能够对于用户(人)看起来 CPU在同时为我们执行多个application。


这里涉及到了time slice(时间切片)的概念。 这是由scheduler 控制何时有那个线程的指令进入CPU的pipeline, 从而被CPU执行。 也就是多长时间切换到下一个线程。  scheduler不是硬件。 而是一个software component。 当我们将time slice 设置为1ms 的时候, 那么1ms 后, 会切换下一个thread, 依次类推下去。

这也是当前multitasking operating system的工作原理。

process 和 handle process和handle的区别_process 和 handle_09


上述的多任务操作系统的工作方式是preemptive (先发制人的, 有先买权的)的。 因为scheduler 总是首先将CPU的使用权交给一个application, 然后在拿回控制权, 交给下一个application等等。

上述多任务操作系统的好处就是当一个application crash 的时候, 并不会导致操作系统的crash。 我们的CPU仍热在运行没有crash的程序。 例如当EXCEl crash的时候, 我们只需要close Excel 即可(关闭(hit the close button)从而避免time loses。 scheduler 不再非配给这个application的时间。 否则仍然会分配给它)。 并不影响其他的应用是否工作。

process 和 handle process和handle的区别_多任务_10




除了上述的概念, Thread也有优先级。 优先级(就是一个number)越高的Thread的会首先被执行。 例如下图:

process 和 handle process和handle的区别_多线程_11


通常Scheduler具有优先级的自动boost的机制。 例如上述假如Execel 的优先级为10, 那么EXecel 先被CPU执行。 假如EXEcel 在执行的过程中突然crash了, 而且我们没有手动关闭这个application, 那么我们的scheduler会慢慢的增大Word的优先级。 直至Word的优先级等于EXCEL的了(具有同等的运行优先级了),于是Scheduler开始给WORD分配time slice, 直至运行结束。

process 和 handle process和handle的区别_process 和 handle_12




今天, 许多的程序(Program)(或者被称为应用, 或者被称为process(进程)) 都是MultiThread(多线程)的了。

举个例子,微软的windows 系统中的 WOED 程序(应用)就是一个MultiThread application(多线程应用)了。 我们称WORD 为一个process(进程)。

注意process is a name for program. 而且今天的大部分程序都是MultiThreaded(多线程)。

例如对于WORD, 具有如下的多个线程:

(1)keyboard input thread: 等待用户通过键盘输入文字

(2)print  thread: 将用户的输入内容显示在屏幕上。  当print 功能被启动的时候, 你并不希望等待print完成以后在输入, 你想要将CPU的使用权交给keyboard以等待用户输入。

(3) save file thread:

等等。


现在我们在说说CPU的一些概念。

今天的CPU已经和20年前的CPU有很大的区别了。 因为我们有了Multitasking OS(多任务的操作系统), 以及相应的MultiThreaded application(多线程的应用)。 

所以今天的CPU设计的时候需要更好的解决这些问题了。

对于single CPU 使用的技术是hyper Thread.ing。

我们已经知道CPU中有pipeline, pipeline类似与queue, 存储着被等待   CPU内部的其他components   执行     的命令。

hyper Threading 就是duplicate part of the pipeline, 然后这样就可以有多个线程的指令进入不同的pipeline 被执行了:

process 和 handle process和handle的区别_多任务_13



更好的解决Multithreading application 的办法就是使用多核CPU(注意仍然是一个CPU(single CPU))。 只不过这一个CPU具有多个duplicated pipeline

 and execution engine的CPUcomponents:

process 和 handle process和handle的区别_多任务_14


最好的, the best solution 是使用多个CPU(Multiple CPUs) 处理MultiThreaded application(多线程的应用), 当然这也是最昂贵的。

同一个board 上有多个CPU, 又称为SMP(symmetric multiple CPUs):

process 和 handle process和handle的区别_process 和 handle_15



总结上述的内容, 给出如下解答:

Thread 可以运行在一个shared memory上, 不同的process 运行在独立的内存空间中。 参见stack overfow 的解答(个人觉得有点问题, 应该是不同的Thread可以运行在不同内存空间, 也可以运行在shared memrory 上吧。 这也就有了Multithread 的概念。 一个进程(process, 亦可以称为Program)可能是有多个进程吧(可见Thread应该process的subset吧))


process 和 handle process和handle的区别_优先级_16