对于操作系统说,一个任务就是一个进程。比如打开浏览器就是启动了一个浏览器进程,打开记事本就是启动了记事本进程。有些进程可以同时干很多事,比如word,它可以同时进行打字、拼字检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(thread)。

每个进程至少要干一件事,所以,一个进程至少有一个线程。复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方式和多进程是一样的。

多进程执行方式:操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。

多线程也是跟这个一样每个线程之间交替短暂的运行。

线程是进程的一部分。

操作系统调度的最小任务单位其实不是进程,而是线程。

实现多任务的方法

  • 多进程模式:每个进程只有一个线程
1
2
3
4
5
6
┌──────────┐ ┌──────────┐ ┌──────────┐
│Process │ │Process │ │Process │
│┌────────┐│ │┌────────┐│ │┌────────┐│
││ Thread ││ ││ Thread ││ ││ Thread ││
│└────────┘│ │└────────┘│ │└────────┘│
└──────────┘ └──────────┘ └──────────┘
  • 多线程模式:一个进程有多个线程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ┌────────────────────┐
    │Process │
    │┌────────┐┌────────┐│
    ││ Thread ││ Thread ││
    │└────────┘└────────┘│
    │┌────────┐┌────────┐│
    ││ Thread ││ Thread ││
    │└────────┘└────────┘│
    └────────────────────┘
  • 多进程+多线程模式:复杂度最高

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ┌──────────┐┌──────────┐┌──────────┐
    │Process ││Process ││Process │
    │┌────────┐││┌────────┐││┌────────┐│
    ││ Thread ││││ Thread ││││ Thread ││
    │└────────┘││└────────┘││└────────┘│
    │┌────────┐││┌────────┐││┌────────┐│
    ││ Thread ││││ Thread ││││ Thread ││
    │└────────┘││└────────┘││└────────┘│
    └──────────┘└──────────┘└──────────┘

进程VS线程

多任务可以有三种方法实现。具体采用哪种方法需要考虑到两个的优缺点。

和多线程相比,多进程的缺点在于:

  • 创建进程比创建线程开销大,尤其是在Windows系统上;
  • 进程间通信比线程间通信要慢,因为线程间通信就是读写同一个变量,速度很快。

而多进程的优点在于:

多进程稳定性比多线程高,因为在多进程的情况下,一个进程崩溃不会影响其他进程,而在多线程的情况下,任何一个线程崩溃会直接导致整个进程崩溃。