【Linux】进程4——进程状态

1.进程状态

什么是状态?

每个人都有状态——颓废,阳光,积极向上。。。。

进程也有状态

在操作系统中,由于进程的数量是非常多的,而系统的资源又非常少,所以不可能每一个进程在每时每刻都会处于上处理机运行的状态,所以在系统中应该要为进程维护好相关的状态:运行态,终止态,阻塞态,挂起态,还有Linux中特有的其他进程状态:R(Running),S(Sleeping),D(disk sleeping),T(stopping),t(trace stopping)

 事实上进程的基本状态如下

1.1.运行态

我们先补充一点知识        

        一个进程只要把自己放到CPU上开始运行了,是不是要一直执行完毕,才把自己放下来是不是?

  • 不是,因为每个进程都有一个时间片的概念,每个进程一次性在CPU上最多执行时间片大小的时间
  • 即在某个时间段内,所有进程代码都会被执行
  • 大量的把进程从CPU上放下去,拿上来的动作——进程切换 

      说到进程的运行状态,很多同学可能第一时间想到的是此时进程应该在处理机上运行,这个时候的进程所处的状态就称为运行态

       其实并不是的,我们可以思考:在系统中一般只有一个处理机,而进程的数量又非常庞大,如果说,上处理机处理的运行的进程才称为运行态,那么进程在处理机上的运行切换又是非常快的,所以就会导致进程的状态不断发生改变,从而维护进程属性的PCB结构体中的进程相关状态信息的值会频繁发生变化,显然这是不合理的,也没有必要。

       因此,如果正确定义进程的运行态呢??

       进程在载入内存的时候,通常操作系统会为该程序创建一个PCB结构体来维护该进程中的相关信息,那么当这一切的准备工作全部准备就绪的时候,这个PCB结构体就会被放入CPU相应的运行队列中,那么此时我们就称该进程已经处于运行态

       总结来说,就是一个进程中的PCB结构体加入运行队列中随时准备上处理机运行的状态就称为运行态,此时进程在内存中。

如图是CPU中的运行队列的大致图,上述所有在运行队列中的进程都处于运行状态

1.2.就绪态

        当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。

这个状态的特点是

  • ① 一个进程已经具备运行条件,但没有分配CPU,暂时不能运行。
  • ②当调度给该进程CPU时,立即可以运行。

1.3.阻塞态

        这个可以类比进程的运行态,但是与进程的运行态不同的是,运行态等待的是CPU资源,而阻塞态是由于等待一些非CPU资源而无法运行的状态,同样也会维护相应的等待队列,这个等待队列因等待的资源不同而有所差异,比如常见等待的资源:磁盘,显卡,网卡,打印机,因此这些资源都会维护对应的等待队列,比如:磁盘等待队列,网卡等待队列,显卡等待队列等,此时进程在内存中。

这个状态的特点是:

  • ① 有时也叫作 “等待态、封锁态、睡眠态” 。
  • ② 当前进程因等待某事件的发生而暂时不能运行的状态。
  • ③ 即使这时CPU空闲,该进程也不能运行。

此过程会发生的事情:

  1.  当前进程的PCB会从runqueue中移除
  2. 当前进程的PCB会被加入到对应等待资源的等待队列中
  3. 对应进程的PCB中的进程的状态会被改变 

1.4.挂起态

        挂起态也属于一种等待状态,和阻塞态稍微有点类似,

        不过,挂起态的本质原因是操作系统中的内存资源不够,进程的数量太多,导致系统的压力非常大,因此此时操作系统为了释放压力,必须将一些暂时不需要运行的进程中的相关的代码和数据先置换到磁盘上,一般情况下,磁盘都会预先留出一部分空间:swap分区,此时进程不在内存中,而在磁盘上。

1.5.终止态

终止态是指一个进程在运行结束之后,不需要再上处理机运行的状态,对应的PCB加入到终止队列中,此时我们称这样的进程处于终止状态

        思考:为什么进程在结束运行不再需要上处理机运行时不直接被操作系统回收,而需要维护一个终止态呢?

        操作系统在回收相关进程的资源的时候不是一蹴而就的,而是需要花费一定的时间和开销,因此,在回收之前需要维护一个终止队列,对应PCB处于终止队列上的进程就是处于终止态此时进程在内存中。

2.Linux内核源代码里的运行状态

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。

一个进程可以有几个状态(在 Linux内核里,进程有时候也叫做任务)。

下面的状态在kernel源代码里定义:

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char* const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

  1. R  ——运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列 里。
  2. S  ——睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))。
  3. D  ——磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的 进程通常会等待IO的结束。
  4. T  ——停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行。
  5. X  ——死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

2.1. R(running):运行态

进程中的进程如果一直被运行,就会处于运行状态

我们来看看

我们编译运行,换另外一个账号来

我们发现不是r状态???

我们修改一下代码

我们编译运行

我们再用别的账号看看

都是R状态了

我们看到的现象是程序不断地输出,但是为啥是处于S状态呢??
        原因很简单,主要是因为我们在程序的源代码中调用printf函数,这个函数是向终端输出内容的,是一种向慢设备输出的一个过程,因此,因为我们知道处理机的速度是非常快的,慢设备的速度是非常慢的,所以,这个过程中大部分时间都是处于等待的过程,因此此时进程所属的状态是S状态

 S就对应我们的阻塞状态了

2.2. S(sleeping):睡眠状态

这种状态是一种阻塞状态,表示的是等待外设的就绪,是一种浅度睡眠状态,可以随时被中断

当然我们也可以采用kill -9 进程的pid 命令来杀掉该进程

2.3. D(disk sleeping):阻塞状态

属于一种深度睡眠的状态,这个状态一旦发生,就不容易被中断,一般情况下只能通过关机或者断电才能够中断,其发生本质原因是等待磁盘资源的分配,磁盘的资源压力过大

2. 4. Z和X状态:死亡与僵尸

  • X状态:表示进程已经死亡,处于终止态
  • Z状态:表示进程处于僵尸状态,已经不用上处理机运行的状态

        我们需要知道,在Linux中,一个进程退出时不会马上进入X态,而是会进入Z状态,那么这是为什么呢?
        一个进程被创建就是为了完成某项任务,因此,当进程结束的时候,需要将进程的结束信息(是否完成任务等)告诉给父进程或者操作系统,也就是说:操作系统在一个进程退出后,这个进程不会马上处于X态,而是会为其维护一个称为僵尸态的状态,维护的目的是:就是维护进程的退出信息,以便将这个信息告知给操作系统或者父进程

如何模拟僵尸进程?
一般情况下,我们都会创建进程,这个进程会有相应的父进程,当子进程退出而父进程没有退出的时候,此时子进程所处的状态就是僵尸状态(Z状态

此时可以看出,该进程处于僵尸状态

我们知道,一个进程处于僵尸状态的话,就说明其资源还没有被操作系统回收,那么长期如此,就会导致内存泄露,因此,当出现僵尸进程的时候,我们必须合理地解决好僵尸进程的问题

2.4.1.孤儿进程

当一个进程的父进程提前退出的时候,子进程还在运行,此时子进程会被父进程的父进程领养,即会被bash(1号进程)领养

 此时我们会发现,这个进程的状态相比于上述的进程来说是没有+的,这种进程状态没有+,是不能被Ctrl+C杀掉的,此时必须使用kill -9 进程的pid命令才能够杀掉进程

查看1号进程:使用top命令

从上图中我们可以看出,1号进程本质就是root,名为:systemd

2.5. T(Stopping):暂停状态

当进程被kill -19 pid 暂停的时候,此时进程会处于暂停状态

 想要将进程进行恢复的话可以采用kill -18 pid进行恢复

2.6. t(tracing stopping):追踪暂停状态

一般是在调试的过程中遇到断点的状态

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python语言读取图像

import cv2 import numpy as np width 640 # 图像宽度height 480 # 图像高度channels 3 # 颜色通道数imgEmpty np.empty((height, width, channels), np.uint8) # 创建空白数组imgBlack np.zeros((height, width, channels), np.uint8) # 创建黑色图像 RGB0imgWhite …

微型丝杆与滚珠丝杆性能差异与适用场景!

滚珠丝杆是工具机械和精密机械上最常使用的传动元件,其主要功能是将旋转运动转换成线性运动,或将扭矩转换成轴向反复作用力。同时兼具高精度、可逆性和高效率的特点。而微型丝杆是一种直径为0.5mm以下且线性误差在几微米以内,精度高、传动稳定…

开发uniapp 小程序时遇到的问题

1、【微信开发者工具报错】routeDone with a webviewId XXX that is not the current page 解决方案: 在app.json 中添加 “lazyCodeLoading”: “requiredComponents” uniapp的话加到manifest.json下的mp-weixin 外部链接文章:解决方案文章1 解决方案文章2 &qu…

LLM的基础模型2:Transformer的组成模块

Transformer是一种先进的语言模型,它在预测下一个单词或标记方面与传统的语言模型有所不同,但仍然遵循相同的基本原理。Transformer通过一系列复杂的步骤,将输入的标记序列转换为能够进行预测的丰富向量序列。 在Transformer中,输…

反转链表 (oj题)

一、题目链接 https://leetcode.cn/problems/reverse-linked-list/submissions/538124207 二、题目思路 1.定义三个指针,p1先指向NULL p2指向头结点 p3指向第二个结点 2.p2的next指向p1。然后移动指针,p1来到p2的位置,p2来到p3的位置&…

二开版微交易系统

下载地址:二开版微交易系统

验证码案例

目录 前言 一、Hutool工具介绍 1.1 Maven 1.2 介绍 1.3 实现类 二、验证码案例 2.1 需求 2.2 约定前后端交互接口 2.2.1 需求分析 2.2.2 接口定义 2.3 后端生成验证码 2.4 前端接收验证码图片 2.5 后端校验验证码 2.6 前端校验验证码 2.7 后端完整代码 前言…

vue项目搭建

目录 引入依赖1. elementa. notifyb. el-dropdown-item绑定点击事件点击无效c. 页面重新加载d. 路由新页面打开e.Scrollbar 滚动条 2. main.js模板3.axios post请求参数4. 数据保存在本地5. mavon-editor6. 获得路由参数7.远程搜索8.参数传入自定义参数9.固定屏幕不动10.有时事…

Elasticsearch 认证模拟题 - 14

一、题目 在集群中输入以下指令: PUT phones/_doc/1 {"brand":"Samsumg","model":"Galaxy S9","features":[{"type":"os", "value":"Android"},{"type":&q…

Edge怎么关闭快捷键

Edge怎么关闭快捷键 在Edge浏览器中,你可以通过以下步骤关闭快捷键: 打开Edge浏览器,输入:edge://flags 并按下回车键。 在Flags页面中,搜索“快捷键”(Keyboard shortcuts)选项。 将“快捷键”选项的状态设置为“…

【SpringBoot】项目搭建基本步骤(整合 Mybatis)

搭建 SpringBoot 项目有两种方式:使用 IDEA、或者在 Spring 官网下载。 1. IDEA 创建 打开 IDEA 后,英文版请点击 File -> New -> Project -> Spring Initialer。 中文版请点击 文件 -> 新建 -> 项目 -> Spring Initialer。 在打开的…

老师如何制作高考后志愿填报信息采集系统?

高考结束后,志愿填报成为学生们的头等大事。面对众多选择,如何高效、准确地填报志愿,是每个学生和家长都关心的问题。作为老师,能否利用现有的技术工具,帮助学生更好地完成志愿填报呢? 老师们需要一个能够…

机器学习作业6——svm支持向量机

目录 一、理论 概念: 线性可分: 支持向量: 间隔: 目标: 软间隔: 梯度下降法: 别的方法: 拉格朗日函数: SMO算法: 核函数: 二、代码 …

Zemax中FFT PSF和惠更斯PSF的区别?

在Zemax“分析”选项卡中,有PSF(“点扩散函数”)图,主要包括如下两种计算方式: 1. FFT PSF,快速傅里叶变换(fast fourier transform,FFT) 该方法可以看做是以下点扩散函…

【录制,纯正人声】OBS录制软件,音频电流音,杂音解决办法,录制有噪声的解决办法

速度解决的方法 (1)用RNNoise去除噪声。RNNoise是一个开源的,效果不好的噪声去除器。使用方法就是点击滤镜,然后加噪声抑制RNNoise。【这方法不好用】 (2)用Krisp(https://krisp.ai/) 去除噪声。这个Kris…

华为云服务器-云容器引擎 CCE环境构建及项目部署

1、切换地区 2、搜索云容器引擎 CCE 3、购买集群 4、创建容器节点 通过漫长的等待(五分钟左右),由创建中变为运行中,则表明容器已经搭建成功 购买成功后,返回容器控制台界面 5、节点容器管理 6、创建redis工作负载 7、创建mysql工作负载 8、…

有效的括号(oj题)

一、题目链接 https://leetcode.cn/problems/valid-parentheses/submissions/538110206 二、题目思路 利用栈的性质,后进先出 1.依次读取字符串,判断是否为左括号,如果是,就将其入栈。 2.如果读取的不是左括号,就说…

c++编译器在什么情况下会提供类的默认构造函数等,与析构函数

我们都知道,在 c 里,编写的简单类,若没有自己编写构造析构函数与 copy 构造函数 与 赋值运算符函数,那么编译器会提供这些函数,并实现简单的语义,比如成员赋值。看 源码时,出现了下图类似的情形…

如何使用Python的Turtle模块绘制小猪

一、前置条件 在开始学习如何使用Python的Turtle模块进行绘画之前,请确保你的电脑已安装Python环境。如果尚未安装Python,你可以从Python官网下载并安装最新版本。 Turtle模块是Python内置的一个用于绘图的库,通常不需要额外安装。如果你发…

vivado DIAGRAM、HW_AXI

图表 描述 块设计(.bd)是在IP中创建的互连IP核的复杂系统 Vivado设计套件的集成商。Vivado IP集成器可让您创建复杂的 通过实例化和互连Vivado IP目录中的IP进行系统设计。一块 设计是一种分层设计,可以写入磁盘上的文件(.bd&…