基础|进程和线程模型
Posted Python与算法社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础|进程和线程模型相关的知识,希望对你有一定的参考价值。
计算机中最重要的模型之一,莫过于进程模型和线程模型了,对于它们的深刻理解,直接关系到软件开发,算法设计等计算机细分方向。
01
—
进程模型
02
—
进程组成
简单来说,进程包括了正在运行的一个程序的所有状态的信息,包括:
代码
数据
状态寄存器,CPU状态CR0,指令指针IP
通用寄存器,AX,BX,CX
进程占用系统资源,比如打开文件,已分配内存等。
进程具有特点:动态性,并发性,独立性,制约性。在计算机中某一时刻只有一个进程执行,轮询获得CPU的时间片,只不过这个时间片会很小,这样进程之间的切换回很快,所以在宏观上感觉是并发执行的.
具体的轮流方法就是:先加载程序programA的上下文,然后开始执行 programA,保存程序 programA 的上下文,调入下一个要执行的 programB 的程序上下文,然后开始执行 programB,保存 programB 的上下文,依次轮询。
03
—
进程控制块
提到进程,怎么能不提起进程控制块呢,Process Control Block,它是操作系统管理控制进程运行所用的信息集合。
操作系统用PCB来描述进程的基本情况以及运行变化的过程,PCB是进程存在的唯一标识,每个进程都在操作系统中有一个对应的PCB。
进程创建时,生成该进程的PCB;进程终止时,回收它的PCB。进程的组织管理都是通过对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的时间片,进程内的这些颗粒小的线程,共享进程的上下文环境。
以上是关于基础|进程和线程模型的主要内容,如果未能解决你的问题,请参考以下文章