秒懂C++之进程状态及优先级

news2024/9/25 9:34:34

fe594ea5bf754ddbb223a54d8fb1e7bc.gif

目录

 

一.进程状态

1.1 进程排队

1.2 进程状态

运行状态

阻塞状态

挂起状态

二.Linux环境下的进程状态

R运行状态

S睡眠状态

D磁盘休眠状态

T停止状态

X死亡状态

Z僵尸进程状态

三.进程优先级

基本概念

查看系统进程

用top命令更改已存在进程的nice


一.进程状态

1.1 进程排队

在聊进程状态之前先来聊聊进程排队——队列~

当我们的进程需要排队时,就说明它正在等待某种资源~

就比如上述代码~我们就需要等待键盘输入数据,而这正是硬件资源的等待~

进程排队,那一定是进程的PCB(task_struct)在排队,因为是操作系统在管理排队~

借助排队我们来重新认识PCB,在之前的学习中为了让多个进程组织在一起,我们是直接在结构体内定义一个指向下一位结构体的指针Next~

而实际上为了能让组织后可以适配多种数据结构,我们是像上图这么构建的~在PCB内部放一个结构体struct listnode,里面存放指向下一个与上一个结构体的指针~

实际上PCB中存在很多这种类似struct listnode的结构体,我们通过选择它们的链接方式来组织成对应的数据结构~

就比如在进程排队时,我们就可以让可执行程序指向进程的链表接口(蓝色箭头),这样操作系统就可以利用该数据结构的特性进行数据上的管理~

这是多样性的,往后可执行程序也可以接入链式栈,单链表等等数据结构接口~而我们在进程排队中往往是用数据结构中的队列进行组织管理(因为队列底层就是双向链表),所以这里用双向的结构~

那么问题来了~如果可执行程序指向了结构体处,那么我们前面部分的属性又怎么访问呢?

1.2 进程状态

通常我们对于进程状态的表述一般概况为运行,阻塞以及挂起~

所谓的状态其实就是对应的整型变量,放置在PCB中~

而状态决定了该进程的后续动作~

运行状态

只要处在运行队列中,那就是运行状态~

阻塞状态

如果出现了需要访问硬件资源的时候那么操作系统就会把该PCB移出运行队列链接到底层队列中去~直到我们的硬件资源响应并让操作系统核查后才会移出阻塞队列,重新回到运行队列排队~

挂起状态

因为在阻塞的时候还在等待资源却又占着位置,所以操作系统会把代码与数据唤出拷贝到磁盘的swap分区中,只有等到CPU重新准备调度时才会唤入回来~

在这个过程中PCB是还在内存中的,它要保证呈现该进程的状态~而且创建进程的时候也是先生成PCB,相当于学生档案和学生,学校会在学生入学前通过学生档案获取信息提前管理~

二.Linux环境下的进程状态

R运行状态

R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

我们之所以注释掉printf与sleep是因为我们的代码太短了,cpu处理也就一瞬间的事情,并且printf涉及到硬件设备(显示屏打印)的访问,与外设交流的效率太慢了,也会来不及刷新而一直处于S+休眠状态。 所以我们把这两个因素排除后就是R运行状态了~
  • 有+,代表前台进程,可以用ctrl + c 强制暂停
  • 无+,代表后台进程,不可以用ctrl + c 强制暂停,只能用kill -9杀死进程

S睡眠状态

S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠
(interruptible sleep))。
当我们需要从键盘输入即进程需要访问硬件资源的时候,该进程会进入到阻塞队列中~
所以S睡眠状态就相当于阻塞状态~

D磁盘休眠状态

D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
该状态也被称之为免死金牌~
操作系统会在内存极度拥挤的情况下会选择直接杀掉进程~而D状态就是被标记保护的进程,这时候的操作系统就不会杀掉该进程~
该进程状态也是相当于阻塞状态

T停止状态

T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。

 

我们使用指令kill -19对进程发送停止信号,这时候就会变成停止状态,然后再使用指令kill -18发送启动信号,这时候就会恢复启动,不过状态会变成S转为后台进程~只能用kill -9杀死 

X死亡状态

X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

Z僵尸进程状态

僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲) 没有读取到子进程退出的返回代码时就会产生僵死(尸)进程

这里我们用类比来解释僵尸进程~

假如一个人突然死亡,那么到来的警察并不会立刻处理尸体,而是会封锁现场等待法医来鉴定他的死因~

而我们的进程退出的时候就相当于尸体,代码和数据可以直接释放,因为不会执行~但是它的PCB要缓一下等待其他进程来读取退出的数据(等待法医来鉴定)

那fork函数形成的父进程与子进程举例~

如果子进程在退出的时候父进程不去读取它的数据,那么PCB对象也会一直在内存中,而这都是会占据内存的,最终会导致内存泄漏~

我们一开始只让子进程循环5次后就退出进程,然后父进程一直循环下去但不去获取子进程的退出数据~ 那么这时候的子进程就会变成僵尸进程状态~

如果是父进程先退出呢?(bash会自动读取其进程状态),那么子进程怎么办呢?它总有结束推出的时候,谁去回收它的推出数据呢?

父进程先退出的情况下会由1号进程(操作系统)所领养,最终会由1号进程去获取它的退出数据~

不过被领养后会从前台进程变为后台进程~

而这种情况下的子进程又被称之为孤儿进程~

三.进程优先级

基本概念

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

优先级中数字越小,优先级越高~ 

查看系统进程

linux或者unix系统中,用ps –l命令则会类似输出以下几个内容: 

LINUX下PRI默认优先级都为80~

而我们通常是通过修改nice的数值来改变优先级 

top命令更改已存在进程的nice

  • top
  • 进入top后按“r”–>输入进程PID–>输入nice值

 

优先级是有界限的~

这样nice其实也有界限【-20,19】一旦超出一律按界值处理~

 

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

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

相关文章

【数据结构】十大排序全面分析讲解及其对比分析(排序看懂就这篇!)

【数据结构】十大排序全面分析讲解及其对比分析 🔥个人主页:大白的编程日记 🔥专栏:数据结构 文章目录 【数据结构】十大排序全面分析讲解及其对比分析前言一.排序的概念及其运用1.1排序的概念1.2排序的应用 二.插入排序2.1 插入…

Gather:开启绝密社交和收益双重惊喜之旅

在数字时代,我们的隐私信息面临着严重的泄露风险,保护个人隐私变得尤为重要。基于区块链加专利硬件技术,Gather成为全球唯一实现真正绝密社交的DePIN社交产品,带来了划时代的社交体验。而其硬件产品G-BOX,不仅是你的隐…

Vercel Error: (Azure) OpenAI API key not found

题意:Vercel 错误:(Azure) OpenAI API 密钥未找到 问题背景: I implemented openAI API in my Next.js app with the help of langchain library and it works superb on localhost, but in Vercel (ProVersion) it throws an error: 我使用…

服务器磁盘扩容

一、扫描新硬件 如果通过命令: lsblk 没有看到新增的盘,使用如下命令,扫描新硬件 echo "- - -" > /sys/class/scsi_host/host0/scan二、查看磁盘和物理卷 查看新添加的硬盘设备名和物理卷的属性 fdisk -l pvdisplay下面的sdc是…

第四天博客顶顶顶

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ☁️运维工程师的职责:监…

论软件设计方法及其应写作框架软考高级论文系统架构设计师论文

论文真题 软件设计(Software Design,SD)根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将…

Spring的设计模式----工厂模式及对象代理

一、工厂模式 工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工厂模式,可以将对象的创建与使用代码分离,提供一种统一的接口来创建不同类型的对象。定义一个创建对象的接口让其子类自己决定实例化哪一个工厂类,…

游乐园智慧向导小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,票务信息管理,门票购买管理,路线介绍管理,系统管理 微信端账号功能包括:系统首页,票务信息,路线介绍&#…

Spring Boot 3.x Rest API统一异常处理最佳实践

上一篇:Spring Boot 3.x Rest API最佳实践之统一响应结构 在Spring MVC应用中,要对web表示层所抛出的异常进行捕获处理有多种方式,具体的可参考著名国外Spring技术实战网站baeldung上的相关话题。Spring Boot对Spring MVC应用中抛出的异常以…

【算法设计题】判定给定的二叉树是否为二叉排序树,第7题(C/C++)

目录 第7题 判定给定的二叉树是否为二叉排序树 得分点(必背) 题解:判定给定的二叉树是否为二叉排序树 数据结构定义 判断二叉树是否为二叉排序树 详细解释 1. 空二叉树情况 2. 左右子树都无情况 3. 只有左子树情况 4. 只有右子树情…

【最长递增子序列】python刷题记录

R4-dp 目录 常规方法遇到以下序列时就会变得错误 动态规划的思路 单调栈 ps: class Solution:def lengthOfLIS(self, nums: List[int]) -> int:#最简单的方法nlen(nums)if n<2:return nmx1for i in range(n):max_i1for j in range(i1,n):if nums[i]<nums[j]:nums…

河南萌新联赛2024第(四)场

题目链接&#xff1a;河南萌新联赛2024第&#xff08;四&#xff09;场&#xff1a;河南理工大学_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 1.小雷的神奇电脑 同或概念&#xff1a; • 如果两个输入位相同&#xff0c;则输出为1 • 如果两个输入位不同&#xff…

连接投影仪/显示器只能扩展不能复制的解决方案

原文章&#xff1a;https://iknow.lenovo.com.cn/detail/121481 故障现象&#xff1a; 笔记本外接投影仪/显示器后&#xff0c;笔记本屏幕有显示&#xff0c;但投影仪却只有背景或没有显示&#xff1b; 原因分析&#xff1a; 此现象多发生在双显卡机型上&#xff0c;笔记本屏…

SpringBoot3热部署

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional> </dependency> 默认就是,无需配置 可以了…

【大模型从入门到精通13】openAI API 构建和评估大型语言模型(LLM)应用1

这里写目录标题 构建和评估大型语言模型&#xff08;LLM&#xff09;应用开发性能评估指标从开发到部署高风险应用LLM应用开发的最佳实践和建议从小处着手快速迭代自动化测试根据应用需求定制评估考虑伦理影响 构建和评估大型语言模型&#xff08;LLM&#xff09;应用 开发和部…

低代码开发

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

A股继续底部震荡,探底是否能成功?

真心的给股民朋友提个醒&#xff0c;不管你胆大还是胆怯&#xff0c;盘面上出现了1个反常信号&#xff0c;一起来看看&#xff1a; 1、今天两市低开高走&#xff0c;开始筑底了&#xff0c;任何一个主力&#xff0c;都是在无人问津的熊市布局&#xff0c;而在人声鼎沸的牛市离场…

linux常见性能监控工具

常用命令top、free 、vmsata、iostat 、sar命令 具体更详细命令可以查看手册&#xff0c;这里只是简述方便找工具 整体性能top,内存看free&#xff0c;磁盘cpu内存历史数据可以vmsata、iostat 、sar、iotop top命令 交互&#xff1a;按P按照CPU排序&#xff0c;按M按照内存…

MySQL —— 表的设计

表的设计 在设计表之前&#xff0c;我们需要从需求中获得实体&#xff08;实体就是一张张表&#xff09;&#xff0c;实体的属性就是表中的字段&#xff08;列&#xff09;&#xff0c;然后确定实体与实体之间的关系&#xff0c;最后使用 SQL 语句去创建具体的表 在设计表的时…

JAVA【flowable】流程引擎详解-获取发起流程详情及表单

public WfDetailVo queryProcessDetail(String procInsId, String taskId) {WfDetailVo detailVo = new WfDetailVo();// 获取流程实例HistoricProcessInstance historicProcIns = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInsId).includeP…