简单的线程 vs 进程
概念 【来自维基百科】
进程
进程(英文:process),是指计算机中已运行的程序。进程曾经是分时系统的基本运行单位。在面向进程设计的系统(如早期的 UNIX,Linux 2.4 及更早的版本)中,进程是程序的基本执行实体;在面向线程设计的系统(如多数当代操作系统、Linux 2.6 及更新的版本)中,进程本身不是基本运行单位,而是线程的容器。
程序本身只是指令、数据及其组织形式的描述,相当于一个名词,进程才是程序(那些指令和数据)的真正运行实例。
线程
线程(英文:thread)是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程里,是进程的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每个线程并行执行不同的任务。
线程是独立调度和分派的基本单位。
摘自《Linux/Unix 系统编程手册》⬇️
多线程的优点
- 线程间的数据共享很简单。相比之下,进程间的数据共享需要更多的投入。(例如,创建共享内存段或者使用管道 pipe)。
- 创建线程要快于创建进程。线程间的上下文切换(context-switch),其消耗时间一般比进程短。
多线程的缺点
-
多线程编程时,需要确保调用线程安全(thread-safe)的函数,或者以线程安全的方式调用函数。多进程应用则无需关注这些。
-
某个线程的 bug(例如,通过一个错误的指针来修改内存)可能会危及该进程的所有线程,因为它们共享着相同的地址空间和其他属性。相比之下,进程间的隔离更彻底。
-
每个线程都在争用宿主进程(host process)中有限的虚拟地址空间。特别是,一旦每个线程栈以及线程特有的数据(或线程本地存储)消耗掉进程虚拟地址空间的一部分,则后续线程将无缘使用这些区域。虽然有效地址空间很大(例如,在 x86-32 平台上通常只有 3 GB),但当进程分配大量线程,亦或线程使用大量内存时,这一因素的限制作用也就凸显出来。与之相反,每个进程都可以使用全部的有效虚拟内存,仅受制于实际内存和交换(swap)空间。
影响选择的还有如下几点
-
在多线程应用中处理信号,需要小心设计。(作为通则,一般建议在多线程程序中避免使用信号)
-
在多线程应用中,所有线程必须运行同一个程序(尽管可能是位于不同函数中)。对于多进程应用,不同的进程可以运行不同的程序。
-
除了数据,线程还可以共享某些其他信息(例如,文件描述符、信号处置、当前工作目录,以及用户 ID 和组 ID)
-
某些特定平台(如 iOS)只能创建线程。