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 3struct 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的结束。

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

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

相关文章

分布式光伏监控系统功能模块详解

目前,分布式光伏发电系统的总容量比较小,并且光伏电站的功率受外界环境影响容易出现大起大落的现象。这使电压调整变得很困难。光伏电站运行维护人员不足,长时间不保养维护会影响光伏电站的发电效率。针对上述问题,鹧鸪云基于无线…

天锐绿盾|设计院图纸透明加密软件、制造业文件资料防止外泄

#图纸加密软件# 天锐绿盾是一家专注于数据安全解决方案的提供商,其产品主要为企业级用户设计,旨在保护敏感信息和知识产权免遭未经授权的访问或泄露。"天锐绿盾"的图纸透明加密软件和机械制造业文件资料防止外泄系统,是专为设计院…

JS中的宏任务和微任务

JavaScript 引擎是建立在一个事件循环系统之上的,它实时监控事件队列,如果有事件就执行,如果没有事件就等待。事件系统是一个典型的生产消费模式,生产者发出事件,接收者监听事件,在UI 开发中是常见的一个设…

Modbus TCP转CAN网关在不同行业中的应用以及其使用上的优势

倍讯科技Modbus TCP转CAN网关通常被用于工业自动化领域,特别是在需要连接现有Modbus TCP网络和CAN总线设备的场景中。以下是该网关在不同行业中的应用以及其使用上的优势: 1. 制造业: - 在制造业中,各种类型的设备和机器通常使用不…

Java项目实现报文数据校验注解方式(必输项、值大小)

普通项目 导入校验依赖 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.1.0.Final</version></dependency><dependency><groupId>javax.validation</…

Docker安装Redis,并在 Visual Studio Code 中使用它

Docker安装Redis 查找Redis docker search Redis完整结果 PS C:\Users\cheng> docker search Redis NAME DESCRIPTION STARS OFFICIAL redis Redis is an open …

System V IPC(进程间通信)机制详解

文章目录 一、引言二、System V IPC的基本概念1、IPC结构的引入2、IPC标识符&#xff08;IPC ID&#xff09;3、S ystem V的优缺点 三、共享内存&#xff08;Shared Memory&#xff09;1、共享内存的基本概念2、共享内存的创建&#xff08;shmget&#xff09;3、共享内存的附加…

python的文件操作及函数式编程介绍

五、文件操作 1、读取键盘输入 input 获取标准输入&#xff0c;数据类型统一为字符串 #!/usr/bin/python # -*- coding: UTF-8 -*- str input("请输入&#xff1a;") print&#xff08;"你输入的内容是: ", str&#xff09; 这会产生如下的对应着输入的…

KeyShot 2023.3 Pro for mac/win:完美融合3D渲染与动画制作

在当今数字化时代&#xff0c;视觉内容的创作和表现越来越受到重视。无论是产品设计、建筑规划&#xff0c;还是影视特效&#xff0c;都需要具备出色的3D渲染和动画制作工具来展现创意和想法。而作为业内领先的3D渲染和动画制作软件之一&#xff0c;KeyShot 2023.3 Pro在这个领…

电脑刚开机的时候不卡,用一会就变卡顿了…怎么回事?

前言 昨天咱们聊到旧电脑更换了固态硬盘之后&#xff0c;开机就会变快的事情&#xff0c;这个确实是可行且有效的升级电脑办法之一。 看完这篇之后&#xff0c;切莫着急升级电脑硬件配置&#xff0c;因为这里的坑比你想象的还要多。 从机械硬盘测试的数据和固态硬盘的测试数…

从CSDN搬家到微信公众号

博主将会在微信公众号里不断输出精品内容&#xff0c;陪伴大家共同成长。 如果你对博主的经历感兴趣&#xff0c;或者对博主的IT技术感兴趣&#xff0c;欢迎关注我的微信公众号&#xff0c;阅读我的技术文章&#xff0c;免费获取各种IT资源。也可以加我的微信成为我的好友&…

档案数字化加工是如何利用档案的

档案数字化加工是将纸质档案转化为数字形式&#xff0c;并进行后续的加工和利用。通过档案数字化加工&#xff0c;可以实现以下几个方面的利用&#xff1a; 1. 存储和保护&#xff1a;数字化档案可以将大量的纸质档案存储在数字存储介质中&#xff0c;从而节省空间和维护成本。…

面试算法之哈希专题

赎金信 class Solution { public:bool canConstruct(string ransomNote, string magazine) {// 小写字母int r_cnt[26];int m_cnt[26];for(int i 0; i< magazine.size(); i) {m_cnt[magazine[i]-a]; // 统计}// 对比for(int i 0; i< ransomNote.size(); i) {if(m_cnt[r…

使用vant-ui+vue3实现一个可复用的评星组件

如图所示 有两种情况 一种是5颗星 一种是3颗星 官网上只提供了图标类型的 并没有加文字 https://femessage-vant.netlify.app/#/zh-CN/ 自己结合两种情况 在全局注册了此组件(后续还会持续更新代码~) <template><div class"vant_rate_wrapper"><van…

【Javaer学习Python】 1、Django安装

安装 Python 和 PyCharm 的方法就略过了&#xff0c;附一个有效激活PyCharm的链接&#xff1a;https://www.quanxiaoha.com/pycharm-pojie/pycharm-pojie-20241.html 1、安装Django # 安装Django pip install Django# 查看当前版本 python -m django --version 5.0.62、创建项…

HTML常用标签-表格标签

表格标签 1 常规表格2 单元格跨行3 单元格跨行 1 常规表格 table标签 代表表格 thead标签 代表表头 可以省略不写 tbody标签 代表表体 可以省略不写 tfoot标签 代表表尾 可以省略不写 tr标签 代表一行 td标签 代表行内的一格 th标签 自带加粗和居中效果的td 代码 <h…

探索数据结构:堆的具体实现与应用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 堆的概念 堆(Heap)是计算机科学中一类特殊的数据结构。堆通常是一个…

C++ QT设计模式 (第二版)

第3章 Qt简介 3.2 Qt核心模块 Qt是一个大库&#xff0c;由数个较小的库或者模块组成&#xff0c;最为常见的如下&#xff1a;core、gui、xml、sql、phonon、webkit&#xff0c;除了core和gui&#xff0c;这些模块都需要在qmake的工程文件中启用 QTextStream 流&#xff0c;Qdat…

2024年高考倒计时精品网页

2024年高考倒计时精品网页 前言效果图部分代码领取源码下期更新预报 前言 随着季风轻轻掠过&#xff0c;岁月如梭&#xff0c;再次迎来了这个属于青春与梦想交汇的时刻——高考。这是一场知识的较量&#xff0c;更是一次意志的考验。在这最后的冲刺阶段&#xff0c;每一刻都显…

可视化 FlowChart 0.4.1 最强的拖拽组件

主要解决以及目标&#xff1a; ti-flowchart 能满足 二次开发的大部分需求。 下发GIF图可见&#xff0c;左边的模块A 由二次开发人员设计&#xff0c;通过向flowchart注册模块Dom&#xff0c;实现符合拖拽&#xff0c;编辑&#xff0c;布局&#xff0c;以及响应事件上抛。 实…