关于进程与线程的描述最经典莫过于「进程是资源分配的基本单位,线程是 CPU 调度的基本单位」。
在早期面向进程设计的计算机系统中,进程不仅拥有并管理着诸如 CPU、RAM、文件描述符与信号处理之类的计算机软硬件平台资源,同时也作为程序的基本执行实体。而在现代面向线程设计的计算机系统中,线程取代了进程作为程序的基本执行实体,进程的定位则更趋于逻辑层面,作为资源和线程的容器,一个进程可以拥有多个且至少拥有一个线程作为它的指令执行体。
基本执行单元从进程到线程的演化,是为了解决创建进程(分配资源)、销毁进程(回收资源)、进程间通信(使用外部共享资源)以及进程间切换(上下文数据内存地址空间的转移)等操作的高耗低效问题。简单来说就是进程太 “重(拥有太多资源)” 了,导致了程序的并发性能差。
线程被包含在进程内部,相对于进程的 “重”,线程则追求极致的轻量,除了一些在处理器上执行所必需的资源(e.g. 程序计数器、寄存器和栈)外,不独占任何额外资源,而是线程间共享同一进程的所有资源。所以,无论是创建线程(基本没有资源创建)、销毁线程(基本没有资源回收)、线程间的通信(使用进程内部共享内存地址空间,一个线程生成的数据可以立即用于其他所有线程,线程间的交互可以在不涉及操作系统的情况下完成)或切换(同样得益于共享内存资源)的消耗成本都得到了优化。
进程与线程的比较: