Linux基础之进程-进程状态

目录

一、进程状态

1.1 什么是进程状态

1.2 运行状态

1.2 阻塞状态

1.3 挂起状态

二、Linux操作系统上具体的进程状态

2.1 状态

2.2 R 和 S 状态的查看

2.3 后台进程和前台进程

2.4 休眠状态和深度休眠状态


一、进程状态

1.1 什么是进程状态

       首先我们知道我们的操作系统是通过我们的PCB来管理我们的进程的,那么我们的状态这个属性一定在我们的PCB这个结构体里(其在PCB中是一个整形字段)。用简单的话来说,用宏定义(也可能是其他方式)了几个值,用这几个值来代表我们不同的状态。

#define NEW 1
#define RUNNING 2
#define BLOCK 3

struct PCB
{
   ...//其他属性
   int status;//状态
}//通过改变status的值来代表改变进程的状态

根据一些教材上的描述,进程大概会有以下的一些状态。

(图片来源于网络)。
       接下来我就来给大家好好介绍一下这些状态(其中创建状态、就绪状态和运行状态我统一归结为运行状态)。

1.2 运行状态

       在上文回答第四个问题的时候,我有提到过一个运行队列的概念,它提供了一种有序执行任务的机制,使得任务的执行顺序可控,并能够有效地利用系统资源。所以我们的OS会维护一个运行队列去存放我们的进程,而我们的CPU则会去执行该队列PCB所指的代码。

由此,我们的出一个概念:

不管一个进程是否在被处理,只要其PCB加入了运行队列,我们就称其处在运行状态。

1.2 阻塞状态

       我们的代码一定会或多或少的会访问系统中的某些资源,比方说:键盘、硬盘等等,在比方说我们的scanf()和cin>> ,本质上都是从我们的键盘上读取数据,那要是我们一直不输入怎么办,那是不是我们的程序会一直卡在那,不动了。为什么会不动呢,因为需要的数据没有就绪,也就是我们进程要访问的资源没有就绪,条件不具备,我们的代码就没办法往下执行。
       我们的OS要管理我们的进程,也同样会去管理我们的硬件资源,也就是说我们设备的资源充不充足,有没有就绪,OS是知道的,怎么知道的呢,通过维护我们的硬件资源的dev_list。但这个
list多个一个属性:PCB* wait_queue。也就是说,当我们的设备资源不充足时,我们对应的PCB就会加入到该设备的这个等待队列中,而我们把在设备的等待队列中的PCB的状态叫做阻塞状态

通过这部分的讲解,我们可以得到一个结论:

进程状态变化的本质:

1.更改PCB 对应的status变量的值

2.将PCB链入到我们不同的队列当中

1.3 挂起状态

       如果一个进程当前被阻塞了,那就注定了这个进程在其所需要的资源没有就绪之前是不会被调度的。那么如果这个时候我们的操作系统内的内存资源严重不足了该怎么办?
       我们的操作系统在我们的磁盘中划分了一个叫做swap的分区,其作用就是在我们OS的内存资源不足的时候,换取一些资源回来。怎么换呢?换谁呢?就换我们处于阻塞状态的进程。
 
       将我们的PCB的数据(是数据置换了,留出空间,而不是这个进程没有了)置换到我们的swap分区,置换之后我们的进程所处状态就叫挂起状态。
       这个时候可能有人会问,OS不是非常注重效率的吗,其主动去访问我们的磁盘,不会降低我们OS的效率吗?确实会影响我们OS的效率,但是这个时候OS都快挂掉了,所以优先考虑的问题是让OS运行下去。
       当之后我们的资源空闲出来,我们的进程被重新调度时,曾经被置换出去的数据和代码,又会被重新置换回来。

二、Linux操作系统上具体的进程状态

2.1 状态


先来看看再kernal内核里的代码

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

2.2 R 和 S 状态的查看

我们可以通过我们的代码和我们的指令来查看我们的进程状态,先写一段代码。

可以看到我们的状态如下
      其中STAT(status)就代表我们的状态栏,可以看到我们的程序,一直明明在跑,却处于我们的S(即阻塞状态)状态,这是为什么呢?其实我们的CPU速度是很快的,程序其实已经走完了,但是我们的printf语句是需要访问我们的外设的(显示器),访问外设又是一个比较慢的过程,所以该进程的大部分时间都处于S状态。那如果我们不输出呢?

可以看到我们的进程状态就可以被观测到处于我们的R状态(运行状态)。至于这个+号是什么意思,我们马上就能知道了。

2.3 后台进程和前台进程

有+号代表是前台进程,没有的代表是后台进程。
首先这两个概念是什么意思呢?

前台进程:进程在被执行时,无法使用其他的指令,且其可以被ctrl + C 强行终止掉

后台进程:进程在被执行时,可以使用其他的指令,但是不能被ctrl + C 强行终止掉,所以需要kill将其杀掉。

那怎么将我们的进程变成一个后台进程呢?

在执行我们的程序时,在其后面加上一个 &
类似于: ./mybin &

给大家演示一下:

      可以看到我们在边执行程序的时候还可以使用我们的指令(如果要终止这个进程使用指令 kill -9 + 该进程的PID)。

2.4 休眠状态和深度休眠状态

       对于这个状态给大家举个例子就能理解了,假设我们有一个进程正在向磁盘中存放数据(数据量有点大),由于访问我们的硬件速度很慢,我们的进程就会进入我们的S状态(即阻塞状态),如果这个时候我内存资源已经不够,swap分区也不够用了,需要干掉一些进程来存活,那恰好就把这个还在等待磁盘返回结果的进程干掉了,其数据全都释放了。那此时,如果我们的磁盘存储失败了,那我们的这部分数据就丢失了,那是不是很容易造成很严重的影响。所以就有了我们深度睡眠状态D,不可被中断。

D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。

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

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

相关文章

Java学习47-Java 流(Stream)、文件(File)和IO - 其他流的使用

1.标准输入流System.in/标准输出流System.out System.in : 标准的输入流,默认从键盘输入 System.out: 标准的输出流,默认从显示器输出(理解为控制台输出) System.setOut()方法和 System.setIn()方法(结合下面介绍的打印流举例) …

灵活的静态存储控制器 (FSMC)的介绍(STM32F4)

目录 概述 1 认识FSMC 1.1 应用介绍 1.2 FSMC的主要功能 1.2.1 FSMC用途 1.2.2 FSMC的功能 2 FSMC的框架结构 2.1 AHB 接口 2.1.1 AHB 接口的Fault 2.1.2 支持的存储器和事务 2.2 外部器件地址映射 3 地址映射 3.1 NOR/PSRAM地址映射 3.2 NAND/PC卡地址映射 概述…

ctfshow web入门 php反序列化 web267--web270

web267 查看源代码发现这三个页面 然后发现登录页面直接admin/admin登录成功 然后看到了 ///backdoor/shell unserialize(base64_decode($_GET[code]))EXP <?php namespace yii\rest{class IndexAction{public $checkAccess;public $id;public function __construct(){…

定时器的理论和使用

文章目录 一、定时器理论1.1定时器创建和使用 二、定时器实践2.1周期触发定时器2.2按键消抖 一、定时器理论 定时器是一种允许在特定时间间隔后或在将来的某个时间点调用回调函数的机制。对于需要周期性任务或延迟执行任务的嵌入式应用程序特别有用。 软件定时器&#xff1a; …

MySQL表的基本操作

表 创建表 comment是添加一个注释 语法&#xff1a; 说明&#xff1a; field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c;如果没有指定字符集&#xff0c;则以所在数据库的字符集为准 collate 校验规则&#xff0c;如果没有指定校验规则&#xff0c;则…

知识图谱 | 语义网络写入图形数据库(含jdk和neo4j的安装过程)

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要介绍如何使用 Neo4j 图数据库呈现语义网络&#xff0c;并通过 Python 将语义网络的数据写入数据库。具体步骤包括识别知识中的节点和关系&#xff0c;将其转化为图数据库的节点和边&#xff0c;最后通过代码实现数据的写…

两数相加 - (LeetCode)

前言 今天无意间看到LeetCode的一道“两数相加”的算法题&#xff0c;第一次接触链表ListNode&#xff0c;ListNode结构如下&#xff1a; public class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) {this.val val;}ListNode(int val, ListNode next) {…

使用TimeSum教你打造一套最牛的知识笔记管理系统!

从用户使用场景进行介绍软件的使用&#xff1a; 一、用户需求&#xff1a; 我需要一款软件记录我每天&#xff1a; 干了啥事有啥输出&#xff08;文档&#xff09;需要时间统计&#xff0c;后续会复盘记录的内容有好的逻辑关系需要有日历进行展示。 二、软件使用介绍&#xf…

【UE5.1 角色练习】01-使用小白人蓝图控制商城角色移动

目录 效果 步骤 一、导入资源 二、控制角色移动 三、更换角色移动动作 效果 步骤 一、导入资源 新建一个工程&#xff0c;然后在虚幻商城中将角色动画的相关资源加入工程&#xff0c;这里使用的是“动画初学者内容包”和“MCO Mocap Basics” 将我们要控制的角色添加进…

在idea中使用vue

一、安装node.js 1、在node.js官网&#xff08;下载 | Node.js 中文网&#xff09;上下载适合自己电脑版本的node.js压缩包 2、下载完成后进行解压并安装&#xff0c;一定要记住自己的安装路径 一直点击next即可&#xff0c;这部选第一个 3、安装成功后&#xff0c;按住winR输入…

【Shell脚本】Shell编程之数组

目录 一.数组 1.基本概念 2.定义数组的方法 2.1.方法一 2.2.方法二 2.3.方法三 2.4.方法四 2.5.查看数组长度 2.6.查看数组元素下标 3.数组分片 4.数组字符替换 4.1.临时替换 4.2.永久替换 5.数组删除 5.1.删除某个下标 5.2.删除整组 6.数组遍历和重新定义 7…

2024洗地机爆款榜单,哪个牌子洗地机值得买?助你轻松选对洗地机

随着现代生活节奏的加快&#xff0c;人们对于家庭清洁的需求也越来越高。家用洗地机作为一种高效清洁工具&#xff0c;能够帮助您轻松应对家庭地板的清洁问题&#xff0c;节省时间和精力。然而&#xff0c;在选择洗地机时&#xff0c;究竟哪个牌子的洗地机值得买呢&#xff1f;…

【 第一性原理计算方法及应用】

第一性原理计算方法及应用述

Android Iptables 客制化方法及基本使用

Android Iptables 客制化方法及基本使用 Android netd 的自定义链NetdConstants.cpp 的 execIptablesRestore 方法IptablesRestoreController 的 execute 方法使用 oem-iptables-init.sh 添加自定义的防火墙规则oem-iptables-init.sh 示例文件 基本概念Iptables 链Iptables 表 …

关于nvm管理node版本的一些问题

背景&#xff1a; 基于开发项目的迭代不能做到全部更新&#xff0c;有的项目是vue2.0 有的项目是vue3.0&#xff0c; 那么我们开发的时候就需要对node 进行更新&#xff0c;进而产生因为版本不同导致的错误&#xff1a;由此我们需要一款管理 切换node版本的东西&#xff0c;那就…

其它高阶数据结构①_并查集(概念+代码+两道OJ)

目录 1. 并查集的概念 2. 并查集的实现 3. 并查集的应用 3.1 力扣LCR 116. 省份数量 解析代码1 解析代码2 3.2 力扣990. 等式方程的可满足性 解析代码 本篇完。 写在前面&#xff1a; 此高阶数据结构系列&#xff0c;虽然放在⑤数据结构与算法专栏&#xff0c;但还是作…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷5(私有云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

idea2023.3.2版本全局设置maven地址

idea每次新建项目都默认使用了一个user目录下的地址&#xff0c;而不是自己安装的maven地址&#xff0c;每次创建项目后&#xff0c;都要重新从settings中设置一下maven地址。 可以全局修改&#xff1a;首先在File-->Close Project回到idea最开始的界面 然后在Customize里点…

Spring Boot 整合讯飞星火3.5通过接口Api接口实现聊天功能(首发)复制粘贴即可使用,后续更新WebSocket实现聊天功能

程序员必备网站&#xff1a; 天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 1.pom.xml <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.72</version></dependency><depen…

我和jetson-Nano的故事(10)——安装OpenCV3.2.0

1. 仓库地址 opencv https://opencv.org/releases/page/6/opencv_contrib https://github.com/opencv/opencv_contrib/tree/3.2.0 2. cmake-gui安装 安装指令 sudo apt-get install cmake-qt-gui如果安装过程中入到下面的问题 可以按照以下方法解决 sudo apt --fix-broke…