当前位置: 首页 > news >正文

Linux进程学习【二】

✨个人主页: Yohifo
🎉所属专栏: Linux学习之旅
🎊每篇一句: 图片来源
🎃操作环境: CentOS 7.6 阿里云远程服务器

  • Perseverance is not a long race; it is many short races one after another.

    • 毅力不是一场漫长的比赛;是许多短跑一个接一个。

    四姑娘山


文章目录

  • 📘前言
  • 📘正文
    • 📖阻塞
    • 📖挂起
    • 📖进程状态
      • 🖋️运行 R
      • 🖋️睡眠 S
      • 🖋️休眠 D
      • 🖋️暂停 T
      • 🖋️死亡 X
      • 🖋️僵尸 Z
  • 📘总结


📘前言

进程 只有被OS管理好了,才能发挥它的全部功效,而系统中存在多个 进程,OS无法做到面面俱到,因此为了更好的管理进程,OS把 进程 分成了几种状态:阻塞、挂起、运行、休眠等等,至于每种状态的应用场景是什么、有什么用?本文将会带着大家认识的各种 进程 状态

进程状态


📘正文

在谈 进程状态 之前,首先要回顾下之前的 进程 相关知识

  • OS管理的本质是先描述,再组织
  • OS并非直接管理 进程 ,而是管理 进程PCB(task_struct)
  • PCB 中有着进程的各种信息,包括:PIDPPID进程状态
  • 我们可以通过函数 getpid() 获取当前进程的 PID
  • 进程 间存在父子关系,可以通过 fork() 主动创建 子进程
  • 父子进程 相互独立,共享一份代码时,具有 写时拷贝 机制

📖阻塞

何为阻塞?

  • 阻塞 就是 进程 因等待某种条件就绪,而导致的一种不推进状态
  • 通俗来说,阻塞 就是 进程 卡住了,原因就是缺少资源

比如在我们日常生活中,常常发生堵车,原因就是道路资源不够用了,车辆这个 进程 就需要原地等待
堵车
那么进程需要什么资源呢?

  • 比如 磁盘网卡显卡 等各种外设
  • 假设你现在想在 steam 上下载游戏,当你点击下载按钮后提示磁盘空间不足,此时是无法运行 steam下载 这个进程的,因为此 进程 需要等待足够大的 磁盘资源
  • 此时我们就称此 进程阻塞 状态

阻塞
总结

  • 进程阻塞就是不被调度

原因

  • 进程的 task_struct 结构体需要在某种被 OS 管理的资源下排队

📖挂起

理解 进程阻塞 后,理解 进程挂起 就比较轻松了

挂起(阻塞挂起)

  • CPU 资源紧张时,将 进程 交换至 磁盘 中挂起,此时内存中只有 PCB

挂起可以看作一种特殊的阻塞状态

比如在我们生活中,一边走路一边玩手机很危险,所以此时我们会将玩手机这个 进程挂起 ,即把手机揣进兜里,然后 专心执行走路这个 进程
走路玩手机

📖进程状态

进程 有各种运行状态,方便OS进行管理,在 Windows 中,进程 状态是这样的
Win
而在我们 Linux 中,新建就绪运行都可以看作 运行 R 这一个状态,所以比较清晰

Linux
而我们今天要学习的正是 Linux 中的 进程 状态

进程是何种状态,取决于此进程的PCB在哪里排队

🖋️运行 R

首先来看看第一种状态 R
以我们以往的认知来说,一个程序在运行就表示该 进程 处于 运行 状态,那么事实真的如此吗?

先来看看下面这段代码:

#include<iostream>
using namespace std;#include<unistd.h>
#include<sys/types.h>int main()
{while(1){cout << "I'm a process, my PID is:" << getpid() << endl;sleep(1);}return 0;
}

当前 Makefile 文件为

myProcess:test.cppg++ -o myProcess test.cpp.PHONY:catPI
catPI:ps ajx | head -1 && ps ajx | grep myProcess | grep -v grep .PHONY:clean
clean:rm -r myProcess

通过 make catPI 指令调用 Makefile 中提前设定好的指令,查看当前进程信息
进程演示
睡眠

可以看到当前的进程状态为 睡眠 S+
注: + 表示当前进程在前台运行中

进程 难道没有运行吗?

  • 运行了,但我们 很难捕捉到
  • 对于 CPU 来说,将这么简单的一句话输出到屏幕上是一件很小的事,可能几毫秒就完成了
  • 而其他大多数时间,进程 都在外设等待队列中 排队
  • 当我们将打印语句和睡眠语句屏蔽后,进程 不用在等待队列中 排队, CPU 就一直在处理死循环,此时可以观察到 运行 R 状态

运行状态
此时进程 myProcess 就在运行中

注意: R 表示此时 进程 已经在 运行队列 中排队了,但 进程 不一定在 CPU 上运行

🖋️睡眠 S

睡眠 S 的本质就是 进程阻塞,表示此时进程因等待某种资源而暂停运行;睡眠 S 又称为可中断休眠,当 进程 等待时间过长时,我们可以手动将其关闭,应用卡死后强制关闭也是这个道理

睡眠状态
还有一种方式终止进程:kill

  • kill -9 PID 终止进程,当进程在后台运行时(状态不加 +),我们是无法通过 ctrl+c 终止的,但 kill 指令可以终止
  • kill

🖋️休眠 D

还存在一种特殊睡眠状态 休眠 D休眠 又被称为不可中断休眠,顾名思义,休眠 D 状态下的 进程 是无法终止的,kill 指令和 OS都无能为力,只能默默等待 进程阻塞 结束,拿到资源了,进程 才会停止 休眠 D 状态

终止 休眠 D 进程的一个方法就是切断电源,此时进程是结束了,但整个系统也结束了

倘若存在 休眠 D 进程长时间运行,那么此时就表示系统离宕机不远了

不可休眠状态比较少见,一般出现于IO阻塞

用途:

  • 使操作系统无法杀死该 进程,预防误杀现象

🖋️暂停 T

我们还可以使 进程 进入 暂停 T 状态

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

进程暂停
进程暂停
我们可以通过 kill -18 PID 使 进程 恢复运行,恢复后的 进程 在后台运行
进程恢复
注意: 进程 在后台运行时,是无法通过 ctrl+c 指令终止的,只能通过 kill -9 PID 终止

gdb 中调试代码时,打断点实际上就是 使 进程 在指定行暂停运行,此时 进程 处于 追踪暂停状态 t

🖋️死亡 X

当进程被终止后,就处于 死亡 X 状态

死亡状态是无法在任务列表中观察到的,死亡 X 状态只是一个返回状态

🖋️僵尸 Z

与死亡状态相对应的还有一个 僵尸 T 状态

  • 通俗来说,僵尸状态 是给 父进程 准备的
  • 子进程 被终止后,会先维持一个 僵尸 状态,方便 父进程 来读取到 子进程 的退出结果,然后再将 子进程 回收
  • 单纯的在 bash 环境下终止 子进程,是观察不到 僵尸状态 的,因为 bash 会执行回收机制,将 僵尸 回收
  • 我们可以利用 fork() 函数自己创建 父子进程 关系,观察到这一现象
#include<iostream>
using namespace std;#include<unistd.h>
#include<sys/types.h>int main()
{pid_t ret = fork();if(ret == 0){while(1){cout << "I'm son process, my PID: " << getpid() << " PPID: " << getppid() << endl;sleep(1);}}else if(ret > 0){while(1){cout << "I'm father process, my PID: " << getpid() << " PPID: " << getppid() << endl;sleep(1);}}else{while(1){cout << "Make son process fail!" << endl;sleep(1);}}return 0;
}

运行结果
进程状态

此时输入指令 kill -9 PIDkill -9 28315 终止 子进程
再次查看进程状态:
僵尸
僵尸进程如果不被回收,会导致内存泄漏问题和标识符占用问题
关于 僵尸进程 的更多信息,将会在下篇文章中介绍


📘总结

以上就是关于进程学习【二】的全部内容了,我们简单学习了 进程 的相关状态,知道了何为 阻塞进程 为什么 阻塞 的缘由,同时还见识了 进程 的各种状态,为以后 进程 进一步学习和控制打下了基础

如果你觉得本文写的还不错的话,期待留下一个小小的赞👍,你的支持是我分享的最大动力!

如果本文有不足或错误的地方,随时欢迎指出,我会在第一时间改正


星辰大海

相关文章推荐
Linux进程学习【一】
Linux工具学习之【gdb】
Linux工具学习之【git】
Linux工具学习之【gcc/g++】
Linux工具学习之【vim】
Linux 权限理解和学习

感谢支持

相关文章:

Linux进程学习【二】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f38a;每篇一句&#xff1a; 图片来源 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 Perseverance is not a long race; it is many short races one after another…...

我问chatGPT,在JavaScript中构造函数和类的区别

问&#xff1a;构造器函数和面向中的类是同样的东西吗|&#xff1f; 答&#xff1a;构造器函数和面向对象中的类并不是同样的东西&#xff0c;它们之间有些许不同。 在面向对象编程中&#xff0c;类是一种抽象的概念&#xff0c;它描述了一类具有相同属性和行为的对象。类可以…...

软考高级-信息系统管理师之沟通管理(最新版)

项目沟通管理 1、项目沟通管理基础项目沟通管理的重要性项目沟通管理相关理论2、规划沟通管理3、管理沟通4、控制沟通项目沟通管理的技术和工具1、项目沟通管理基础 项目沟通管理的重要性 1、与1T项目成功有关的最重要的四个因素是:主管层的支持、用户参与、有经验的项目经理…...

PyQt5 自定义富文本编辑器

介绍 一款使用PyQt5和网页端框架wangEditor集成的富文本编辑器 代码片段 PyQt5客户端 与网页端建立连接def create_connect(self):self.web_view QWebEngineView()self.bridge JSBridge(self.web_view.page())self.web_view.load(QUrl.fromLocalFile(self.editor_path))w…...

【高可用系统架构设计】SLA服务可用性4个9是什么意思?如何保证服务的高可用性 HA(High Availability)?...

如何保证服务的高可用性 HA&#xff08;High Availability&#xff09;?高可用HA&#xff08;High Availability&#xff09;是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。方法论上&#xff0c;高可用是通…...

微服务架构设计模式-(14)面向生产环境

生产环境要求 应用安全 数据权限 服务可配置性 不同环境的配置不一样&#xff0c;不能写死代码&#xff0c;所以要配置 可观测性 需要日志系统 应用安全 四个方面 身份验证 验证主体的身份解决方案 单体 cookie 微服务中 API Gateway 访问令牌 不透明令牌透明令牌&#xff…...

HTML5新增用法

新增语义化标签 并无特殊含义&#xff0c;是语义&#xff01;语义&#xff01;语义&#xff01; <header> 头部区域 <nav> 导航区域 <main> 主体区域 <article> 内部标签 <section> 块级标签 <aside> 侧边栏标签 <footer> 尾部…...

富足金字塔:人的努力是为了扩大选择的范围

人的努力是为了扩大选择的范围&#xff0c;这是熵减的另一种表述。富足金字塔代表着人生的三重境界。第一层是温饱。人需要食物、水、住所。第二层是品质。能源、ICT、教育带来更有品质的生活&#xff0c;如智能门锁、智能马桶、扫地机、洗碗机、洗衣烘衣机。第三层是梦想。包括…...

C++类基础(十七)

类的继承——补充知识 ● public 与 private 继承&#xff08;C Public, Protected and Private Inheritance&#xff09; 改变了类所继承的成员的访问权限 //公有继承 struct Base { public:int x; private:int y; protected:int z; }; struct Derive : public Base //公有继承…...

LeetCode刷题复盘笔记—一文搞懂贪心算法之56. 合并区间(贪心算法系列第十四篇)

今日主要总结一下可以使用贪心算法解决的一道题目&#xff0c;56. 合并区间 题目&#xff1a;56. 合并区间 Leetcode题目地址 题目描述&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间…...

Andriod入门级开发

这学期有个课设&#xff0c;我们组我负责一个手机APP的开发&#xff0c;虽然刚开始说要实现什么智能导航&#xff0c;类似高德地图那种&#xff0c;但最后阉割的只剩一个Socket通信了&#xff0c;因为之前没有接触过&#xff08;可能之后也不会再接触&#xff09;&#xff0c;记…...

DCL 数据控制语言

1、简介 DCL英文全称是Data Control Language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 2、管理用户 2.1 查询用户 select * from mysql.user;查询的结果如下: 其中 Host代表当前用户访问的主机, 如果为localhost, 仅代表只能够在当前本机访问…...

全网超详细的下载与安装VMware虚拟机以及为什么要安装VMware虚拟机

文章目录1. 文章引言2. 下载VMware3. 安装VMware1. 文章引言 我们使用最多的系统是windows系统&#xff0c;因为&#xff0c;国内电脑厂商的操作系统(os)基本是windows系统&#xff0c;比如华为、联想、华硕等电脑。 但线上的服务器大多是Linux系统&#xff0c;而我们经常使用…...

Python获取zabbix问题触发器

背景&#xff1a;阿里云的ECS服务器因为阿里云升级插件&#xff0c;导致安全防护程序重启&#xff0c;产生不同的端口。导致低自动发现注册的端口 大量报警。 解决&#xff1a;杀掉关于因为非业务 变更的端口检测的触发器。 相关文档&#xff1a; Zabbix监控之主机端口监控自…...

原型链污染

目录 前置知识 原型对象 prototype和__proto__的区别 原型链概念 原型链的继承 原型 链污染 原型链污染原理 javascript中可能会存在原型链污染的危险函数 原型链污染的实际应用 JavaScript中可以触发弹窗的函数 前置知识 原型对象 在JavaScript中&#xff0c;每个函…...

ClickHouse详解

一、概念ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。OLAP场景的关键特征绝大多数是读请求数据以相当大的批次(> 1000行)更新&#xff0c;而不是单行更新;或者根本没有更新。已添加到数据库的数据不能修改。对于读取&#xff0c;从数据库中提取相当多的…...

02_Docker 安装

02_Docker 安装 文章目录02_Docker 安装2.1 安装 Docker 的先决条件2.2 在 Ubuntu 和 Debain 中安装 Docker2.2.1 检查前提条件1. 内核2.检查 Device Manager2.2 安装 DockerDocker 支持非常多的Linux平台&#xff0c;包括Ubuntu和RHEL&#xff0c;除此之外&#xff0c;Docker还…...

K8S集群将Docker切换到Containerd

文章目录1. 开启节点维护1.1 将节点设置成不可调度1.2 驱逐节点上的 Pod1.3 停止相关服务2. 升级到 containerd2.1 安装 containerd2.2 调整 containerd 配置2.3 修改 kubelet 启动配置参数3. 重启节点服务4. 验证升级后的节点5. 容器管理工具5.1 容器管理命令行工具对比5.2 cr…...

Kubernetes03:kubernetes 功能和架构

2.1 概述 Kubernetes 是一个轻便的和可扩展的开源平台&#xff0c;用于管理容器化应用和服务。通过 Kubernetes 能够进行应用的自动化部署和扩缩容。在 Kubernetes 中&#xff0c;会将组成应用的容 器组合成一个逻辑单元以更易管理和发现。Kubernetes 积累了作为 Google 生产环…...

LabVIEW中CPU和内存使用情况在NI分布式系统管理器中不可见

LabVIEW中CPU和内存使用情况在NI分布式系统管理器中不可见想使用NI分布式系统管理器监测网络连接实时控制器的CPU和内存使用情况。从左侧窗口的树中选择了感兴趣的实时目标&#xff0c;然后通过选择视图自动视图来确保启用自动查看。希望看到CPU/内存选项卡&#xff0c;但它有显…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...