Linux进程状态及优先级

进程状态及优先级

本文已收录至《Linux知识与编程》专栏!
作者:ARMCSKGT
演示环境:CentOS 7

在这里插入图片描述


进程状态及优先级

  • 前言
  • 正文
    • 进程状态
      • 就绪运行状态R
      • 阻塞
        • 睡眠状态 S
        • 休眠状态D
        • 挂起
      • 暂停状态T
        • 前台与后台进程
        • 待追踪暂停状态t
      • 死亡状态 X
      • 僵尸状态 Z
    • 孤儿进程
    • 进程优先级
      • 查看进程优先级
      • 修改进程优先级
  • 最后


前言

操作系统想管理好进程并不简单,对于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 */
};

分别对应:

  • R(就绪运行状态)
  • 阻塞状态
    – S(睡眠状态/可中断睡眠状态)
    – D(休眠状态/不可中断休眠状态)
    – 挂起状态
  • T(暂停状态)
    – 前台/后台进程
    – t(待追踪暂停状态)
  • X(死亡状态)
  • Z(僵尸状态)


就绪运行状态R

虽然从字面理解,运行状态就是进程在CPU上运行,但并非如此!
R(运行状态)代表进程在运行队列中排队,而队列的维护是操作系统来做的;可以理解为进程就绪,等待CPU资源的状态!

#include <iostream>
using namespace std;

int main()
{
   while(true); //死循环
   return 0;
}

test
在Linux系统中,新建、就绪、运行都可以看作运行 R 这一个状态,清晰明了!



阻塞

阻塞进程因为等待某种条件就绪,而导致的一种不推进状态,也就是进程卡住了;阻塞一定是在等待某种资源!
为什么会阻塞?进程要通过等待的方式,等具体的资源被别的进程用完之后,再被自己使用。

简而言之:阻塞就是进程等待某种资源(磁盘,网卡,显卡等各种外设)就绪的过程。

当一个进程运行到某指令时需要外部资源时,操作系统会将进程就会撤出CPU,放到某种资源处进行排队,也就不在CPU上运行了,直到该进程获取到了所有资源(具备运行条件),操作系统会将此进程放入运行队列中进行排队,继续运行!

综上:进程PCB可以被维护在不同的资源队列中; 所以阻塞就是不被调度,一定是因为当前进程需要等待某种资源就绪;在Linux系统下,一定是task_struct结构体需要在某种被操作系统管理的资源下排队!


睡眠状态 S

睡眠状态是可中断休眠,是阻塞的一种

当进程需要某资源时,操作系统将该进程挂到对应的资源队列排队,此时进程处于可中断休眠状态!

#include <iostream>
using namespace std;
>#include <unistd.h>

int main()
{
   while(true) //死循环打印pid
   {
       cout<<getpid()<<"进程运行中..."<<endl;
       sleep(1);
   }
   return 0;
}

可中断休眠
这里可能会有小伙伴疑惑,进程在运行,为什么不是显示R,而是S+?
这里需要说明一下的是,进程向屏幕不断打印的行为也是I/O行为,需要向屏幕这个硬件进行写入,所以每次申请写入屏幕时需要到对应资源队列排队并处于休眠状态,而CPU的运行速度非常快,在此过程中,进行几万次捕捉可能就只有一两次看到进程处于R状态,其他时候都是S+状态。

可能小伙伴还有一个问题,那么S+状态的 + 是什么意思?这个 + 的意思是代表该进程在前台运行,具有体前台后台进程的区别在暂停状态会简单介绍!

处于可中断休眠状态的进程可以被CTRL+C或kill -9等信号终止进程!
CTRL+C发送2号信号


休眠状态D

休眠状态是不可中断休眠状态,也是阻塞的一种!

休眠状态下的进程无法别终止,kill信号和操作系统都无法终止,只能等待进程获取到了对应的资源(达到对应条件)才能终止休眠状态; 当然,通过切断电源的方式也可以强制关闭,但是那样操作系统也关闭了,且会损失数据!

这种状态一般可能出现在,例如进程需要在磁盘上I/O,但是此时磁盘I/O阻塞了,此时如果影响进程可能会造成数据损坏,所以操作系统为了保证数据安全,不会插手这件事,一般很少会碰到该状态,如果碰到了该状态,那么计算机很可能就要崩溃了!

所以这种状态的出现往往是为了保护进程,但是最好尽量避免出现这种状态!


挂起

挂起一般又称阻塞挂起,也是一种特殊的阻塞状态!

当系统资源紧张,某些进程在运行时等待资源阻塞时,操作系统保留PCB转而释放该程序的代码和数据(放到硬盘上)腾出空间,此时进程被挂起。



暂停状态T

我们可以使用kill信号的方式让进程进入暂停状态;进入暂停状态的进程不在运行并保持在后台!

使进程暂停的方法:SIGCONT信号

  • kill -19 进程PID (暂停进程)
  • kill -18 进程PID (恢复进程)

暂停状态T


前台与后台进程

在Linux系统下,当进程在前台运行时其状态会附带一个 +,代表该进程是前台进程!
如果是后台进程则没有 + 符号!
进程可以在不同的状态下处于前台和后台运行!
前台与后台


待追踪暂停状态t

该状态是指该进程正在被另一个进程跟踪,例如在Linux下通过GDB调试一个程序,GDB中对被跟踪的进程打一个断点,进程在断点处停下来的时候就处于 t 状态。而在其他时候,被跟踪的进程还是处于其他。对于进程本身来说,T 和 t 状态很类似,都是表示进程暂停下来。
gdb



死亡状态 X

当进程结束或被终止时进入死亡状态,这个状态只是一个返回状态,你不会在任务列表里看到这个状态。因为CPU的处理速度非常快,这只是一瞬间!



僵尸状态 Z

僵尸状态是一个与死亡状态相似的状态,通常来说僵尸状态给父进程所准备的!

僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程。僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。

当父进程创建子进程后,子进程已经运行结束,父进程需要去接收子进程的退出结果(返回值)来判断子进程是否正常运行或运行结果是否正常,然后回收子进程!

所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。

#include <iostream>
using namespace std;
#include <unistd.h>
#include <cstdlib>

int main()
{
   pid_t id = fork();
   if(id == 0)
   {
       int i = 10;
       while(i--)
       {
           cout<<"子进程运行中..."<<endl;
           sleep(1);
       }
       cout<<"子进程退出!"<<endl;
       exit(0);
   }
   int i = 20;
   while(i--)
   {
       cout<<"父进程运行中..."<<endl;
       sleep(1);
   }
   cout<<"父进程退出!"<<endl;
   return 0;
}

子进程僵尸状态
维护僵尸进程的意义是为了让父进程读退出码,但是僵尸进程也有以下等危害:

  • 进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态。
  • 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护。
  • 那一个父进程创建了很多子进程,就是不回收,就会造成内存资源的浪费;因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!
  • 既然进程一直在内存中保存,就可能存在内存泄漏,需要释放。

所以我们要避免子进程长时间处于僵尸状态,后面在进程控制中会讲解回收监视子进程的办法!


孤儿进程


当父进程先于子进程结束或终止时,子进程就成为孤儿进程!
在Linux系统中,孤儿进程由1号进程bash接管成为后台进程!
孤儿进程
为什么bash要接管这个孤儿进程?

  • 如果不接管那么子进程在结束后没有父进程回收,一直处于僵尸状态,造成内存泄漏,所以需要bash接管进行释放!

进程优先级


进程除了有不同的状态,还有优先级之分:

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)。
  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

优先级图谱
CPU的资源是有限的,合理分配才能最大化效能!
Linux 给我们提供了修改 进程 优先级的权限,目的就是让我们对多任务运行进行合理处理,提高系统运行效率。


查看进程优先级

ps指令可以加上 -al 选项显示进程的其他信息!

ps -al | head -1 && ps -al | grep 进程名(程序名) | grep -v grep

进程优先级查看
关于PRI与NI值
– PRI是进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高。

PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:(新的PRI)=(旧的PRI)+nice

– NI是nice值,其表示进程可被执行的优先级的修正数值。

– 当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行所以,调整进程优先级,在Linux下,就是调整进程nice值。

nice其取值范围是-20至19,一共40个级别;当我们设置nice值时超过这个区间是无效的!

– 这里需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。可以理解nice值是进程优先级的修正修正数据。

– 优先级的修改行为并不是连续的,每次都是在最开始的基础上进行修改(默认为 80)。

– 调度器不允许存在 优先级失衡 的情况,因此优先级修改不能太激进。



修改进程优先级

进程优先级可以修改,但一般我们是不干预操作系统的调度的!

修改步骤:

  • top指令打开Linux任务管理器
  • 输入 r 进入NI值修改模式
  • 输入想修改NI值进程的PID
  • 最后输入NI值即可(范围-20~19)

步骤:
1
2
3
4
2
动图演示:进程优先级修改


最后

进程状态和进程优先级的知识到这里就介绍的差不多了,通过了解进程状态,知道进程的阻塞和和运行的原理;了解进程优先级,学习了修改进程的优先级影响调度机制,这些知识都在为后面进程控制的学习打下基础,后面我们还会介绍有关Linux的环境变量相关知识,敬请期待!

本次 <Linux进程状态及优先级> 就先介绍到这里啦,希望能够尽可能帮助到大家。

如果文章中有瑕疵,还请各位大佬细心点评和留言,我将立即修补错误,谢谢!
结尾

🌟其他文章阅读推荐🌟
Linux<进程初识> -CSDN博客
C++ <STL之string的使用> -CSDN博客
C++ <模板> -CSDN博客
C++ <内存管理> -CSDN博客
🌹欢迎读者多多浏览多多支持!🌹

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

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

相关文章

美颜SDK的隐私保护与安全性分析

随着智能手机和移动应用的普及&#xff0c;美颜SDK已经成为了很多应用的标配。美颜SDK的使用可以让用户在拍照或者视频聊天时&#xff0c;实现自拍美颜、滤镜、磨皮、瘦脸等效果。但是&#xff0c;在享受美颜SDK带来的便利的同时&#xff0c;我们也需要关注美颜SDK的隐私保护与…

配置文件Application.properties

配置文件Application.properties 属性配置配置文件的多种格式yaml的数据格式读取yaml文件中的属性值读取yaml文件中的全部属性yaml文件 数据库的属性 属性配置 在application.properties中添加server.port端口号即可 # 服务器端口配置 server.port80# 修改banner 关闭banner …

两分钟成为 ChatGPT 国内高手【不要再拿ChatGPT当百度用了】

不要再问ChatGPT那些问百度的问题了&#xff0c;有更进阶的用法 更高效的编写prompts&#xff0c;以便ChatGPT给出更精准的回答 但是需要注意的是&#xff1a;国内现在根本没有GPT-4使用&#xff0c;但凡是说有GPT-4的都是骗子。 GPT 可以写文章&#xff0c;可以写诗&#x…

MATLAB实现建筑热平衡模型建立及节能温控方案

全球大约1/3的能源消耗于建筑。在能源紧张的今天&#xff0c;如何减少建筑的能源浪费是一个值得研究的课题。 本文在综合国内外建筑能耗模拟方法的基础上&#xff0c;采用热平衡法&#xff0c;针对一小型建筑建立了热特性仿真模型&#xff0c;选用武汉地区的气象数据&#xff…

快递出入库管理APP开发 收发快递更方便

网购的盛行让收发快递成为很多人日常生活必不可少的一个环节&#xff0c;对于快递公司来说&#xff0c;每天有那么多的快递&#xff0c;如果没有一个好用的管理系统的话&#xff0c;不仅麻烦还很容易出现纰漏&#xff0c;所以快递出入库管理APP软件就显得很必要了。 快递…

【ChatGPT】你会是被AI抢饭碗的那类人吗?

文章目录 前言一、AI替代“基础性工作”&#xff0c;二、AI没有魔法&#xff1a;人类做不到&#xff0c;它也做不到三 人类的恐惧&#xff1a;被替代、被超越四 AI让语言返祖&#xff0c;小语种与文化“濒危灭绝”五 人类的未来&#xff0c;教育何去何从&#xff1f;总结 前言 …

浅谈jmeter性能测试步骤入门

一、Jmeter简介 1 概述 jmeter是一个软件&#xff0c;使负载测试或业绩为导向的业务&#xff08;功能&#xff09;测试不同的协议或技术。 它是 Apache 软件基金会的Stefano Mazzocchi JMeter 最初开发的。 它主要对 Apache JServ&#xff08;现在称为如 Apache Tomca…

[ tool ] Xpath选择器和selenium工具基本使用

XPath xpath介绍 是一门在XML文档中查找信息的语言 html文档准备 doc <html><head><base hrefhttp://example.com/ /><title>Example website</title></head><body><div idimages><a hrefimage1.html aabb>Name: My…

【镜像取证篇】仿真碎片-记一次镜像仿真失败的复盘过程

【镜像取证篇】仿真碎片-记一次镜像仿真失败的复盘过程 这个是很久以前的一个镜像实验&#xff0c;当时仿真可以看到Windows的启动界面&#xff0c;但却一直无法正常进入系统&#xff0c;不断的尝试修复&#xff0c;都是显示错误&#xff0c;最后把类型改为IDE后&#xff0c;成…

Kotlin高级协程

Kotlin高级协程 一.前言二.先从线程说起三.协程的设计思想四.协程特点&#xff1a;优雅的实现移步任务五.协程基本使用六.协程和线程相比有什么特点&#xff0c;如何优雅的实现异步任务 一.前言 在文章正式上干货之前&#xff0c;先说一点背景吧&#xff1b;我是 Kotlin 协程官…

MySQL基础(三)基本的SELECT语句

1. SQL概述 1.1 SQL背景知识 1946 年&#xff0c;世界上第一台电脑诞生&#xff0c;如今&#xff0c;借由这台电脑发展起来的互联网已经自成江湖。在这几十年里&#xff0c;无数的技术、产业在这片江湖里沉浮&#xff0c;有的方兴未艾&#xff0c;有的已经几幕兴衰。但在这片浩…

chatgpt可以降重论文吗-chatgpt降重论文软件

chatgpt可以降重论文吗 ChatGPT是一种自然语言处理技术&#xff0c;可以生成符合指定条件的文本。因此&#xff0c;理论上可以使用ChatGPT来降重论文。但是&#xff0c;需要注意以下几点&#xff1a; 是否符合学术道德要求&#xff1a;学术论文的降重需要严格遵守学术道德准则…

入职6个月,被裁了...

我跟大多数人不大一样&#xff0c;从来没有说要等公司主动裁员拿补偿&#xff0c;我看自己没有什么价值或者是公司不行了&#xff0c;我都会主动离职。但是这次也太突然了。公司很大已上市&#xff0c;并不是不行了&#xff0c;总结原因就是&#xff0c;一是领导无能&#xff0…

Vector - CAPL - CANoe硬件配置函数 - 03

目录 canFlushTxQueue -- 刷新已定义的Tx队列 代码示例 canSetChannelAcc -- CANoe接收过滤器设置 代码示例 canSetChannelMode -- CAN控制器Tx使能/失能 代码示例 canSetChannelOutput -- Ack自应答使能/失能 代码示例 getCardTypeEx -- CAN控制器类型 canFlushTxQue…

springboot+mybatis搭建maven多模块工程

最近看了一篇博客&#xff0c;选定springbootmybatis作为框架&#xff0c;在idea中搭建maven的多模块工程&#xff0c;下面也再温习一下&#xff0c;并将搭建过程分享出来&#xff0c;供小伙伴们参考。 1、开发工具及系统环境 Idea 2020.3系统环境为win10mysql5.7springboot2.…

基于SpringBoot的CSGO赛事管理系统

系统分析 需求分析 CSGO赛事管理系统的作用&#xff0c;可以提高CSGO赛事管理的工作人员的效率&#xff0c;协助他们对CSGO赛事信息进行统一管理&#xff0c;为管理者提供信息储存和查询搜索系统。一个良好的CSGO赛事管理系统可以实现对CSGO赛事信息的精细化管理&#xff1a;…

k8s基础5——Pod常用命令、资源共享机制、重启策略和健康检查、环境变量、初始化容器、静态pod

文章目录 一、基本了解二、管理命令三、yaml文件参数大全四、创建pod的工作流程五、资源共享机制5.1 共享网络5.2 共享存储 六、生命周期重启策略健康检查七、环境变量八、Init Containe初始化容器九、静态Pod 一、基本了解 概念&#xff1a; Pod是一个逻辑抽象概念&#xff0c…

LeetCode4. 寻找两个正序数组的中位数

写在前面&#xff1a; 题目链接&#xff1a;LeetCode4. 寻找两个正序数组的中位数 编程语言&#xff1a;C 题目难度&#xff1a;困难 一、题目描述 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中…

PMP课堂模拟题目及解析(第6期)

51. 管理层将一个国际项目分配给一位新项目经理。这是该项目经理第一次与团队合作&#xff0c;团队成员位于两个国家&#xff0c;数量平均分布&#xff0c;一个团队由最合适作为个人工作的成员组成&#xff0c;另一个团队由最适合作为团队工作的成员组成。项目经理该怎么做&am…

面试题——selenium原理解析、appium原理解析

这里写目录标题 一、selenium原理解析1、目的2、技术点3、Selenium 介绍4、Selenium 自动化测试5、为什么能够支持这么多种浏览器&#xff1f;6、Selenium 工作原理 二、appium原理解析1、目的2、技术点3、Appium 介绍4、Appium 工作原理 一、selenium原理解析 1、目的 了解是…