Linux进程——Linux下常见的进程状态

前言:在进程学习这一块,我们主要学习的就是PCB这个进程控制块,而PBC就是用来描述进程的结构体,而进程状态就是PCB结构体中的一个变量。


在这里插入图片描述


本篇主要内容:

  • 操作系统中的进程状态
  • Linux下的进程状态

在这里插入图片描述


在开始之前,我们先来简单了解以下进程状态

在这里插入图片描述
进程的本质就是PCB中的一个变量!!!

所谓状态变化,本质就是修改整形变量!!!


进程状态

  • 1. 操作系统中的进程状态
    • 运行状态
    • 阻塞状态
    • 挂起状态
  • 2. Linux下的进程状态
    • 运行状态
    • 休眠状态
    • 前台进程和后台进程
    • 停止状态
  • 3. 总结

1. 操作系统中的进程状态

本篇围绕操作系统中的三种进程状态:运行状态阻塞状态挂起状态来展开

在这里插入图片描述
当进程准备好了随时可以被调度时,其实就是创建状态和就绪状态,这俩没有太大区别!!


运行状态

虽然不同的计算机有不同的配置,但是无论如何
每个CPU都会在系统层面有属于自己的运行队列!

在这里插入图片描述
只要在运行队列中的进程都是运行状态!


阻塞状态

我们在编写的代码中,都会无法避免的访问一些操作系统里的某些资源,比如:磁盘,键盘,网卡等硬件设备,当我们用scanf或者cin读取键盘数据时,当我们不输入s时,数据没有准备就绪,进程不具备访问条件,进程代码无法向后执行,这就是阻塞状态

系统会等待用户输入,只要不输入,要访问的资源就没有就绪

比如:

  1 #include<stdio.h>
  2 
  3 int main()
  4 {
  5     int n = 0;
  6 
  7     printf("please Enter# ");
  8 
  9     scanf("%d",&n);
 10 
 11     printf("echo# %d\n",n);
 12 
 13     return 0;
 14 }  

我们在运行这段代码时;
在这里插入图片描述
进程一直等待着我们从键盘输入数据,此时进程就处于阻塞状态!

操作系统要管理进程,操作系统就必须知道进程的基本信息;操作系统要管理硬件,也就必须知道硬件的相关信息!

那操作系统是如何知道底层硬件的信息呢?

在操作系统中,有管理设备的结构体
在这里插入图片描述
将一个进程从运行队列移动至的等待队列中,再将状态改为阻塞那么这个进程就处于阻塞状态,这个过程就是状态变化!

进程状态的变化:

  • 更改PCB status的整数变量
  • 将PCB连入不同的队列中

所有过程都只会进程的PCB有关,和进程代码数据没有关系!

操作系统中,会存在非常多的队列,运行队列,等待硬件的设备等待队列等,并且所有系统内的进程都是以双链表链接起来!


挂起状态

假设:
一个进程当前被阻塞了,那么这个进程在它所等待的资源没有就绪的时候,该进程是无法被调度的。如果此时恰好OS内的内存资源已经严重不足了,那么操作系统该怎么办?

  • 因为此时进程处于阻塞状态,并且内存已严重不足,所以OS会将PCB对应的数据和代码转移到磁盘,为内存释放一部分资源,腾出一部分空间,然后该进程就被挂起了

在这里插入图片描述

  • 将内存数据进行置换到外设,针对所有阻塞进程,因此不用担心效率降低的问题,因为这个是必然的,而现在首要任务是让操作系统能继续执行下去!
  • 分区是磁盘中真实存在的,它的大小往往是很小的,这个部分专门
    用于内存严重不足时和内存进行交互,并且当内存情况缓解后,曾经被置换出去的代码和数据又会重新加载进来
  • 当进程被系统调度时,曾经被置换出去的进程代码和数据,又要重新被加载进来

2. Linux下的进程状态

下面是一段库中找的状态的定义:

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 */
};

Linux下的进程状态:

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

运行状态

在介绍完这些状态之后,我们来实际操作看看!

我们来一段死循环代码,方便我们观察

  1 #include<stdio.h>  
  2 #include <unistd.h> 
  3 int main()  
  4 {  
  5     while(1)
  6     {
  7         printf("hello , Linux!\n");
  8         sleep(1);                                                                                                                                                                      
  9     }                                                                                                       
 10     return 0;                                                                                               
 11 }                                                                                                                                                                                     
~      

在这里插入图片描述

我们可以看到程序时处于一个S+的状态,但是依据概念,程序不应该是R状态吗?

  • 因为循环打印时,IO输出是很慢的打印字符会和外设屏幕交互,因此大部分时间进程都处于阻塞状态,但也有极少时间在打印,所以查看进程状态时,我们偶尔可以看见R状态

如果我们将printf删除,单留while,会是什么情况呢?

  1 #include<stdio.h>  
  2   
  3 int main()  
  4 {  
  5     while(1)  
  6     {  
  7     }                                                                                  
  8     return 0;      
  9 } 

在这里插入图片描述
我们可以看到此时程序处于R状态


休眠状态

  • S(sleeping):休眠状态,浅度睡眠,可以被终止,浅度睡眠会对外部信号做出响应
  • D(disk sleep):也是休眠状态,深度睡眠

S相对操作系统来讲也就是阻塞状态,D则是专门针对磁盘设计的

我们来换个角度来理解以下D状态:

  • 假设在内存中,有一个进程,需要将自己的代码和数据写入磁盘,因为内容数据不小,在磁盘拷贝时,需要一段时间,此时进程变为S状态。
  • 此时,恰好系统内的内存资源已经严重不足了,系统压力太大,Linux在是在没办法时候,会通过杀掉进程,节省资源的,来不及进程反应直接被系统 “干掉” 。
  • 然后磁盘写入失败,而磁盘也有自己的事情要做,然后将未完成的代码和数据直接删除,拷贝失败!

如果真是这样,下次是很重要的数据,那么损失不可估量

因此系统创造了D状态:磁盘休眠状态;D状态不可被杀掉,OS也没有权力!

综上:S状态可以被终止,D状态不可被终止!


前台进程和后台进程

刚刚在上面查看进程状态时,是否有过疑问,为什么进程状态后面会有一个加号呢?

其实加号表示的是前台进程,而没有加号则是后台进程

我们先来了解一下这两种进程:

  • 前台进程:运行时无法使用bash外壳的指令并且可以被ctrl + c 强制终止
  • 后台进程:运行时可输入指令,不能被ctrl + c 终止只能使用kill指令来杀掉进程。

程序默认是前台进程,那么我们怎样才能将前台进程变成后台进程?
在执行程序时在末尾加上 &

通过视频我们来更直观的了解二者的区别

后台进程与前台进程


停止状态

  • T (stopped) 在进程访问软件资源的时候可能暂时不让进程进行访问,就将进程设置为STOP
  • t (tracing stop) debug程序的时候,追踪程序,遇到断点,进程暂停了

下面我们来看两个视频理解以下:

kill指令停止进程

SIGSTOP与SIGCONT

调试遇到断点

查看t状态

二者都是停止状态,对于停止状态用到的不多,我们了解一下即可!


3. 总结

在了解Linux中进程的分类时,我们通常是先了解操作系统的进程,因为二者有一定的联系,了解操作系统能更好理解进程在操作系统中的运行关系。进程状态在进程中也极为重要,希望大家能理解透彻!

谢谢大家支持本篇到这里就结束了
在这里插入图片描述

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

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

相关文章

Redis学习笔记(基础)

Redis学习笔记&#xff08;基础&#xff09; 一、Nosql概述1.1、为什么使用Nosql1.2、什么是Nosql1.3、阿里巴巴演进分析1.4、NoSQL的四大分类 二、 Redis入门2.1、概述2.2、Windows使用Redis2.3、linux安装2.4、redis-benchmark性能测试2.5、Redis基础知识 三、五大数据类型3.…

Linux专栏08:Linux基本指令之压缩解压缩指令

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Linux专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Linux基本指令之压缩解压缩指令 编号&#xff1a;08 文章目录 Linu…

初始Java篇(JavaSE基础语法)(7)抽象类和接口(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaSE 目录 抽象类 抽象类的概念&#xff1a; 抽象类语法 抽象类特性 抽象类的作用 接口 接口的概念&#xff1a; 语法规则 接口…

ssm104园区停车管理系统+jsp

园区停车管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管…

Atlassian Jira 信息泄露漏洞(CVE-2019-3403) 排查思路

Atlassian Jira&#xff1a; 企业广泛使用的项目与事务跟踪工具&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 简述&#xff1a; 近日发现多个内网IP触发的Atlassian Jira 信息泄露漏洞的告警。 告警的检测规…

C语言:内存操作函数memcpy、memmove、memset和memcpy的使用和模拟实现

一&#xff1a;memcpy的使用和模拟 memcpy使用时需要包含的头文件为#include<string.h> void* memcpy(void* destination,const void* source,size_t num) 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置&#xff08;特别注意的是…

Python | Leetcode Python题解之第66题加一

题目&#xff1a; 题解&#xff1a; class Solution:def plusOne(self, digits: List[int]) -> List[int]:n len(digits)for i in range(n - 1, -1, -1):if digits[i] ! 9:digits[i] 1for j in range(i 1, n):digits[j] 0return digits# digits 中所有的元素均为 9retu…

「C++ 内存管理篇 04」动态二维数组

目录 一. 使用calloc/free开辟和释放二维数组 二、 使用new/delete开辟和释放二维数组 一. 使用calloc/free开辟和释放二维数组 让一个二级指针变量存放动态开辟的一级指针数组的起始地址&#xff0c;然后让这些一级指针指向动态开辟的基本类型的数组&#xff1a; // 开辟一个大…

【C++】模拟实现string

文章目录 前言成员变量成员函数构造函数浅拷贝深拷贝构造函数实现 析构函数赋值重载 迭代器begin & endrbegin & rend 空间管理函数元素访问元素修改字符串运算流提取 & 流插入流提取流插入 总结 前言 模拟实现不是为了写得和库里面一样好。而是为了更好的了解底层…

一行代码将文件存储到本地或各种存储平台

一行代码将文件存储到本地或各种存储平台 这里我们介绍的是一个开源项目。 这个是他的官网 简介 (xuyanwu.cn) 下面来看他的一个介绍&#xff1a; 一行代码将文件存储到本地、FTP、SFTP、WebDAV、阿里云 OSS、华为云 OBS、七牛云 Kodo、腾讯云 COS、百度云 BOS、又拍云 USS…

R语言学习—1—将数据框中某一列数据改成行名

将数据框中某一列数据改成行名 代码 结果

【大语言模型LLM】-基于大语言模型搭建客服助手(2)

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 很多非常有趣的模型&#xff0c;值得收藏&#xff0c;满足大家的收集癖&#xff01; 如果觉得有用&#xff0c;请三连&#x1f44d;⭐❤️&#xff0c;谢谢&#xff01; 长期不…

408数据结构-树的基本概念与性质 自学知识点整理

树的定义 树是 n n n&#xff08; n ≥ 0 n≥0 n≥0&#xff09;个结点的有限集。当 n 0 n0 n0时&#xff0c;称为空树。 任意一棵非空树应具有以下特性&#xff1a; 有且仅有一个特定的被称为根的结点&#xff08;根结点&#xff09;。当 n &#xff1e; 1 n&#xff1e;1 …

【C语言】/*数据类型和变量*/

目录 前言 一、数据类型的介绍 二、内置数据类型的介绍 2.1 字符型 2.2 整型 2.3 浮点型 2.4 布尔类型 三、数据类型长度的计算 3.1 sizeof 操作符 3.2 数据类型的长度(VS2022) 3.3 sizeof中表达式不计算 四、signed 和 unsigned 五、数据类型的取值范围 六、变…

.360勒索病毒的威胁:如何恢复您的数据?

引言&#xff1a; 近年来&#xff0c;网络安全威胁层出不穷&#xff0c;其中.360勒索病毒以其独特的攻击方式和广泛的传播能力&#xff0c;成为了众多企业和个人面临的重大挑战。本文将对.360勒索病毒进行深入剖析&#xff0c;并探讨应对此类病毒的有效策略&#xff0c;以帮助…

UE5入门学习笔记(六)——编译低版本插件

对于有些低版本的插件&#xff0c;可以通过此方法自己编译到高版本而无需等待插件作者更新 使用工具&#xff1a;如图所示 步骤1&#xff1a;打开cmd&#xff0c;并使用cd命令切换到此目录 步骤2&#xff1a;输入如下指令 RunUAT.bat BuildPlugin -Plugin“路径1” -Package“…

Java中的进程和线程

进程定义 进程是正在运行的程序&#xff0c;是系统进行资源分配和调用的独立单位&#xff0c;每一个进程都有它自己的内存空间和系统资源 线程的定义 线程是进程中单个顺序控制流&#xff0c;是一种执行路径 单线程&#xff1a; 一个进程如果只有一条路径则被称为单线程 多…

python学习笔记----面向对象(十)

一、什么是类 类是一个抽象的模板&#xff0c;用于创建具体的实例。可以将类理解为一个蓝图&#xff0c;它定义了一系列对象共有的属性&#xff08;数据&#xff09;和方法&#xff08;函数&#xff09;。类是对一组具有相同属性和功能的对象的抽象。例如&#xff0c;你可以定…

数据结构——循环结构:for循环

今天是星期五&#xff0c;明天休息&#xff0c;后天补课&#xff0c;然后就是运动会&#xff0c;接着是放假。&#xff08;但这些都和我没关系啊&#xff0c;哭死&#xff01;&#xff09;今天脑袋难得清醒一会儿&#xff0c;主要是醒的比较早吧&#xff0c;早起学了一会&#…

【VueUse】超越基本功能的高级 Vue 元素操作

在vue开发中我们经常需要操作DOM元素&#xff0c;从简单的添加类到动态创建元素&#xff0c;这些操作都是不可避免的。而在VueUse库中&#xff0c;Elements相关API函数为我们提供了一系列强大而灵活的工具&#xff0c;帮助我们更轻松地处理DOM元素。无论是优雅地处理元素、动态…