基础|进程和线程模型

计算机中最重要的模型之一,莫过于进程模型和线程模型了,对于它们的深刻理解,直接关系到软件开发,算法设计等计算机细分方向。

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的时间片,进程内的这些颗粒小的线程,共享进程的上下文环境。

原文发布于微信公众号 - 算法channel(alg-channel)

原文发表时间:2018-01-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玄魂工作室

Hacker基础之Linux篇:基础Linux命令十

Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令

1354
来自专栏木头编程 - moTzxx

CentOS下(rsync+crontab)触发式实现服务器间的文件备份同步

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

2372
来自专栏奔跑的蛙牛技术博客

Java虚拟机加载类文件大全-精细版

类加载器存在父子关系 例如系统类加载器要加载java.util.ArrayList,首先要求扩展类进行加载,然后扩展类加载器要求引导类加载器进行加载。

841
来自专栏闵开慧

eclipse中执行程序显示找不到主类

eclipse中执行程序显示找不到主类 这种情况一般出现在工程中已编译有class文件的java文件,而后面新建的java则不会出现问题。这种情况说明工程bin...

3545
来自专栏jeremy的技术点滴

nginx使用备忘

30711
来自专栏叔叔的博客

使用spring cloud配置中心后的配置优先级

我实验后得到的优先级有:配置中心 > 命令行参数 > 本地application.yml > 本地bootstrap.yml

2282
来自专栏一枝花算不算浪漫

[Linux基础]Linux基础知识入门及常见命令.

4067
来自专栏开源优测

python selenium2 开发环境搭建

环境搭建 基于python和selenium2做自动化测试,你必须会搭建基本的开发环境,掌握python基本的语法和一个IDE来进行开发,这里通过详细的讲解,介...

2835
来自专栏吴伟祥

Nginx认识与实践(一) 转

笔者按照文章:《Nginx服务器开箱体验》 中的实验,给出了一份简要的清单配置举例:

1033
来自专栏用户画像

2.1进程与线程

在多道程序同时运行的背景下,进程之间需要共享系统资源,这样就会导致各程序在执行过程中出现相互制约的关系,程序的执行就会表现出间断性的特性。这些特性都是在程序的执...

632

扫码关注云+社区

领取腾讯云代金券