进程
进程由三部分组成:
程序
数据集,程序执行时所需要的堆栈、工作区等
PCB控制块
进程在操作系统中是用PCB来表示的,PCB主要包含三类信息:
进程描述信息,进程名、标识符等
进程控制信息,进程状态、优先级等
资源管理信息,现场保留区、资源清单等
进程和程序的区别
进程是动态的,程序是静态的,进程是程序的一次执行状态,执行程序后,在内存分配一块资源和相关PCB信息后的程序成为进程。套话就是,进程是操作系统资源分配的独立单位。
进程上下文
操作系统中把进程物理实体和进程运行环境合成为进程上下文。
进程上下文由几部分组成:
用户级上下文,程序块,用户堆栈等信息
系统级上下文,进程标识信息,系统共堆栈等
上下文切换,即保存就进程的状态信息而装入被调度到的新进程的状态信息,以便新进程运行。
上下文切换步骤:
保存被中断的进程现场信息
修改进程PCB信息,如进程状态
将进程加入有关队列
选取新的获取CPU的进程
修改新进程的PCB信息
根据新进程设置系统上下文信息
根据新进程恢复处理器线程完成切换
简单来说,就是保存旧进程的现场信息并加入队列,选取新进程,设置系统上下文,恢复新进程处理。
线程
进程是20世纪60年代提出的,当时的进程包括两个属性,一是资源分配,二是CPU调度。20世纪80年代,提出了线程的概念,将进程的两个属性分开,使线程具有CPU调度的属性,而进程只作为资源分配。
现在使用套话就是:
进程是操作系统资源分配的独立单位
线程是操作系统CPU调度的独立单位
重要:一个进程可以有多个线程,但必须包含一个主线程,这个主线程用来获得CPU,成为操作系统CPU分派的最小单位,否则进程无法被调度执行。
线程粒度小,并发度高,而进程上下文切换的开销大,线程也称为轻量级进程,线程优点不言而喻。
多线程模型中,一个进程除了包含上述的PCB控制块还可以包含了多个线程PCB,而线程PCB作为操作系统CPU调度的独立单位,在调度同一个进程下的线程时,不会引起进程的上下文切换,只有当调度另一个进程中的线程时才会发生进程切换。
参考
《计算机操作系统》 陆丽娜
协程
进程和线程是由操作系统来完成资源分配和CPU调度的,而协程则是在应用层面上的,由应用级来完成调度的,例如Golang中的协程,是由Go语言运行时环境提供协程的调度,但是这些协程依然附着在某线程上,以线程的方式被CPU所调度。
因为协程是应用级别的概念,在操作系统中无法通过系统接口直接获取协程名等相关信息,因为它属于应用中的一个任务。
举个不太恰当的例子,有个线程池,每创建一个任务(把他看作协程),线程池中的有个线程就会去执行,但与此不同的是,线程池中的线程是由操作系统来调度的,而协程是通过编写特殊应用实现可以在少量线程中就完成大量协程的切换和调度工作。