基础|进程和线程模型

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的组织管理来实现。


组织

  1. 链表,同一状态的进程其PCB组成一链表,多个状态对应多个不同的链表。

  2. 索引表,同一状态的进程归入一个索引表,由索引指向PCB,多个状态的对应多个不同的索引表。



04

进程的状态

下面看下形成这些状态的条件

进程创建

引起进程创建的情况:系统初始化时,用户请求创建一个新进程;正在运行的进程执行了创建进程的系统调用。


进程就绪

进程创建后就排到就绪队里里头,等待CPU的调用。


进程由就绪变为运行

在就绪队列中,如果没有其他进程运行,那它直接调度当前创建的进程由就绪变为运行。如果有多个进程在就绪状态,内核如何选择一个就绪的进程呢? 这就需要调度算法,会根据进程执行的特征。


进程由运行变为等待

如果进程执行的条件不够,或者说外部资源不足够,这时候进程会进入等待状态。等待状态可能的原因: 
    1.请求并等待系统服务,无法马上完成。 
    2. 启动某种操作,无法马上完成。 
    3. 需要的数据没有到达 
注意:只有进程自身才能知道何时需要等待某种事件的发生。


进程由运行变为就绪

运行的进程被强占。发生的情况: 
1. 高优先级进程就绪 
2. 运行的进程执行当前时间用完


由等待变为就绪

唤醒进程的情况: 
1. 被阻塞的进程需要的东西可被满足 
2. 被阻塞的进程等待的事件到达。 
注意:进程只能被别的进程或者操作系统唤醒。等待的进程不会因自身被唤醒。


进程由运行变为退出

进程结束的情况: 
1. 正常退出(自愿的) 
2. 错误退出(自愿的) 
3. 致命错误(强制性的) 
4. 被其他进程所杀(强制性的)



05

进程下的线程

上面说到,启动programA时,先加载程序programA的上下文,然后开始执行 programA,保存程序 programA 的上下文,这种粒度还有没有可能缩小呢?比如,我只想加载一次程序programA的上下文,然后里头有一些更小的模型并行执行任务。


有的,这个更小的共享programA的上下文环境的模型就是线程模型。


与进程相比,它是颗粒度更为细小的CPU时间段。


总结,进程和线程都是CPU的时间片,进程内的这些颗粒小的线程,共享进程的上下文环境。

以上是关于基础|进程和线程模型的主要内容,如果未能解决你的问题,请参考以下文章

http服务 基础知识

OS之进程管理---多线程模型和线程库(POSIX PTread)

多线程基础

多线程基础

Java多线程基础

python---基础知识回顾进程和线程