进程相关介绍(二)

news2024/11/26 16:41:54

  进程状态

  当我们的进程运行的时候有很多状态,因为我们的CPU资源是有限的,我们的进程必须有选择性的放入CPU上面才可以运行。因此我们的进程就存在了很多种进程状态,比如运行态,阻塞态,挂起态等等。在本次的博客当中我们就来详细介绍一下关于进程介绍以及进程优先级的相关知识。

  

  上述图片就是我们进程当中的许多种状态,由于归类的不同所属状态也不同。我们挑选其中的比较重要的三种状态进行讲解。

  运行状态

  当我们的代码被运行的时候,进程就会处于运行状态。但是我们会有很多进程需要我们运行,那么我们究竟需要怎样进行选择呢?

  在这里我们会将我们的进程的PCB结构体通过链表的形式进行管理。在操作系统当中村咋一个进程的运行队列,其中就包含我们的PCB链表。我们通过一次遍历链表,进行依次让我们的进程运行。

  当我们的进程需要的资源都已经准备就绪的时候,我们就将会将该进程的PCB结构体插入到我们的运行队列当中,我们将处于运行队列当中的进程的状态标志位运行状态。

  当我们的进程处于运行队列当中的时候,我们可以随时调度该进程。

  时间片和进程切换

  但是当我们的进程到达CPU运行的时候会一直运行直到程序运行结束吗?并不是,因为这样的话当我们的程序是一个死循环的话。该程序就会独占一个CPU,这样大大浪费了我们系统当中的资源。

  所以为了解决这个问题我们采用了时间片的概念。时间片实质上就是一个变量,该变量保存了指定的时间,当我们的程序运行了该时间的代码之后就会强制从CPU上面拿下来,这样就可以避免CPU资源被一直占用的现象发生。

  我们将上述进程放入CPU或者从CPU上面拿下的操作叫做进程切换。

  阻塞状态

  第二个比较重要的状态就是阻塞状态。进程能够进入运行队列当中的条件就是一切资源都已经准备就绪了。而程序进入阻塞状态的条件就在于进程存在部分资源未准备就绪。

  举一个简单的例子,当我们在编写一段代码的时候,如果存在scanf函数,我们就需要手动从键盘上输入一段内容,如果我们没有进行此操作。那么我们的进程需要的资源就没有准备就绪,因此此时我们进程就会进入阻塞状态。

  当然不仅仅存在键盘资源空缺的问题。因为我们计算机当中的硬件资源都是一定的,但是我们却可以拥有很多进程需要使用该资源。(就比如QQ在视频聊天的时候需要使用摄像头,微信在视频聊天的时候同样需要使用摄像头)

  因此我们会创建一个队列,将需要该队列资源的进程的PCB结构体放到该队列的链表当中,之后我们就可以通过遍历该链表,依次分配相应的软硬件资源,是我们对应的程序进入运行状态加以运行。而我们处于等待队列当中的进程的状态就是阻塞状态。

  挂起状态

  由于我们的计算机资源是有限的,当我们的内存已经快被全部使用的时候,我们的操作系统就会进行将进程的代码放到磁盘当中的操作。因为我们的程序在运行的时候不仅仅会将我们的PCB结构体加载到我们的内存当中还会将我们代码所对应的数据也加载到内存当中。这样就会造成一定程度上的空间的浪费。

  因此假如我们的内存如果大部分使用的时候我们的操作系统就会将我们的进程所对应的数据加载到磁盘当中,等到我们想要读取对应的数据的时候再从磁盘当中读出对应的数据。这样就可以环节内存的压力,更好的为我们服务。我们将进程数据被操作系统移到磁盘当中的进程的状态称为挂起状态。

  程序运行状态标识符

  在前面我们直到了进程在运行的时候会有很多种状态。在Linux当中为了区分这些进程状态,会有一个特定的标识符来确定该程序所处的进程状态。总共一共有六种状态标识符我们依次进行了解。

  R(running)运行状态

  当我们的程序所需的所有的资源都已经准备充足的时候,我们会将进程的PCB导入运行队列当中,处于运行队列当中的进程所属的状态就是R状态。我们可以通过ps指令进行查看进程的状态。

代码内容如下:

查看得到的结果如下:

  前台进程:

  我们可以发现进程的状态为R运行状态。但是如果我们会发现状态标识符为R+。并不是我们所说的R。那么加号表示什么意思呢?

  加号表示我们当前的进程是前台进程,如果不带加号就代表我们的程序是一个后台进程。

  后台进程:

  S(sleeping)睡眠状态

  该状态可能会是一个新的名词,但是实质上就是我们之前讲到过的阻塞状态。当我们的程序属于阻塞队列,进程正在等待某种资源的时候就会将进程的状态修改为S状态。测试示例如下:

代码如下:

  进程的状态为:

  我们会发现进程的状态为S状态。我们的进程在等待用户输入一个数据,因此会处于阻塞状态,表现出来的就是进程属于S状态。

  但是我们会发现,我们的进程没有scanf之类的输入语句,但是有printf这样的输入语句,我们进程的状态也会是S状态。这是因为输出语句也需要获得输出设备。因为我们资源的有限,请求显示器设备资源的进程有很多所以会将我们编写代码的进程同样放到阻塞队列当中,所以观察出来的是S状态。

  当然也可能是R状态,因为我们代码当中并不仅仅存在输出语句,但是我们计算机的计算速度很快,相比于等待资源就绪,代码执行的时间要很小很小,因此我们查找的存在输出语句的进程状态大部分都是S状态,很少存在R运行状态。代码测试如下:

代码内容:

  进程执行后的状态:

  我们会发现我们进程的状态标识符同样是S状态。

  D(disk_sleep)深度睡眠状态

  之前我们提到过,我们的进程会向磁盘里面读取或者写入数据。再写入数据完成之后磁盘会向进程返回一个提示,提示进程数据已经书写完毕。在程序书写的时候我们的进程就会处于一种等待休眠状态。

  但是如果我们进程的状态标识为S的时候,表示我们的程序处于浅度睡眠。当我们计算机的内存不够的时候,操作系统为了防止我们电脑死机。会主动删除一些进程。如果这个时候操作系统看到进程在休眠,就会下意识的见这个进程kill掉。但是如果我们的进程被杀死之后,磁盘就无法返回相应的数据给我们的进程,就无法得知下一步的操作。因此会自动将数据删除,这样就有可能造成数据的丢失。

  因此在Linux操作系统当中,引入了一个D状态,也就是深度睡眠状态,处于深度睡眠状态的进程无法被操作系统删除,这样就避免了我们在数据写入的时候造成的数据的丢失。

  由于这个状态要求我们计算机的内存很紧缺,所以我们暂时无法模拟实现该状态,我们只需要有这个概念即可。

  t(tracing stop)暂停状态

  进程的暂停状态最常使用的方式是在我们的调试的时候。当我们在对进程使用gdb进行调试的时候有时候会需要打断点。在程序运行到断点的时候会自动暂停,这个时候我们的进程就处于t暂停状态。我们可以通过实验进行测试:

  Z(zombie)僵尸状态

  当我们的程序在运行结束的时候并不会直接将我们的PCB结构体删除,而是经过操作系统检查之后,如果进程是正常结束的再删除PCB结构体。如果不是正常结束就会进行特定的标记。作用类似于我们main函数的返回值。

  我们的进程在删除之前需要被父进程进行检查,但是如果当我们的父进程一直被占用,那么就无法将运行结束的进程PCB结构体及时删除,最终造成内存空间上的浪费。我们可以通过一段代码进行测试:

代码内容如下:

程序运行的结果:

  X(dead)死亡状态

  当一个进程已经运行结束的时候,我们的进程会进入X死亡状态。我们的进程在执行完毕之后会进入僵尸进程,当我们的僵尸进程被父进程释放的之后就会判定我们的进程死亡,进程状态修改为X状态。

  孤儿进程

  当我们创建一个新的进程之后,如果我们将父进程先退出,但是子进程继续执行。由于子进程的父进程被终止并且被他的父进程(操作系统)所释放,那么我们的子进程再想释放应该怎么办呢?我们的子进程在运行结束的时候会一直处于僵尸状态,造成内存的泄露。

  所以我们的操作系统就规定了,当我们的父进程先退出的时候。子进程会自动将父进程更改为1,也就是我们的操作系统。等到子进程释放的时候就会自动被操作系统释放。同样的我们可以通过一段代码进行测试:

  代码内容如下:

  ​​​​​​

  程序运行效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1097207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何选择功放芯片?音质好的功放芯片性能详解

数字功放也称为数字音频功放芯片,是一种利用数字信号处理技术进行音频放大的集成电路芯片;是现代音频放大技术的重要组成部分,广泛应用于音响系统、家庭影院、汽车音响、无线音箱等领域,以实现高质量的音频放大效果。 其工作原理…

优思学院:成功团队的十大秘诀,助你事业腾飞!

在竞争激烈的商业环境中,成功的团队是一个企业腾飞的关键。一个协作默契、高效运作的团队不仅可以提高生产力,还能激发创新,推动企业的可持续发展。那么,到底是什么让一支团队在竞争中脱颖而出呢?本文将为你揭示成功团…

【Linux学习笔记】git工具

1. 仓库克隆1.1. .git ignore文件 2. git的三板斧 1. 仓库克隆 首先打开gitee网站注册一个账号,使用该账号创建一个仓库,然后复制仓库的https地址,然后到xshell使用命令进行仓库克隆。 创建仓库 其中创建仓库,详细的可以去网上搜…

AD20绘制电路板的外形

今天学习了绘制电路板外形的方法,记录一下,回头忘了还能在看看,便能很快的回忆起来了,比看视频啥的要高效的多。毕竟是自己写的,印象要深刻的多。 首先新建一个PCBDoc文件,方法如下图: 在新建的…

电力配电机房监控方案

电力配电机房是电力系统的核心组成部分,对于电力运行和供电质量至关重要。为了确保电力系统的安全和稳定运行,监控机房的关键参数和状态变化变得至关重要。星创易联的4G工业路由器SR500和DTU200是一套先进的解决方案,能够实现对电力配电机房的…

Vue - 快速入门,这一套就够了!(Vue core + 案例 + 效果演示)

目录 前言 一、Vue 基础 1.1、Vue 基础示例 a)html 部分: b)script 部分: 二、本地应用 1.1、内容绑定,事件绑定 1.1.1、v-text 设置标签文本值 1.1.2、v-html 设置标签的 innerHTML 1.1.3、v-on 为元素绑定…

嵌入式平台的电源总结

本文引注: https://mp.weixin.qq.com/s/PuSxHDFbJjjHEReukLSvyg 1.AC的定义 Alternating Current(交流)的首字母缩写。AC是大小和极性(方向)随时间呈周期性变化的电流。电流极性在1秒内的变化次数被称为频率,以Hz为单位…

微服务项目打包部署

目录 1、在父项目上面打包2、部署到服务器上3、进行测试 1、在父项目上面打包 (1)点击clean,compile,最后点击package进行打包 打包成功: 在target目录下面可以看到jar包 2、部署到服务器上 将项目上传到相应文件下…

非线性负载的常见问题及解决方法有哪些?

非线性负载可能导致负载波动较大,可以使用电压稳定器或电流稳定器来提供稳定的电源供应,或者使用反馈控制技术来调节负载的工作状态。在非线性负载中,可能会出现信号失真的问题,使用线性化技术,如预失真技术&#xff0…

当GDB遇到STL

STL是标准模板库(Standard Template Library)的简称,是C的三大件之一。 ‍‍ Alex是STL的核心设计者。他于1950年出生在莫斯科,后来到美国发展,曾经在Adobe、A9.com等公司工作。在Adobe工作时,他和保罗•麦…

前端技术-并发请求

并发请求 代码解释 定义了一个函数 concurRequest,用于并发请求多个 URL 并返回它们的响应结果。 function concurRequest(urls, maxNum) {return new Promise((resolve, reject) > {if (urls.length 0) {resolve([]);return;}const results [];let index …

水果店在微信小程序中可以实现什么功能

一、开发背景 随着移动支付的普及和消费者需求的不断变化,越来越多的水果店开始关注线上销售和数字化运营。微信小程序作为一种轻量级应用,无需下载安装,即可实现与客户的无缝衔接。因此,开发一款针对水果店的微信小程序&#xff…

限制LitstBox控件显示指定行数的最新数据(1/3)

工作表Sheet1中的数据表共有3列,行数不确定,现需要将数据加载到用户窗体的ListBox控件中,设置控件的相关属性属性如下所示。 控件属性属性值ColumnCount3ColumnHeadsTrueRowSourceSheet1!A2:C15 窗体显示效果如下图所示,这里有一…

项目中 .env.development 与 .env.production 的区别

文章目录 一、项目中使用此两个文件的意义二、使用方式 一、项目中使用此两个文件的意义 我们在开发项目时,经常会有开发环境与生产环境,分别会对应不同的请求地址与各种不同的变量,这个时候我们就可以使用 process.env 去抓取这两个文件写的…

以漫画形式解说面向对象:把复杂的概念用简单有趣的画面呈现,启发你的思维

面向对象是什么 面向对象(Object Oriented,OO)的思想是软件开发中极其重要的概念和应用,它早已超越了程序设计和软件开发的范畴,延伸至数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技…

2023_Spark_实验十九:SparkStreaming入门案例

SparkStreaming入门案例 一、准备工作 二、任务分析 三、官网案例 四、开发NetWordCount 一、准备工作 实验环境:netcat 安装nc:yum install -y nc 二、任务分析 将nc作为服务器端,用户产生数据;启动sparkstreaming案例中的客户端…

BOSHIDA DC电源模块关于电容器的电解液位置

BOSHIDA DC电源模块关于电容器的电解液位置 DC电源模块中的电容器扮演着一个非常重要的角色,它们能够对电路提供稳定的电源电压,同时也可以作为电路中的滤波器,去除电路中的噪声和纹波。在DC电源模块中使用的电容器通常是电解型电容器&#…

unity(WebGL) 截图拼接并保存本地,下载PDF

截图参考:Unity3D 局部截图、全屏截图、带UI截图三种方法_unity 截图_野区捕龙为宠的博客-CSDN博客 文档下载: Unity WebGL 生成doc保存到本地电脑_unity webgl 保存文件_野区捕龙为宠的博客-CSDN博客 中文输入:Unity WebGL中文输入 支持输…

2023_Spark_实验十八:安装FinalShell

下载安装包 链接:https://pan.baidu.com/s/14cOJDcezzuwUYowPsOA-sg?pwd6htc 提取码:6htc 下载文件名称:FinalShell.zip 二、安装 三、启动FinalShell 四、连接远程 linux 服务器 先确保linux系统已经开启,不然连接不上 左边…