进程与线程

104 阅读3分钟

多任务(multiple task)

多任务是指计算机同时运行多个应用程序,每个应用程序被称为一个任务。

打个比方,你一边听着歌,一边浏览网页,一边用word,这就是多任务。其实还有很多后台任务悄悄的运行着,只是桌面没有显示而已。

多核CPU已经普及,可以轻松的完成多任务。不过,即使是过去的单核CPU,也可以执行多任务。

单核CPU通过轮流让各个任务交替执行,任务1执行0.01s(假想的),切换到任务2执行0.01s,再切换到任务3执行0.01s,一直反复执行下去。从CPU来看,任务都是交替执行的,但由于CPU速度十分快,于是用户根本感觉不到任务的切换,只觉得所有任务好像都在同时执行。

真正的并行执行多任务只能在多核CPU上实现。但是任务数量是远远多于CPU的核心数量的,因此操作系统也会自动把很多任务轮流调度到每个核心上执行。


进程与线程(process and thread)

对于操作系统来说,一个任务(task)就是一个进程(process),打开一个浏览器,就是启动一个浏览器进程,打开一个应用程序,就启动了一个进程。

一个进程可能不止干一件事,例如一个word进程,同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就要同时运行多个“子任务”,这些“子任务”称为线程(Thread)。

进程至少干一件事,即一个进程中至少有一个线程,称为主线程。像word这种复杂的进程可以有多个线程,多个线程同时执行。多线程和多进程的执行方式一样,也是由操作系统在多个线程中快速切换,让每个线程交替执行,看起来就像同时执行似的。

如果我们要同时执行多任务有几种方法:

  • 多进程模式:启动多个进程。
  • 多线程模式:启动一个进程,在一个进程内启动多个线程。
  • 多进程+多线程模式:启动多个进程,每个进程内再启动多个线程。

同时执行多个任务,这些任务之间并不是没有关联的,而是需要相互通信和协调。


进程与线程的区别

进程是操作系统进行资源分配和调度的独立单元,它有自己的地址空间。线程基本不拥有系统资源,只拥有一些运行时必需的资源(程序计数器、一组寄存器和堆栈)。因此可以理解为,进程是资源分配的最小单位,线程是CPU调度的最小单位

我们可以把进程比作一个工厂,它生成出一些产品。线程就是这个工厂的工人,是真正干活的,工人可以使用工厂里的资源干活,但工人自己不拥有这些资源,仅仅是可以使用。并且每个工人都可以共享使用工厂里的资源。每个工人还有自己的一些私密空间(例如自己的宿舍),这里面放着它们自己干活所不可或缺的东西。

抽象出几个关键点:

  1. 线程只属于某一个进程,不可能同时属于多个进程,但某个进程可以拥有多个线程。好比某个工人属于某个特定的工厂,这个工厂可以有很多工人。
  2. 资源分配给进程,同一进程内的所有线程共享该进程的所有资源,基本不拥有资源,除运行所需的资源。
  3. CPU分配给线程,即真正在CPU上运行的是线程。因为工人才是真正干活的。