进程与线程
什么是进程和线程?有什么区别?
阮一峰的一篇文章,使用通俗易懂的比喻解释了进程和线程的概念。再结合维基百科里的词条定义➦,在这里做个知识点梳理,方便快速回顾。
进程(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上同时运行的情况下,是真正的并行。