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

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

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

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

相关文章

C++细节,可能存在的隐患,面试题03

文章目录 11. C编译过程12. const vs #define12.1. 全局const vs 局部const 13. C内存分区14. C变量作用域14.1. 常量 vs 全局变量 vs 静态变量 15. C类型转换16. 函数指针17. 悬空指针 vs 野指针18. 为什么使用空指针&#xff0c;建议使用nullptr而不是NULL&#xff1f; 11. C…

噪声嵌入提升语言模型微调性能

在自然语言处理&#xff08;NLP&#xff09;的快速发展中&#xff0c;大模型&#xff08;LLMs&#xff09;的微调技术一直是研究的热点。最近&#xff0c;一篇名为《NEFTUNE: NOISY EMBEDDINGS IMPROVE INSTRUCTION FINETUNING》的论文提出了一种新颖的方法&#xff0c;通过在训…

Gitlab搭建

Gitlab搭建 一.gitlab安装二.gitlab安装目录三.gitlab常用命令汇总四.gitlab访问测试1.登录gitlab2.配置默认访问密码3.登陆自己创建的账户 五.gitlab图形化操作1.gitlab关闭自动注册2.gitlab免密登录3.gitlab创建项目4.使用管理员创建账户5.gitlab 添加邮箱设置5.1开启SMTP功能…

【直观对比】RTX3090和RTX4090的计算能力的参数对比

1. 引言 随着大模型的火热&#xff0c;越来越多的人希望可以购买一个硬件进行大模型的推理&#xff0c;特别是在3090和4090显卡的对比上&#xff0c;需求比较大。目前已有的显卡对比&#xff0c;大多面向于高端的A/H100或者800系列的对比和分析&#xff0c;如图所示。 项目A1…

Minimal-Supervised Medical Image Segmentation via Vector Quantization Memory

文章目录 Minimal-Supervised Medical Image Segmentation via Vector Quantization Memory摘要方法实验结果 Minimal-Supervised Medical Image Segmentation via Vector Quantization Memory 摘要 辅助重构分支&#xff1a;该分支通过提供额外的监督并产生学习视觉表示所需…

ios实现拍摄视频与显示在界面上

1、添加录音和拍摄权限 NSMicrophoneUsageDescription Privacy - Camera Usage Description 2、代码 #import "ViewController.h" #import <AVFoundation/AVFoundation.h> #import <MobileCoreServices/MobileCoreServices.h>// 接下来是你的 ViewCont…

nginx--tcp负载均衡

mysql负载均衡 安装mysql yum install -y mariadb-server systemctl start mariadb systemctl enable mariadb ss -ntl创建数据库并授权 MariaDB [(none)]> create database wordpress; Query OK, 1 row affected (0.00 sec)MariaDB [(none)]> grant all privileges o…

快速搭建webase-front并且部署合约

PS: 因为我开发时候要用到fisco和webase-front,避免官方文档粘贴, 因此直接整理下面的笔记。开发的时候,好粘贴。1.搭建4节点联盟链 前提 curl 一种命令行工具 apt install -y openssl curl创建操作目录, 下载安装脚本 cd ~ && mkdir -p fisco && cd fisco…

uniapp百度地图聚合

// loadBMap.js ak 百度key export default function loadBMap(ak) {return new Promise((resolve, reject) > {//聚合API依赖基础库,因此先加载基础库再加载聚合APIasyncLoadBaiduJs(ak).then(() > {// 调用加载第三方组件js公共方法加载其他资源库// 加载聚合API// Ma…

《ESP8266通信指南》15-MQTT连接、订阅MQTT主题并打印消息(基于Lua|适合新手|非常简单)

往期 《ESP8266通信指南》14-连接WIFI&#xff08;基于Lua&#xff09;-CSDN博客 《ESP8266通信指南》13-Lua 简单入门&#xff08;打印数据&#xff09;-CSDN博客 《ESP8266通信指南》12-Lua 固件烧录-CSDN博客 《ESP8266通信指南》11-Lua开发环境配置-CSDN博客 《ESP826…

JUC下CountDownLatch详解

详细介绍 CountDownLatch是Java并发包java.util.concurrent中提供的一个同步工具类&#xff0c;它允许一个或多个线程等待其他线程完成操作后再继续执行。这个工具类基于一个计数器&#xff0c;计数器的初始值可以由构造函数设定。线程调用countDown()方法会将计数器减1&#x…

深入理解JavaScript事件循环Event Loop:宏任务与微任务的奇幻之旅

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f389; 引言&#x1f31f; 什么是事件循环&#xff1f;&#x1f4da; 「宏任务」 vs 「微任务」「宏任务」(Macrotask)「微任务」(Microtask)实际应用中的注意事项 &#x1f500; 执行流程概览&#x1f4dd; 代码示例…

如何在JavaScript/Vue中获取当前时间并格式化输出(精确到时分秒)

如何在JavaScript/Vue中获取当前时间并格式化输出&#xff08;精确到时分秒&#xff09; 不只是树&#xff0c;人也是一样&#xff0c;在不确定中生活的人&#xff0c;能比较经得起生活的考验&#xff0c;会锻炼出一颗独立自主的心。在不确定中&#xff0c;就能学会把很少的养分…

在uniapp中如何安装axios并解决跨域问题

目录 1、安装axios 2、导入 3、使用&#xff08;发请求&#xff09; 2.解决跨域问题 1.为什么要解决跨域问题&#xff1f; 2.前端如何解决跨域问题&#xff1f; 1、安装axios npm install axios 2、导入 在main.js中导入使用 import axios from axios; // 创建一个名…

智慧互联,统信UOS V20桌面专业版(1070)解锁办公新模式丨年度更新

从小屏到大屏 突破&#xff0c;就在方寸之间 从人机到智脑 融合&#xff0c;旨在新质生产力 统信UOS一直致力于将先进科技与用户场景相结合&#xff0c;不断提升用户的工作效率和生产力。在最新发布的统信UOS V20桌面专业版&#xff08;1070&#xff09;版本中&#xff0c;我们…

Rust 解决循环引用

导航 循环引用一、现象二、解决 循环引用 循环引用出现的一个场景就是你指向我&#xff0c;我指向你&#xff0c;导致程序崩溃 解决方式可以通过弱指针&#xff0c;而Rust中的弱指针就是Weak 在Rc中&#xff0c;可以实现&#xff0c;对一个变量&#xff0c;持有多个不可变引…

【一支射频电缆的诞生】GORE 戈尔

工具连接&#xff1a; https://microwave-cablebuilder.gore.com/ 控制参数&#xff1a; 连接器&#xff1a; 欣赏

Android APP读写外置SD卡无权限 java.io.IOException: Permission denied

在物联网应用里&#xff0c;app需要对挂载SD卡读写文件&#xff0c;从 Android 4.4&#xff08;KitKat&#xff09;版本开始&#xff0c;Google 引入了一项名为 "Storage Access Framework" 的新功能&#xff0c;该功能限制了应用对外部存储的直接读写权限,要不然就是…

【挑战30天首通《谷粒商城》】-【第一天】03、简介-分布式基础概念

文章目录 课程介绍 ( 本章了解即可&#xff0c;可以略过)1、微服务简而言之: 2、集群&分布式&节点2.1、定义2.2、示例 3、远程调用4、负载均衡常见的负裁均衡算法: 5、服务注册/发现&注册中心6、配置中心7、服务熔断&服务降级7.1、服务熔断7.2、服务降级 8、AP…

Appium测试之获取appPackage和appActivity

appPackage和appActivity 进行appium自动化测试非常重要的两个参数&#xff0c;我们所测试的APP不同&#xff0c;这两个参数肯定也是不一样的。那如何快速的获取这APP的这两个参数呢&#xff1f;我这里介绍两个方法。 import org.openqa.selenium.remote.DesiredCapabilities;i…