Linux——进程概念(进程状态)
目录
进程状态
三态模型
五态模型
七态模型
Example
eg1:阻塞态:等待某种资源的过程
eg2:挂起态
Linux内核源代码
Linux进程状态查看
Linux运行状态
R运行状态(running):
S睡眠状态(sleeping):
D磁盘休眠状态(Disk sleep):
T停止状态(stopped):
kill -19 SIGSTO(暂停stop)
kill -18 SIGCONT(继续continue)
kill -9 SIGKIL(kill)
X死亡状态(dead):
Z(zombie)-僵尸进程:
孤儿进程
进程状态
三态模型
进程状态分为 运行态,就绪态,阻塞态。五态模型
进程状态分为 新建态、终止态,运行态,就绪态,阻塞态。七态模型
进程状态分为 挂起就绪态、挂起等待态、新建态、终止态,运行态,就绪态,阻塞态
Example
eg1:阻塞态:等待某种资源的过程
操作系统对外设的管理先描述再组织,操作系统有对应的结构体对外设进行管理,每个管理外设的结构体都有一个等待队列,这些结构体对需要访问该外设的进程进行管理,而等待的进程就被放入等待队列,进而变成阻塞状态,当相应的外设进行相关的操作,PCB(含有全部的属性和数据)便会被CPU执行进程因为等待某种条件就绪,而导致的一种不推进的状态——进程卡住了阻塞——不被调度——一定是因为当前进程需要等待某种资源(磁盘、网卡、显卡等各种外设)就绪——一定是进程task_struct结构体需要在某种被OS管理的资源下排队为什么阻塞?进程要通过等待的方式,等具体资源被别人用完之后,再被自己使用PCB可以被维护在不同的队列中
资源线性申请
eg2:挂起态
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 */};
Linux进程状态查看
ps aux / ps axj
Linux运行状态
R运行状态(running):
并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
传统意义上新建态、就绪态在Linux中就是R状态
我们来看两段代码
- 含printf的循环
#include <stdio.h>int main() {while(1){printf("我在运行吗??\n");} }//printf 本质就是向外设打印消息,循环打印的过程中外设不会一直处于运行状态,所处理的代码在等待队列中(CPU执行速度非常快)
- 不含printf的纯循环
int main() {while(1){//printf("我在运行吗??\n");} }不含printf的纯循环,只需要进行判断,一个纯计算使用CPU不需要使用外设资源的代码,所以就是R状态
S睡眠状态(sleeping):
意味着进程在等待事件完成(本质是一种阻塞状态)
(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))。
#include <stdio.h>int main() {while(1){int a=0;scanf("%d\n",&a);printf("%d\n",a);//printf("我在运行吗??\n");} }
等待键盘输入,等待键盘资源
D磁盘休眠状态(Disk sleep):
有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
我们来举个例子:假如现在有个进程,想向内存写入一个巨大的数据,磁盘将这些数据进行储存,而该进程等待磁盘工作完成并且在等待队列中等待,该进程S休眠,此时CPU执行其他的代码。此时操作系统路过,看到内存严重不足,并且看到该进程尚未执行,什么都不做,Linux就将其删除,当磁盘写完后,发现家被偷了,为了避免这种情况发生,我们保证在某种状态下,即便是操作系统,该进程在这种状态下也无法被杀死,这种状态即为D磁盘休眠状态
T停止状态(stopped):
可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
#include <stdio.h>2 #include<unistd.h>3 4 int main() 5 { 6 while(1) 7 { 8 // int a=0; 9 // scanf("%d\n",&a); 10 // 11 // printf("%d\n",a); 12 // 13 printf("我在运行吗??,%d\n",count++);14 sleep(1); 15 } 16 }
kill -19 SIGSTO(暂停stop)
kill -18 SIGCONT(继续continue)
但是当我们control C时,仍然执行
注:control C只能中断在前台运行的代码,即我们显示状态的时候后方跟了+号的进程,由此可以解释之前显示状态的时候,为何S+后有一个+号,为了中断进程,不论前台或者后台的我们都可以使用kill -9 PID
kill -9 SIGKIL(kill)
"t (tracing stop)", /* 8 */ 追踪暂停也是暂停的一种,断点处停下来,本质就是进程暂停
X死亡状态(dead):
这个状态只是一个返回状态,你不会在任务列表里看到这个状态
Z(zombie)-僵尸进程:
僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲),没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 ,僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态来维持进程我们创建进程是为了让进程 帮助我们办事,而对于我们操作者而言,我们可能关心结果,也可能不关心结果;当我们是前者的时候,我们可以使用printf来查看结果,但是需要认为校验结果的准确性,我们也可以通过进程退出码来判断,如果一个进程退出了,立马X状态,立马退出,有没有机会拿到退出结果???Linux当进程退出的时候,一般不会立即彻底退出,而是要维持一个状态叫做,也叫做僵尸状态——方便后续父进程(OS)读取该子进程退出的退出结果"X (dead)", /* 16 */"Z (zombie)", /* 32 */如何看到僵尸的状态??子进程退出,但是不要收回子进程int main() {pid_t id =fork();if(id==0){//子进程while(1){printf("我是子进程,我在运行,pid:%d,ppid: %d\n",getpid(),getppid());sleep(1);}}else if(id>0){//父进程while(1){printf("我是父进程,我在运行,pid: %d, ppid: %d\n",getpid(),getppid());sleep(1);}}}
我们kill -9 子进程,发现变成了Z+维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护,僵尸状态资源没回收完,如果一个父进程创建了很多子进程,就是不回收,就是不释放,会使得内存可用的越来越少,因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!不释放涉及内存泄漏等知识
孤儿进程
父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?父进程先退出,子进程就称之为“孤儿进程”父进程退出,子进程就会被OS自动领养(通过让1号进程成为新的父进程)。int main() {pid_t id =fork();if(id==0){//childwhile(1){printf("我是子进程:pid: %d, ppid: %d\n",getpid(),getppid());sleep(1);}}else {//parentint cnt=10;while(1){printf("我是父进程:pid: %d, ppid: %d\n",getpid(),getppid());sleep(1);if(cnt--<=0)break;}}return 0; }父进程的僵尸状态未被看见,因为其被其父进程即bash回收
32516的爹嘎了之后,又给自己找了一个爹,PPID为1
为什么领养?如果不领养,子进程后续再退出,无人回收,游离的进程多了,占据更多的内存空间。
并且我们可以看到,领养之前,子进程S+前台运行,领养之后,自动由前台变为后台运行,如果想杀掉该进程
- kill -9 PID
- killall myproc(进程名称)
相关文章:
Linux——进程概念(进程状态)
目录 进程状态 三态模型 五态模型 七态模型 Example eg1:阻塞态:等待某种资源的过程 eg2:挂起态 Linux内核源代码 Linux进程状态查看 Linux运行状态 R运行状态(running): S睡眠状态(sleeping): D磁盘休眠状…...
超详细:正则表达式从入门到入门
文章目录匹配字符\d \D\s \S量词:匹配多个字符星号*加号问号?大括号{}集合字符[]明确字符范围字符补集字符常见字符集贪婪模式和非贪婪模式匹配开头和结尾贪婪模式和非贪婪模式常用函数re.findall()re.search()re.compile()re.split()re.sub()本文章首发…...
jupyter notebook小技巧
1、.ipynb 文件转word文档 将 jupyter notebook(.ipynb 文件)转换为 word 文件(.docx)的最简单方法是使用 pandoc。 首先安装pip install pandoc, 安装后,在将 Jupyter notebook文件目录cmd 然后输入打开…...
考研复试机试 | c++ | 王道复试班
目录n的阶乘 (清华上机)题目描述代码汉诺塔问题题目:代码:Fibonacci数列 (上交复试)题目代码:二叉树:题目:代码:n的阶乘 (清华上机) …...
js闭包简单理解
js里面的闭包是一个难点也是它的一个特色,是我们必须掌握的js高级特性,那么什么是闭包呢?它又有什么作用呢? 1,提到闭包我们这里先讲解一下js作用域的问题 js的作用域分两种,全局和局部,基于我…...
「JVM 编译优化」编译器优化技术
后端编译(即时编译、提前编译)的目标时将字节码翻译成本地机器码,而难点是输出优化质量较高的机器码; 文章目录1. 优化技术概览2. 方法内联(Inlining)3. 逃逸分析(Escape Analysis)4…...
回溯问题(子集型回溯、组合型回溯、排列型回溯)【零神基础精讲】
来源0x3f:https://space.bilibili.com/206214 回溯分为【子集型回溯】【组合型回溯】【排列型回溯】 文章目录回溯基本概念[17. 电话号码的字母组合](https://leetcode.cn/problems/letter-combinations-of-a-phone-number/)子集型回溯(分割问题也可以看…...
源代码配置安装Apache
源代码配置安装Apache 📒博客主页: 微笑的段嘉许博客主页 💻微信公众号:微笑的段嘉许 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由微笑的段嘉许原创! …...
css水平垂直居中各种方法实现方式
不定宽高水平垂直居中? 面试题回答方式: 通过display:flex;justify-content:center; align-items:center;就可以让子元素不定宽高水平垂直居中 也可以父display:flex;,子设置一个margin&#…...
PowerShell Install java 13
java 前言 Java具有大部分编程语言所共有的一些特征,被特意设计用于互联网的分布式环境。Java具有类似于C语言的形式和感觉,但它要比C语言更易于使用,而且在编程时彻底采用了一种以对象为导向的方式。 java download javadownloadPowersh…...
Python的PyQt框架的使用(汇总)
Python的PyQt框架的使用一、前言二、安装PyQt三、使用第三方开发工具四 、创建主窗体五、常用控件篇1.QLineEdit 文本框2.QPushButton按钮控件3.QRadioButton 单选按钮六、布局管理篇1.通过布局管理器布局2.绝对布局七、信号与槽的关联1.编辑信号/槽2.信号/槽编辑器八、资源文件…...
力扣热题100Day05:15.三数之和,17. 电话号码的字母组合,19. 删除链表的倒数第 N 个结点
15.三数之和 题目链接:15. 三数之和 - 力扣(Leetcode) 思路: (1)双指针,在外层for循环里加入两个指针,left和right (2)排序:为了更好地进行去…...
探索开源:获取完整的 GitHub 社区数据集
本篇文章聊聊 GitHub 开放数据集的获取和整理,分享一些数据整理的细节技巧,以及一些相对粗浅的数据背后的事情。 写在前面 分析 GitHub 上的项目和开发者获取是深入、真实的了解开源世界演进的方法之一。 在 GHArchive 项目中,我们能够看到…...
github ssh密钥配置,克隆远程仓库
GitHub的SSH配置 在往github上push项目的时候,如果走https的方式,每次都需要输入账号密码,非常麻烦。而采用ssh的方式,就不再需要输入,只需要在github自己账号下配置一个ssh key即可! 很多朋友在用github管…...
突破年薪百万难关!吃透这套Java真题合集
前言我相信大多 Java 开发的程序员或多或少经历过BAT一些大厂的面试,也清楚一线互联网大厂 Java 面试是有一定难度的,小编经历过多次面试,有满意的也有备受打击的。因此呢小编想把自己这么多次面试经历以及近期的面试真题来个汇总分析&#x…...
[黑马程序员SSM框架教程] Spring-11-setter注入
思考:向一个类中传递数据要几种? set方法构造方法 思考:依赖注入描述了在容器中建立bean与bean之间依赖关系的过程,如果bean运行需要数字或字符呢 引用类型简单类型(基本数据类型和字符串) 注入方式&#x…...
Java多线程(一)--多线程基础知识
1. 为什么要使用并发编程提升多核CPU的利用率:一般来说一台主机上的会有多个CPU核心,我们可以创建多个线程,理论上讲操作系统可以将多个线程分配给不同的CPU去执行,每个CPU执行一个线程,这样就提高了CPU的使用效率&…...
AutoDock, AutoDock-vina等对接工具安装
AutoDock, AutoDock-vina等对接工具安装 AutoDock-GPU安装 下载地址: https://autodock.scripps.edu/downloads/ 将压缩包传送至安装目录中,并解压到当前路径 unzip AutoDock-GPU-develop.zip 找到服务器的cuda的路径,cuda的路径一般默认…...
MySQL常见面试题(2023年最新)
目录1.char和varchar的区别2.数据库的三大范式3.索引是什么4.索引的优点和缺点5.索引怎么设计(优化)6.索引的类型7.索引的数据类型8.索引为什么使用树结构9.二叉查找树、B树、B树10.为什么使用B树不用B树11.最左匹配原则12.MylSAM和InnoDB的区别13.什么是事务14.事务的四大特性…...
C# 泛型详解
C# 泛型详解1、泛型概述2、定义泛型3、泛型的特性4、泛型委托5、泛型的优点在 C# 中,泛型(Generic)是一种规范,它允许我们使用占位符来定义类和方法,编译器会在编译时将这些占位符替换为指定的类型,利用泛型…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...
SQL注入篇-sqlmap的配置和使用
在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap,但是由于很多朋友看不了解命令行格式,所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习,链接:https://wwhc.lanzoue.com/ifJY32ybh6vc…...













