热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

[2.1.2]进程管理——进程的状态与转换、进程的组织

文章目录

文章目录

  • 第二章 进程管理
    • 进程的状态与转换、进程的组织
      • (一)创建态、就绪态
      • (二)运行态
      • (三)阻塞态
      • (四)终止态
      • (五)进程状态的转换
      • (六)进程的状态
      • (七)进程的组织
        • 1)链接方式
        • 2)索引方式
    • 小结


第二章 进程管理

进程的状态与转换、进程的组织


  • 状态

    • 运行状态

    • 就绪状态

    • 阻塞状态

      运行、就绪、阻塞,是三种基本状态

    • 创建状态

    • 终止状态

  • 状态间的转换

    • 就绪态 → 运行态
    • 运行态 → 就绪态
    • 运行态 → 阻塞态
    • 阻塞态 → 就绪态
  • 进程的组织方式(各个进程PCB的组织方式)



(一)创建态、就绪态

  之前我们提到过,我们的程序(即可执行文件*.exe),平时是存放在硬盘里的,而当它想要执行的时候,需要把它调入内存,同时操作系统会为它建立相应的PCB,也就是建立一个相应的进程。那当一个进程正在被创建的期间,这个进程的状态就是处于“创建态”。在这个阶段,操作系统会给这个进程分配相应的系统资源(比如给它分配一些内存空间)、初始化PCB。

  而当一个进程创建完成之后,它就会进入一个新的状态,叫作“就绪态”。处于就绪态的进程,其实是已经具备了运行的条件,只不过此时CPU比较忙、还没有空闲,所以CPU暂时还不能为这个进程服务。

image-20230306170900195

(二)运行态

  一个系统当中可能有很多个处于就绪态的进程。当CPU空闲的时候,操作系统就会从这些处于就绪态的进程当中选择其中的一个,然后让它上CPU运行。而如果一个进程此时正在CPU上运行的话,那么这个进程就处于“运行态”。

image-20230306171338768

(三)阻塞态

  同时,我们知道,一个进程,它正在运行,意味着此时CPU正在处理这个进程背后的那个程序,也就是执行这个进程相应的指令序列。

  比如说,CPU执行了进程2,它的指令序列包含:指令1、指令2、指令3、指令4。我们假设此处的指令3,是发出了一个系统调用,而这个系统调用是请求操作系统给它分配打印机资源。

  而此时,打印机设备很忙,它正在为别的进程服务,所以这个打印机资源暂时不能分配给进程2,所以接下来的指令4,即往打印机输出数据的指令,就没办法得到执行。那既然这个进程接下来的指令,暂时不能往下执行的话,那么显然,我们就不应该让这个进程一直占用着CPU资源。

image-20230306173638187

  所以,类似于上述这种情况:很多时候,进程在运行的过程中,有可能会请求等待某个事件的发生(比如等待系统给它分配某一种资源,或者等待其他进程的响应,等等)。而在这个事件发生之前,这个进程是没有办法继续往下执行的,所以在这个时候,操作系统就会剥夺这个进程对CPU的使用权。让这个进程2下CPU,并使它进入一个新的状态,叫“阻塞态”。

  在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应)。

  在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下CPU,并让它进入“阻塞态”。

在这里插入图片描述

  进程2由于需要等待打印机设备而暂时无法继续执行,因此下CPU,并变为阻塞态。但不要混淆,此时,是打印机没有空闲,CPU是处于空闲状态的。

  所以,此时CPU是再次处于空闲状态的,操作系统便又会选择一个处于就绪态的进程,让它上CPU运行。

  当CPU空闲时,又会选择另一个“就绪态”进程上CPU运行。

image-20230306173430504

  接下来的故事是这样的:

  这个打印机设备,之前是在为别的进程服务,那如果说这个打印机的服务结束,这个打印机空闲了下来。它空闲下来的时候,它就可以分配给刚才请求打印机的那个进程,也就是进程2。所以,当操作系统把这个打印机资源分配给进程2的时候,这个进程2等待的事件其实就已经发生了。此时,操作系统会让这个进程2从阻塞态,再次回到就绪态。

image-20230306174043813

image-20230306174258416

  也就是,当进程等待的事件发生后,那么这个进程就再次拥有了上处理机运行的条件。

(四)终止态

  接着刚才的例子:

  此时在CPU上运行的进程1,它已经运行结束了。那么,在它运行结束的时候,它会发出一个叫exit的系统调用,这个系统调用就是要请求操作系统终止这个进程,此时这个进程的状态就会变成“终止态”。然后,操作系统会让这个进程下CPU,并且做一系列善后的工作,会回收这个进程所占有的各种资源,包括内存空间、打印机设备等等,总之所有的资源都要回收。并且最后还会回收这个进程的PCB。

image-20230306174639647

  而当终止进程的工作完成后,这个进程就从系统当中彻底消失了。

image-20230306174800327

(五)进程状态的转换

  再把刚才进程的各个状态,以及之间的转换,再串一下。

  ①一个进程在运行之前,需要被创建。在创建的过程当中,系统需要完成一系列创建相关的工作,包括新建PCB,还有给这个进程分配一系列的资源等等。如果一个进程正在处于被创建的过程中,那么这个进程就是处于“创建态”的。

  当一个进程被创建完毕之后,它就拥有了可以上CPU运行的条件。那么,此时进程就进入了“就绪态”。也就是说,处于就绪态的进程,它其实只差处理机这种资源了,其他所有需要的资源、条件它都已经具备了。

  ②如果处于就绪态的一个进程,被操作系统调度,那这个进程就可以上处理机运行。当它在处理机上运行的时候,它就处于“运行态”。也就是说,正在处理机上运行的进程,其实是既拥有了它所需要的其他所有的那些资源、条件,同时它也拥有了处理机这种资源。

  ③而有的时候,正在运行的进程,可能会请求等待某个事件的发生,在这个事件发生之前,这个进程是没有办法往下继续运行的。所以在这种情况下,进程不应该一直占用处理机资源,所以此时这个进程应该被剥夺处理机资源。同时,除了被剥夺处理机资源之外,它还在等待其他的某种资源,或者说等待某一种事件的发生。此时该进程处于“阻塞态”。

  ④如果说,处于阻塞态的进程等待的事件发生了,或者申请的资源被分配了,这个进程就可以从阻塞态,又回到就绪态。那么,当它处于就绪态,就又说明,这个进程已经拥有了除了处理机以外的所有需要的资源、条件。

  ⑤处于运行态的进程,它可以主动地请求运行结束;或者说它在运行的过程中遇到了一些不可修复的错误(比如除以0),那么这种情况下这个进程也应该被终止。操作系统在对这个进程做相应的终止工作的时候,这个进程就处于“终止态”,此时操作系统会回收这个进程拥有的各种资源,并且最后会撤销该进程PCB。

image-20230306180957175

  从上述过程当中可以知道,运行态到阻塞态的这个转换,其实是进程主动的一种选择,是一种主动行为。一般来说都是进程通过主动发出系统调用的方式来申请某一资源或者请求某个事件的发生。所以这个转换的过程,是进程主动选择的。

  ③ 运行态 → 阻塞态 是一种进程自身做出的主动行为

  而阻塞态到就绪态的转变,它并不是由进程自身控制的。比如说一个进程正在等待打印机资源,那么这个打印机资源什么时候能分配给它,并不是这个进程说了算的。所以,从阻塞态到就绪态的转换,是一种被动的行为,并不是进程自己可以控制的。

  ④ 阻塞态 → 就绪态 不是进程自身能控制的,是一种被动行为

  需要注意的是,一个进程不可能由阻塞态直接转换为运行态,也不可能由就绪态直接转换为阻塞态。

  因为进程要转变为阻塞态,肯定是进程在CPU上运行的过程中发出了主动请求,就必然是处于运行态的。所以,只可能从运行态→阻塞态,而不可能从就绪态→阻塞态。


  再补充一些刚才没有提到的状态转换。

image-20230306181538283

  ⑥进程可以直接从运行态→就绪态。比如说,操作系统给进程分配的时间片用完了的时候(时钟中断),进程就会从运行态转换为就绪态。这种情况下,其实进程并不缺乏任何使得其继续往下运行的条件,它只是被剥夺了处理机而已。它并不需要等待除了处理机之外的其他某个事件的发生。因此,进程是从运行态,回到了就绪态。

  以上就是完整的进程五状态模型,以及之间的相互转化过程。

(六)进程的状态

image-20230306181927683

  在这五种状态当中,运行态、就绪态、阻塞态的基本状态。因为在进程的整个生命周期当中,大部分的时间都是处于这三种状态的,所以它们是基本状态。

  另外,需要强调一点,在单CPU的情况下,处于运行态的进程,同一时刻最多只会有一个;而如果说的是多核CPU的话,就意味着多个进程可以并行的运行,那在这种情况下,就会有多个进程都处于运行态。

  另外需要强调的是,阻塞态又可以称为等待态;创建态又可以称为新建态;终止态又可以称为结束态。这些别名也稍微注意一下。


  操作系统是怎么记录这些进程的状态的呢?

  在之前我们提到过的进程PCB当中,会有一个成员变量state来表示进程的当前状态。比如1表示创建态、2表示就绪态、3表示……。

  另外,操作系统会把处于同一个状态的进程,把它们的PCB组织起来,这样可以方便统一的管理。

  所以,怎么把这些进程PCB组织起来,这个就是进程的组织要探讨的问题。

(七)进程的组织


  进程的组织有两种方式:链接方式、索引方式。


1)链接方式

image-20230306182647497

  链接方式,就是操作系统会管理一系列的队列,每个队列都会指向相应状态的PCB。

  比如“执行指针”,它会指向正处于“运行态”的PCB。而“就绪队列指针”它所指向的这个队列,就是此时系统中正处于就绪态的这些进程PCB。

  那么,为了方便对这些进程的调度,操作系统经常会把优先级更高的那些进程PCB放在这个队列的队头。

  “阻塞队列指针”也一样,它会指向当前处于阻塞态的进程PCB。


  而在很多操作系统中,还会根据阻塞原因的不同,再把阻塞队列分成多个,如下图。

image-20230306183000638

2)索引方式

  操作系统会给各个状态的进程,建立索引表,每个索引表中的每个表项,又会相应的指向PCB,如图所示。

image-20230306183216665

(大多数的操作系统使用的都是链式方式)

进程的组织方式

  • 链接方式
    • 按照进程状态将PCB分为多个队列
    • 操作系统持有指向各个队列的指针
  • 索引方式
    • 根据进程状态的不同,建立几张索引表
    • 操作系统持有指向各个索引表的指针

  总之,它回答的就是,操作系统该怎么把各个进程的PCB给组织起来,这样的一个问题。总之了解即可。

小结

image-20230306183428267

  这个小节中,更值得注意的还是进程的状态、进程状态之间的转换问题。上图被框起来的部分,是考研当中最高频考察的部分。


推荐阅读
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • top 命令是一个强大的工具,可以实时动态地监控系统的整体运行状况。它整合了多种信息,提供了一个全面的系统性能和运行信息视图。通过 top 命令的交互界面,用户可以使用热键进行各种管理操作。 ... [详细]
  • 关于进程的复习:#管道#数据的共享Managerdictlist#进程池#cpu个数1#retmap(func,iterable)#异步自带close和join#所有 ... [详细]
  • 大华股份2013届校园招聘软件算法类试题D卷
    一、填空题(共17题,每题3分,总共51分)1.设有inta5,*b,**c,执行语句c&b,b&a后,**c的值为________答:5 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 本文详细介绍了Sleep函数的基本概念、使用方法及其背后的实现原理。适合对Sleep函数的使用和实现感兴趣的开发者阅读。通过本文,您将了解如何在不同操作系统中使用Sleep函数,以及其在多线程编程中的重要性。 ... [详细]
  • PCIe中的弹性缓冲原理解析
    PCIe是一种高速串行总线,其传输信号为差分信号,并采用同步传输方式。然而,PCIe并没有专用的同步时钟。本文将详细介绍PCIe中的弹性缓冲(Elastic Buffer)原理,探讨其如何处理时钟差异,确保数据传输的稳定性和可靠性。 ... [详细]
  • 本文提供了初级计算机考试的第二部分题目及其详细解析,涵盖了单项选择题,涉及计算机存储、硬件、软件等多个方面的基础知识。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
  • 本文介绍了如何使用开源工具ChkBugReport来解析和分析Android设备的Bugreport。ChkBugReport能够将复杂的Bugreport转换为易于阅读的HTML报告,并提供详细的图表和分析结论。 ... [详细]
  • 我自己做了一个网站图片的抓取,感觉速度有点慢抓取4000张图片可能得用15分钟左右的时间,我百度看用线程可以加快抓取,然后创建了5个线程抓取,但是5个线程是同步执行同样的操作一个图片就 ... [详细]
  • 在iOS开发中,多线程技术的应用非常广泛,能够高效地执行多个调度任务。本文将重点介绍GCD(Grand Central Dispatch)在多线程开发中的应用,包括其函数和队列的实现细节。 ... [详细]
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 阿里云服务器搭建详解——Ubuntu
    由于自己电脑配置跟不上,双系统一开,整个电脑就会变得非常卡顿,所以决定在阿里云买一个云服务器。听朋友说,学生买的话是非常便宜 ... [详细]
  • 本文详细介绍了 Oracle 数据库的自动备份机制及其安装步骤。通过具体示例,解释了系统变更号(SCN)和块结构在备份过程中的作用,以及热备份恢复的具体步骤。 ... [详细]
author-avatar
坑爹的马_782
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有