# 进程与线程

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

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

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

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

线程是进程的一部分。

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

# 实现多任务的方法

  • 多进程模式:每个进程只有一个线程
┌──────────┐ ┌──────────┐ ┌──────────┐
│Process   │ │Process   │ │Process   │
│┌────────┐│ │┌────────┐│ │┌────────┐│
││ Thread ││ ││ Thread ││ ││ Thread ││
│└────────┘│ │└────────┘│ │└────────┘│
└──────────┘ └──────────┘ └──────────┘
  • 多线程模式:一个进程有多个线程

    ┌────────────────────┐
    │Process             │
    │┌────────┐┌────────┐│
    ││ Thread ││ Thread ││
    │└────────┘└────────┘│
    │┌────────┐┌────────┐│
    ││ Thread ││ Thread ││
    │└────────┘└────────┘│
    └────────────────────┘
    
  • 多进程 + 多线程模式:复杂度最高

    ┌──────────┐┌──────────┐┌──────────┐
    │Process   ││Process   ││Process   │
    │┌────────┐││┌────────┐││┌────────┐│
    ││ Thread ││││ Thread ││││ Thread ││
    │└────────┘││└────────┘││└────────┘│
    │┌────────┐││┌────────┐││┌────────┐│
    ││ Thread ││││ Thread ││││ Thread ││
    │└────────┘││└────────┘││└────────┘│
    └──────────┘└──────────┘└──────────┘
    

# 进程 VS 线程

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

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

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

而多进程的优点在于:

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

更新于 阅读次数