进程与线程
对于操作系统说,一个任务就是一个进程。比如打开浏览器就是启动了一个浏览器进程,打开记事本就是启动了记事本进程。有些进程可以同时干很多事,比如word,它可以同时进行打字、拼字检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(thread)。
每个进程至少要干一件事,所以,一个进程至少有一个线程。复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方式和多进程是一样的。
多进程执行方式:操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。
多线程也是跟这个一样每个线程之间交替短暂的运行。
线程是进程的一部分。
操作系统调度的最小任务单位其实不是进程,而是线程。
实现多任务的方法
- 多进程模式:每个进程只有一个线程
1 | ┌──────────┐ ┌──────────┐ ┌──────────┐ |
-
多线程模式:一个进程有多个线程
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系统上;
- 进程间通信比线程间通信要慢,因为线程间通信就是读写同一个变量,速度很快。
而多进程的优点在于:
多进程稳定性比多线程高,因为在多进程的情况下,一个进程崩溃不会影响其他进程,而在多线程的情况下,任何一个线程崩溃会直接导致整个进程崩溃。
Author: xun
Link: http://blog.fooo.in/2022/06/26/java/process/
License:
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。