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
中有着进程的各种信息,包括:PID
、PPID
、进程状态
等- 我们可以通过函数
getpid()
获取当前进程的PID
进程
间存在父子关系,可以通过fork()
主动创建子进程
父子进程
相互独立,共享一份代码时,具有写时拷贝
机制
📖阻塞
何为阻塞?
阻塞
就是进程
因等待某种条件就绪,而导致的一种不推进状态- 通俗来说,
阻塞
就是进程
卡住了,原因就是缺少资源
比如在我们日常生活中,常常发生堵车,原因就是道路资源不够用了,车辆这个 进程
就需要原地等待
那么进程
需要什么资源呢?
- 比如
磁盘
、网卡
、显卡
等各种外设 - 假设你现在想在
steam
上下载游戏,当你点击下载按钮后提示磁盘空间不足,此时是无法运行steam下载
这个进程的,因为此进程
需要等待足够大的磁盘资源
- 此时我们就称此
进程
为阻塞
状态
总结
- 进程阻塞就是不被调度
原因
- 进程的 task_struct 结构体需要在某种被 OS 管理的资源下排队
📖挂起
理解 进程阻塞
后,理解 进程挂起
就比较轻松了
挂起(阻塞挂起)
- 当
CPU
资源紧张时,将进程
交换至磁盘
中挂起,此时内存中只有PCB
挂起可以看作一种特殊的阻塞状态
比如在我们生活中,一边走路一边玩手机很危险,所以此时我们会将玩手机这个 进程挂起
,即把手机揣进兜里,然后 专心执行走路这个 进程
📖进程状态
进程
有各种运行状态,方便OS进行管理,在 Windows
中,进程
状态是这样的
而在我们 Linux
中,新建
、就绪
、运行
都可以看作 运行 R
这一个状态,所以比较清晰
而我们今天要学习的正是 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
指令可以终止
🖋️休眠 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 PID
即 kill -9 28315
终止 子进程
再次查看进程状态:
僵尸进程如果不被回收,会导致内存泄漏问题和标识符占用问题
关于 僵尸进程
的更多信息,将会在下篇文章中介绍
📘总结
以上就是关于进程学习【二】的全部内容了,我们简单学习了 进程
的相关状态,知道了何为 阻塞
、进程
为什么 阻塞
的缘由,同时还见识了 进程
的各种状态,为以后 进程
进一步学习和控制打下了基础
如果你觉得本文写的还不错的话,期待留下一个小小的赞👍,你的支持是我分享的最大动力!
如果本文有不足或错误的地方,随时欢迎指出,我会在第一时间改正
…
相关文章推荐
Linux进程学习【一】
Linux工具学习之【gdb】
Linux工具学习之【git】
Linux工具学习之【gcc/g++】
Linux工具学习之【vim】
Linux 权限理解和学习
![]()
相关文章:

Linux进程学习【二】
✨个人主页: Yohifo 🎉所属专栏: Linux学习之旅 🎊每篇一句: 图片来源 🎃操作环境: CentOS 7.6 阿里云远程服务器 Perseverance is not a long race; it is many short races one after another…...
我问chatGPT,在JavaScript中构造函数和类的区别
问:构造器函数和面向中的类是同样的东西吗|? 答:构造器函数和面向对象中的类并不是同样的东西,它们之间有些许不同。 在面向对象编程中,类是一种抽象的概念,它描述了一类具有相同属性和行为的对象。类可以…...

软考高级-信息系统管理师之沟通管理(最新版)
项目沟通管理 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(High Availability)?高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。方法论上,高可用是通…...
微服务架构设计模式-(14)面向生产环境
生产环境要求 应用安全 数据权限 服务可配置性 不同环境的配置不一样,不能写死代码,所以要配置 可观测性 需要日志系统 应用安全 四个方面 身份验证 验证主体的身份解决方案 单体 cookie 微服务中 API Gateway 访问令牌 不透明令牌透明令牌ÿ…...
HTML5新增用法
新增语义化标签 并无特殊含义,是语义!语义!语义! <header> 头部区域 <nav> 导航区域 <main> 主体区域 <article> 内部标签 <section> 块级标签 <aside> 侧边栏标签 <footer> 尾部…...

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

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

LeetCode刷题复盘笔记—一文搞懂贪心算法之56. 合并区间(贪心算法系列第十四篇)
今日主要总结一下可以使用贪心算法解决的一道题目,56. 合并区间 题目:56. 合并区间 Leetcode题目地址 题目描述: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间…...

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

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

全网超详细的下载与安装VMware虚拟机以及为什么要安装VMware虚拟机
文章目录1. 文章引言2. 下载VMware3. 安装VMware1. 文章引言 我们使用最多的系统是windows系统,因为,国内电脑厂商的操作系统(os)基本是windows系统,比如华为、联想、华硕等电脑。 但线上的服务器大多是Linux系统,而我们经常使用…...

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

原型链污染
目录 前置知识 原型对象 prototype和__proto__的区别 原型链概念 原型链的继承 原型 链污染 原型链污染原理 javascript中可能会存在原型链污染的危险函数 原型链污染的实际应用 JavaScript中可以触发弹窗的函数 前置知识 原型对象 在JavaScript中,每个函…...
ClickHouse详解
一、概念ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。OLAP场景的关键特征绝大多数是读请求数据以相当大的批次(> 1000行)更新,而不是单行更新;或者根本没有更新。已添加到数据库的数据不能修改。对于读取,从数据库中提取相当多的…...
02_Docker 安装
02_Docker 安装 文章目录02_Docker 安装2.1 安装 Docker 的先决条件2.2 在 Ubuntu 和 Debain 中安装 Docker2.2.1 检查前提条件1. 内核2.检查 Device Manager2.2 安装 DockerDocker 支持非常多的Linux平台,包括Ubuntu和RHEL,除此之外,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 是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。通过 Kubernetes 能够进行应用的自动化部署和扩缩容。在 Kubernetes 中,会将组成应用的容 器组合成一个逻辑单元以更易管理和发现。Kubernetes 积累了作为 Google 生产环…...

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

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...