误区:
看到一种说法是“一个程序至少有一个进程,一个进程至少有一个线程”。
这种把程序与进程,进程与线程的关系混淆的说法是错误的。
纠正概念:
一个程序(program)就是一个正在执行的进程,而每个进程,可以是单线程的,也可以是多线程的。一个应用程序(application)通常由多个程序组成。
程序(program)和应用程序(application)的区别:
程序 ≠ 应用程序,一个程序就是一个进程,永远不要说一个程序可能有多个进程。
你打开一个应用程序(比如chrome),会有十多个进程,其实就是十多个程序,对于计算机而言,它们都是独立的,操作系统给他们分配了彼此独立的内存,相互执行不受彼此约束,分配同样时间的CPU。
好比,父亲和儿子在外人看来是一家人,但是对于法律上来说,就是独立的法人。
对用户而言:
十多个进程(程序)是一个整体,称之为应用程序,即应用程序是由一个或多个程序(进程)组成的一个整体。
对计算机而言:
一个进程就是一个程序,多个进程(比如一个浏览器的多个进程)对计算机而言就是多个不同的程序,它
不会把多个进程理解为一个完整的“程序”。
其实进程之间的关系只有父子关系,没有主从关系,他们之间是并行独立的。但是线程之间是有主从关系的,而且他们共享的是同一个内存块(包括程序、数据和堆栈)。
打个比方,进程之间是父子关系,父进程fork子进程,就好比你养了个儿子。这个子进程会拷贝一份内存块,把程序和数据都复制过去,你儿子跟你长的也很像。但是一旦出生下来了,你们就是两个独立的个体,法律上都是平等的。子进程之后就完全独立了,父进程与子进程之间的关系,与其他进程的关系都是一样的,平等的,谁也管不着谁了,他们也只能采用进程间通信才能相互了解。父亲死了,儿子还活着;父进程over了,子进程可以照样活的好好的。(除非程序员认定有一个进程over了,其他进程没有存在的意义,比如浏览器负责渲染的进程如果down掉了,其他进程自动kill掉)。
但是进程的不同线程的关系可不是这样的。进程可以由多个线程组成,这称之为多线程程序,他们之间的关系就好比你的大脑与四肢和身体其他部分的关系一样。大脑就是主线程,其他部分就是子线程。子线程由主线程派生,而依附于主线程。主线程一旦ove