早期的操作系统,只有进程的概念,进程就是程序执行和系统的资源调度最小单位。每个程序启动一次,就会启动一个进程,在系统中就会占用一块内存,各个内存之间时相互隔离的,不能互相通信。这就是CATIA软件在同一个会话中,可以在不同文件之间传递数据,但是在两个会话窗口中就不能传递了的原因。网上有个段子说得好,你暴风影音是一个程序,但是打开两个窗口就是不同的进程,一个进程里装着饭岛爱,不耽误另外一个进程装上苍井空……
计算机的发展极其迅猛,程序也做得越来越复杂,CPU面临的压力越来越大,进程之间的切换的开销逐渐难以满足复杂程序的需求……
线程因此登场,通常的定义是:线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以在必要的时候被拆分为多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。
下图是从网上拷贝过来,用以说明线程与进程之间的关系。
一个标准的线程由线程ID,当前指令指针PC,寄存器和堆栈组成。
进程由内存空间(代码,数据,进程空间,打开的文件)和一个或多个线程组成。
1. 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位
2. 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
3. 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信号等),某进程内的线程在其他进程不可见
4. 调度和切换:线程上下文切换比进程上下文切换要快得多,对系统资源的冲击也比较小。而且线程彼此分享了大部分核心对象(File Handle)的拥有权,如果使用多重进程,但是不可预期,且测试困难。
总之,线程和进程都是一种抽象的概念,线程是一种比进程还小的抽象,线程和进程都可用于实现并发。
资源调度