计算机中最重要的模型之一,莫过于进程模型和线程模型了,对于它们的深刻理解,直接关系到软件开发,算法设计等计算机细分方向。
01
—
进程模型
进程是指一个具有一定独立功能的程序在一个数据集合上的依次动态执行过程。 一个程序的执行,需要经历编译和链接生成可执行文件,然后经过加载到进程地址空间,如下图所示,一段运行的程序经过编译和加载后的过程如下所示:
02
—
进程组成
简单来说,进程包括了正在运行的一个程序的所有状态的信息,包括:
进程具有特点:动态性,并发性,独立性,制约性。在计算机中某一时刻只有一个进程执行,轮询获得CPU的时间片,只不过这个时间片会很小,这样进程之间的切换回很快,所以在宏观上感觉是并发执行的.
具体的轮流方法就是:先加载程序programA的上下文,然后开始执行 programA,保存程序 programA 的上下文,调入下一个要执行的 programB 的程序上下文,然后开始执行 programB,保存 programB 的上下文,依次轮询。
03
—
进程控制块
进程创建时,生成该进程的PCB;进程终止时,回收它的PCB。进程的组织管理都是通过对PCB的组织管理来实现。
04
—
进程的状态
下面看下形成这些状态的条件
引起进程创建的情况:系统初始化时,用户请求创建一个新进程;正在运行的进程执行了创建进程的系统调用。
进程创建后就排到就绪队里里头,等待CPU的调用。
在就绪队列中,如果没有其他进程运行,那它直接调度当前创建的进程由就绪变为运行。如果有多个进程在就绪状态,内核如何选择一个就绪的进程呢? 这就需要调度算法,会根据进程执行的特征。
如果进程执行的条件不够,或者说外部资源不足够,这时候进程会进入等待状态。等待状态可能的原因: 1.请求并等待系统服务,无法马上完成。 2. 启动某种操作,无法马上完成。 3. 需要的数据没有到达 注意:只有进程自身才能知道何时需要等待某种事件的发生。
运行的进程被强占。发生的情况: 1. 高优先级进程就绪 2. 运行的进程执行当前时间用完
唤醒进程的情况: 1. 被阻塞的进程需要的东西可被满足 2. 被阻塞的进程等待的事件到达。 注意:进程只能被别的进程或者操作系统唤醒。等待的进程不会因自身被唤醒。
进程结束的情况: 1. 正常退出(自愿的) 2. 错误退出(自愿的) 3. 致命错误(强制性的) 4. 被其他进程所杀(强制性的)
05
—
进程下的线程
上面说到,启动programA时,先加载程序programA的上下文,然后开始执行 programA,保存程序 programA 的上下文,这种粒度还有没有可能缩小呢?比如,我只想加载一次程序programA的上下文,然后里头有一些更小的模型并行执行任务。
有的,这个更小的共享programA的上下文环境的模型就是线程模型。
与进程相比,它是颗粒度更为细小的CPU时间段。
总结,进程和线程都是CPU的时间片,进程内的这些颗粒小的线程,共享进程的上下文环境。