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)是一种规范,它允许我们使用占位符来定义类和方法,编译器会在编译时将这些占位符替换为指定的类型,利用泛型…...

数据仓库相关术语
数据仓库数据集市事实维度级别数据清洗数据采集数据转换联机分析处理(OLAP OnlineAnalytical Processing )切片切块星型模式雪花模式粒度度量度量值口径指标 原子指标:派生指标衍生指标标签自然键持久键代理键退化维度下钻上卷T0与T1数据挖掘数据科学家总线架构总线…...

【IDEA】常用快捷键
代码补全 快捷键说明sout快速输出System.out.println();psvm快速输出public static void main(String[] args) {}Ctrl Alt Space代码补全 编辑类 快捷键说明Shift Enter向下键入一行,并将光标移到下一行的开头Ctrl Alt Enter当前行上方生成空行,并…...

【调试】sysRq按键使用方法
SysRq键简介 SysRq键是一个魔术案件,只要在内核没有完全卡死的情况下,内核都会相应SysRq 键的输入,使用这些组合键都可以搜集包括系统内存使用、CPU任务处理、进程运行状态等系统运行信息。 配置 内核配置选项中要使能CONFIG_MAGIC_SYSRQ选…...

Jenkins Pipeline 语法
官网 ## https://www.jenkins.io/doc/book/pipeline/ 参考文章 ## https://www.jianshu.com/p/215584419f3d 根据Jenkins官网Pipeline给出的解释, 流水线语法分为两种, 一种是声明式流水线(Declarative Pipeline)另一种是脚本…...

rust语言实现超级简单的杀毒软件,通过哈希扫描病毒。
以下是一个简单的rust语言程序,用于扫描病毒文件并使用哈希表进行比较。该程序可以扫描指定目录中的所有文件,并查找其中是否包含特定的病毒文件。程序可以通过计算文件哈希值并将其与已知的病毒哈希值进行比较来确定文件是否是病毒。注意,这…...

Git仓库中的常用命令
1.第一次使用Git软件前,告诉Git你是谁 git config --global user.name "自定义用户名" git config --global user.email "用户邮箱" 2.查看配置列表 git config --list 3.初始化一个Git仓库,用来管理当前项目 git i…...

arduino和stm32和51和TSM32的区别,树莓派和jetson nano的区别
本科时段接触过很多嵌入式的微处理器和微控制器,但对其使用场景和区别一直没有一个总结,这次收集了一些信息在这总结一下。 Arduino、STM32、51、TMS320和树莓派和jetson nano都是不同的嵌入式系统,它们之间有以下的区别: 开发难度…...

如何进行nginx的负载配置
示例://多机负载策略:加权轮询(适用于服务器无状态,并且服务器硬件配置不均衡的场景)upstream setServ { server 47.100.110.58:80 weight1; server 47.100.110.59:8080 weight4; }location / {//转发到负载服务上proxy_pass http://setServ;}注意&#…...

从功能测试进阶自动化测试,熬夜7天整理出这一份3000字超全学习指南
一、为什么要学习自动化测试? 如果在前两年,可能10个测试员有6个都是做的功能测试,但随着测试技术的发展以及测试工作的深入,传统的手工测试已经无法满足多模块的测试需求,所以为了提高测试效率和测试质量,…...

[NOIP2011 提高组] 铺地毯
[NOIP2011 提高组] 铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n 张地毯,编号从 1 到 n。现在将这些地毯按照编号从小到大的顺序平行于…...