进程与线程

什么是进程和线程?有什么区别?

阮一峰的一篇文章,使用通俗易懂的比喻解释了进程和线程的概念。再结合维基百科里的词条定义,在这里做个知识点梳理,方便快速回顾。

进程(process)和线程(thread)是操作系统里的基本概念,

计算机的核心是CPU,它承担了所有的计算任务。

假如:
一个CPU = 一座工厂,
进程 = 工厂里的各个车间,
线程 = 车间里的工人,

一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU当前时刻只能运行一个进程。
车间里可以有多个工人,即进程可以有多个线程。
车间里的工人可以共享该车间的房间。进程里的线程可以共享进程的内存空间。
车间里的房间可以提供锁🔒,进程的某个内存区域可以提供互斥锁,防止多个线程同时读写某一块内存区域。

小结:操作系统的设计,因此可以归结为三点:
(1)以多进程形式,允许多个任务同时运行;
(2)以多线程形式,允许单个任务分成不同的部分运行;
(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

进程(process)是程序(program)在计算机中运行的实体(instance)。

程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。

但进程不是调度单位,即不能被调度器(scheduler)使用,进程是线程(thread)的容器。线程才是操作系统能够进行独立调度的基本单位,它被包含在进程之中。

一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发或并行多个线程。

每个进程都用完全一样的虚拟地址空间,然而经由操作系统和硬件MMU(负责转换虚拟地址和物理地址)协作,映射到不同的物理地址空间上。不同的进程,都有各自独立的物理内存空间。不用一些特殊手段,是无法访问别的进程的物理内存的。

同一进程中的多条线程将共享该进程中的全部系统资源,如内存地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。

所以运行一个程序,会至少开启一个进程(主进程),主进程会至少有一个主线程,主线程被调度执行。

单个CPU是循序执行一条条指令的,即同一时刻只能执行一个操作。

操作系统的调度器(scheduler),负责把单个CPU的运行时间拆分成一段一段的“执行片”,轮流分给不同的线程去使用,而在宏观上,因为分配切换的速度极快,就呈现出多线程(或多进程、多程序)并行在一个CPU上的感官。这种方式称为时分复用。

而多核CPU的出现,使用多线程技术(即每一个线程都代表一个进程内的一个独立执行上下文)的操作系统或计算机架构,多个线程分别在多个CPU上同时运行的情况下,是真正的并行。