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

[Linux]进程状态

[Linux]进程状态

文章目录

  • [Linux]进程状态
    • 进程状态的概念
    • 阻塞状态
    • 挂起状态
    • Linux下的进程状态
    • 孤儿进程

进程状态的概念

了解进程状态前,首先要知道一个正在运行的进程不是无时无刻都在CPU上进行运算的,而是在操作系统的管理下,和其他正在运行的进程轮流循环使用CPU,而操作系统管理进程是否需要放到CPU上进行计算,所依据的就是进程状态。

阻塞状态

阻塞状态是进程因为等待某种资源就绪,而导致的一种不推进的状态。

阻塞状态从主观上给人的感觉就是进程“卡”住了,比如进程在下载某一个软件过程中,网络断了,进程下载软件的过程就会"卡"住,进程需要等待网络这种资源就绪,才能继续推进。因此进程处于阻塞状态时,一定是在等待某种资源。进程进入阻塞状态是想要通过等待的方式,等具体的资源被别人使用完后,给自身使用。

由于操作系统要管理各种各样的硬件,因此操作系统需要用某种结构的描述硬件,然后为了方便管理要将这些结构组织起来,描述这些硬件时,会有一个描述信息就是等待队列,这个队列会记录正在等待当前硬件资源的进程的PCB,操作系统就是通过这样的大致原理实现的让进程进入阻塞状态:

image-20230804144704352

挂起状态

挂起状态是进程等待某种资源就绪时,操作系统系统将进程在内存中的代码和数据释放的状态。

挂起状态下进程的PCB还在硬件的等待队列上,操作系统认为进程等待的资源需要很长时间才会准备就绪时,就会释放进程在内存中的代码和数据,让多出来的内存空间用于做其他的事情,提高内存的利用率,当进程等待的资源准备就绪后,操作系统就会把进程的代码和数据再加载到内存中,将进程启动起来。

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下的进程会在task_struct设置一个变量来记录进程状态。

R状态

R状态就是运行状态,说明进程的task_struct在操作系统中的运行状态等待队列之中,在操作系统轮循执行处于运行状态的进程的代码的过程中,被执行。

注意: 运行状态的进程不代表一直都在CPU上执行,而是和其他处于运行状态的进程一样,轮循的被执行。

为了验证R状态,编写如下代码:

#include <stdio.h>int main()
{while(1){}return 0;
}

在Linux系统下运行程序并查看进程状态:

image-20230823170847439

由于这段代码的执行不需要任何资源,不会进入阻塞状态,因此会一直保持运行状态。

S状态

S状态是可中断休眠状态,可中断休眠状态是Linux系统中阻塞状态的一种。

为了验证S状态,编写如下代码:

#include <stdio.h>int main()
{while(1){printf("hello world\n");}return 0;
}

在Linux系统下运行程序并查看进程状态:

image-20230823171246424

在这段代码中虽然程序是一个死循环操作,但是由于循环结构的代码运行很快,而将数据打印到屏幕上很慢,因此造成了程序运行时,大部分的时候都是在等待打印屏幕的资源,因此查询状态时大部分时间查询到的都是S状态。另外可中断休眠状态下的进程可以选择输入ctrl+z终止进程。

D状态

D状态是不可中断休眠状态,不可中断休眠状态是Linux系统中阻塞状态的一种。

D状态是在进程将数据从内存传输到磁盘时,磁盘的压力过大,导致传输数据的速度很慢,进程必须等待数据传输完成处于休眠状态,为了避免操作系统将这个处于休眠状态的进程杀死,因此将进程设置成不可中断休眠状态。D状态不是一种常见的状态,如果进程处于D状态一般说明计算机磁盘压力过大。

T状态

T状态是暂停状态,暂停状态下进程不再继续运行。

为了验证T状态,编写如下代码:

#include <stdio.h>
#include <unistd.h>int main()
{int i = 1;while(1){printf("hello world %d\n", i);i++;sleep(1); //Linux系统提供的休眠函数,头文件是unistd.h}return 0;
}

在Linux系统下运行程序使用kill -19 进程id暂停进程并查看进程状态:

image-20230823184608894

输入kill -18 进程id可以重启进程:

image-20230823185051979

补充: Linux下进程状态后面的+的含义是这是一个前台进程:

image-20230823185204139

进程状态中没有+的是后台进程:

image-20230823185408461

在Linux下前台进程运行时,bash是失效的,而在后台进程运行时bash是可用的,另外后台进程可以使用kill -9 进程id来关闭。

t状态

t状态是追踪式暂停状态,是T状态的一种特例。

为了验证t状态,可以借用gdb工具,使用gdb开启调试一个程序:

image-20230823190655655

Z状态

Z状态被称作僵尸状态,僵尸状态下进程已经完全停止了,但是保留了进程的task_struct和部分数据。进程进入僵尸状态是为了了解进程的运行结果是否出现问题,因为保留的数据中包含退出码等信息,而退出码是用于判断进程运行结果是否出现问题的数据。进程终止后都会进入僵尸状态等待父进程的回收处理。

为了验证T状态,编写如下代码:

#include <stdio.h>
#include <unistd.h>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);}}return 0;
}

在Linux系统下运行程序使用kill -9 进程id杀死子进程并查看进程状态:

image-20230823200716754

僵尸进程的危害: 由于僵尸状态下进程的task_struct和数据得到保留,因此会占用内存空间,如果创建多个子进程不回收就会造成大量的空间被占用,造成严重的内存泄露问题。

X状态

X状态被称作死亡状态,死亡状态下进程完成停止了,并且操作系统会很快将进程的task_struct和代码和数据回收释放。

孤儿进程

孤儿进程是在进程运行时,父进程停止,父进程转为操作系统(1号进程),被操作系统管理的进程。

为了验证孤儿进程,编写如下代码:

#include <stdio.h>
#include <unistd.h>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){//父进程int cnt = 5;while(1){printf("我是父进程,我的pid:%d, 我的ppid:%d\n", getpid(), getppid());sleep(1);if (--cnt == 0) break;}}return 0;
}

为了方便编译,编写如下makefile文件:

myproc:myproc.cgcc -o $@ $^
.PHONY:clean
clean:rm -f myproc

准备好代码和makefile文件后编译得到程序,然后运行程序,并使用while :; do ps axj | head -1 && ps axj | grep myproc | grep -v grep; sleep 1; done指令来每隔一秒查询一次进程状态:

image-20230824134857086

进程myproc中的父进程的父进程是bash,它停止后进入僵尸状态后,bash作为其父进程会进行回收操作,因此无法看到其僵尸状态,进程myproc中的子进程仍在进行,但是原有父进程停止了,需要有新的父进程来回收它,否则会造成其停止后,僵尸状态无法回收的情况。

变成孤儿进程后,就变成了后台进程,可以选择使用killall 进程名指令杀死同一进程名的所有进程。

相关文章:

[Linux]进程状态

[Linux]进程状态 文章目录 [Linux]进程状态进程状态的概念阻塞状态挂起状态Linux下的进程状态孤儿进程 进程状态的概念 了解进程状态前&#xff0c;首先要知道一个正在运行的进程不是无时无刻都在CPU上进行运算的&#xff0c;而是在操作系统的管理下&#xff0c;和其他正在运行…...

Python爬虫逆向实战案例(五)——YRX竞赛题第五题

题目&#xff1a;抓取全部5页直播间热度&#xff0c;计算前5名直播间热度的加和 地址&#xff1a;https://match.yuanrenxue.cn/match/5 cookie中m值分析 首先打开开发者工具进行抓包分析&#xff0c;从抓到的包来看&#xff0c;参数传递了查询参数m与f&#xff0c;同时页面中…...

js识别图片中的文字插件 tesseract.js

使用方法及步骤 1.安装依赖 npm i tesseract.js 2.引入插件 import { createWorker } from tesseract.js;//worker多线程引入这个import Tesseract from tesseract.js;//js单线程引入这个 3.使用插件识别图片 //使用worker线程识别(async () > {console.time()const wo…...

Linux设备驱动移植(设备数)

一、设备数 设备树是一种描述硬件信息的数据结构&#xff0c;Linux内核运行时可以通过设备树将硬件信息直接传递给Linux内核&#xff0c;而不再需要在Linux内核中包含大量的冗余编码 设备数语法概述 设备树文件 dts 设备树源文件 dtsi 类似于头文件&#xff0c;包含一些公共的…...

【移动端开发】鸿蒙系统开发入门:代码示例与详解

一、引言 随着华为鸿蒙系统的日益成熟&#xff0c;越来越多的开发者开始关注这一新兴的操作平台。本文旨在为初学者提供一份详尽的鸿蒙系统开发入门指南&#xff0c;通过具体的代码示例&#xff0c;引导大家逐步掌握鸿蒙开发的基本概念和技术。 二、鸿蒙系统开发基础 鸿蒙系…...

Jenkins的流水线详解

来源&#xff1a;u.kubeinfo.cn/ozoxBB 什么是流水线 声明式流水线 Jenkinsfile 的使用 什么是流水线 jenkins 有 2 种流水线分为声明式流水线与脚本化流水线&#xff0c;脚本化流水线是 jenkins 旧版本使用的流水线脚本&#xff0c;新版本 Jenkins 推荐使用声明式流水线。…...

DIFFEDIT-图像编辑论文解读

文章目录 摘要算法Step1&#xff1a;计算编辑maskStep2&#xff1a;编码Step3&#xff1a;使用mask引导进行解码理论分析&#xff1a; 实验数据集&#xff1a;扩散模型&#xff1a;ImageNet数据集上实验消融实验IMAGEN数据集上实验COCO数据集上实验 结论 论文&#xff1a; 《D…...

【优选算法】—— 字符串匹配算法

在本期的字符串匹配算法中&#xff0c;我将给大家带来常见的两种经典的示例&#xff1a; 1、暴力匹配&#xff08;BF&#xff09;算法 2、KMP算法 目录 &#xff08;一&#xff09;暴力匹配&#xff08;BF&#xff09;算法 1、思想 2、演示 3、代码展示 &#xff08;二&…...

Docker容器:docker consul的注册与发现及consul-template守护进程

文章目录 一.docker consul的注册与发现介绍1.什么是服务注册与发现2.什么是consul3.docker consul的应用场景4.consul提供的一些关键特性5.数据流向 二.consul部署1.consul服务器&#xff08;192.168.198.12&#xff09;&#xff08;1&#xff09;建立 Consul 服务启动consul后…...

Blazor 依赖注入妙用:巧设回调

文章目录 前言依赖注入特性需求解决方案示意图 前言 依赖注入我之前写过一篇文章&#xff0c;没看过的可以看看这个。 C# Blazor 学习笔记(10):依赖注入 依赖注入特性 只能Razor组件中注入所有Razor组件在作用域注入的都是同一个依赖。作用域可以看看我之前的文章。 需求 …...

Python 基础 -- Tutorial(三)

7、输入和输出 有几种方法可以表示程序的输出;数据可以以人类可读的形式打印出来&#xff0c;或者写入文件以备将来使用。本章将讨论其中的一些可能性。 7.1 更花哨的输出格式 到目前为止&#xff0c;我们已经遇到了两种写值的方法:表达式语句和print()函数。(第三种方法是使…...

基于STM32的四旋翼无人机项目(二):MPU6050姿态解算(含上位机3D姿态显示教学)

前言&#xff1a;本文为手把手教学飞控核心知识点之一的姿态解算——MPU6050 姿态解算&#xff08;飞控专栏第2篇&#xff09;。项目中飞行器使用 MPU6050 传感器对飞行器的姿态进行解算&#xff08;四元数方法&#xff09;&#xff0c;搭配设计的卡尔曼滤波器与一阶低通滤波器…...

微信小程序开发教学系列(1)- 开发入门

第一章&#xff1a;微信小程序简介与入门 1.1 简介 微信小程序是一种基于微信平台的应用程序&#xff0c;可以在微信内直接使用&#xff0c;无需下载和安装。它具有小巧、高效、便捷的特点&#xff0c;可以满足用户在微信中获取信息、使用服务的需求。 微信小程序采用前端技…...

Nginx虚拟主机(server块)部署Vue项目

需求 配置虚拟主机&#xff0c;实现一个Nginx运行多个服务。 实现 使用Server块。不同的端口号&#xff0c;表示不同的服务&#xff1b;同时在配置中指定&#xff0c;Vue安装包所在的位置。 配置 Vue项目&#xff0c;放在 html/test 目录下。 config中的配置如下&#xf…...

JAVA开发环境接口swagger-ui使用总结

一、前言 swagger-ui是java开发中生产api说明文档的插件&#xff0c;这是后端工程师和前端工程师联调接口的桥梁。生成的文档就减少了很多没必要的沟通提高开发和测试效率。 二、 swagger-ui的使用 1、引入maven依赖 <dependency><groupId>io.springfox</grou…...

mongodb 数据库管理(数据库、集合、文档)

目录 一、数据库操作 1、创建数据库 2、删除数据库 二、集合操作 1、创建集合 2、删除集合 三、文档操作 1、创建文档 2、 插入文档 3、查看文档 4、更新文档 1&#xff09;update() 方法 2&#xff09;replace() 方法 一、数据库操作 1、创建数据库 创建数据库…...

分布式与集群的定义及异同

分布式与集群的定义及异同 分布式定义优点不足 集群优点不足 异同 分布式 定义 分布式是指将一个系统或应用程序分散到多个计算机或服务器上进行处理和管理的技术。它是指多个系统协同合作完成一个特定任务的系统。例如&#xff0c;可以将一个大业务拆分成多个子业务&#xf…...

电脑端teams一直在线小程序,简单好用易上手

居家办公的你&#xff0c;会不会想要摸鱼&#xff01;&#xff01;会不会想要下楼拿快递&#xff01;&#xff01;会不会想要出去下馆子&#xff01;&#xff01;&#xff01;然而&#xff0c;teams的5分钟不操作电脑状态就变为离开大大的阻挡了你幸福生活的脚步&#xff01;&a…...

YOLOv5算法改进(4)— 添加CA注意力机制

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。注意力机制是近年来深度学习领域内的研究热点&#xff0c;可以帮助模型更好地关注重要的特征&#xff0c;从而提高模型的性能。在许多视觉任务中&#xff0c;输入数据通常由多个通道组成&#xff0c;例如图像中的RGB通道或…...

无涯教程-PHP - XML GET

XML Get已用于从xml文件获取节点值。以下示例显示了如何从xml获取数据。 Note.xml 是xml文件&#xff0c;可以通过php文件访问。 <SUBJECT><COURSE>Android</COURSE><COUNTRY>India</COUNTRY><COMPANY>LearnFk</COMPANY><PRICE…...

Spark Standalone环境搭建及测试

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 篇一&#xff1a;Linux系统下配置java环境 篇二&#xff1a;hadoop伪分布式搭建&#xff08;超详细&#xff09; 篇三&#xff1a;hadoop完全分布式集群搭建&#xff08;超详细&#xf…...

【PHP】流程控制-ifswitchforwhiledo-whilecontinuebreak

文章目录 流程控制顺序结构分支结构if分支switch分支 循环结构for循环while循环do-while循环continue和break 流程控制 顺序结构&#xff1a;代码从上往下&#xff0c;顺序执行。&#xff08;代码执行的最基本结构&#xff09; 分支结构&#xff1a;给定一个条件&#xff0c;…...

Pytorch-day04-模型构建-checkpoint

PyTorch 模型构建 1、GPU配置2、数据预处理3、划分训练集、验证集、测试集4、选择模型5、设定损失函数&优化方法6、模型效果评估 #导入常用包 import os import numpy as np import torch from torch.utils.data import Dataset, DataLoader from torchvision.transfor…...

使用Xshell7控制多台服务同时安装ZK最新版集群服务

一: 环境准备: 主机名称 主机IP 节点 (集群内通讯端口|选举leader|cline端提供服务)端口 docker0 192.168.1.100 node-0 2888 | 3888 | 2181 docker1 192.168.1.101 node-1 2888 | 388…...

python numpy array dtype和astype类型转换的区别

Python3 本身对整数的支持做了提升&#xff0c;可以支持无限长度的整数&#xff1a;比如&#xff1a; b 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffPython的模块numpy array定义的数组在windows和MACOS上默认长度是…...

浮动属性样式

&#x1f353;浮动属性 属性名称中文注释备注float设置盒子浮动left左浮动&#xff0c;right右浮动&#xff0c;none不浮动clear清除浮动left清除左浮动&#xff0c;right清除右浮动&#xff0c;both左右浮动都清除&#xff08;注意&#xff1a;clear清除浮动一般只有作用在块…...

keepalived双机热备 (四十五)

一、概述 Keepalived 是一个基于 VRRP 协议来实现的 LVS 服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题。 原理 在一个 LVS 服务集群中通常有主服务器&#xff08;MASTER&#xff09;和备份服务器&#xff08;BACKUP&#xff09;两种角色的服务器…...

SpringBoot整合阿里云OSS,实现图片上传

在项目中&#xff0c;将图片等文件资源上传到阿里云的OSS&#xff0c;减少服务器压力。 项目中导入阿里云的SDK <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version>…...

Dynaminc Programming相关

目录 3.1 最长回文子串&#xff08;中等&#xff09;&#xff1a;标志位 3.2 最大子数组和&#xff08;中等&#xff09;&#xff1a;动态规划 3.3 爬楼梯&#xff08;简单&#xff09;&#xff1a;动态规划 3.4 买卖股票的最佳时机&#xff08;简单&#xff09;&#xff1…...

使用 Elasticsearch 轻松进行中文文本分类

本文记录下使用 Elasticsearch 进行文本分类&#xff0c;当我第一次偶然发现 Elasticsearch 时&#xff0c;就被它的易用性、速度和配置选项所吸引。每次使用 Elasticsearch&#xff0c;我都能找到一种更为简单的方法来解决我一贯通过传统的自然语言处理 (NLP) 工具和技术来解决…...

网站开发专业成功人士/专业培训机构

题目描述(简单难度)将给定的数字的各个位相加得到新的数字&#xff0c;一直重复这个过程&#xff0c;直到这个数小于 10&#xff0c;将这个数输出。解法一开始有点不明所以&#xff0c;直接用递归或者循环按照题目的意思写不就行了吗&#xff0c;先用递归尝试了一下。publicint…...

网站开发标准ppt/seo软件定制

从下周起要去浙江项目组了&#xff0c;要离开上海去别的地方工作有一点点担心&#xff0c;希望自己在新的环境中一切顺利&#xff0c;能真正的学到更多东西更有长进&#xff0c;希望一切都好。。。转载于:https://www.cnblogs.com/justforgram/archive/2011/11/05/2237150.html…...

徐州集团网站建设公司/百度推广效果怎么样

递归 函数自己调用自己 最大深度&#xff1a;1000&#xff0c;一般到不了1000就停了 setrecursionlimit() 方法可以修改深度 使用递归方法打印1到10 def fun(x,y):if x > y:returnelse:print(x)fun(x1,y) fun(1,10) #结果: #1 #2 #3 #4 #5 #6 #7 #8 #9 #10二分法 核心&#…...

旅游网站怎么制作/百度人工智能开放平台

昨天升级了macOS Hgigh Sierra&#xff0c;新系统的优点也是有的&#xff0c;毕竟是传闻多年的APFS文件系统&#xff0c;占用硬盘小一点&#xff0c;速度快一点。缺点也有&#xff0c;有些软件不兼容了。总体来说还是值得升级的。 但是升级的过程&#xff0c;可以说用糟糕来形容…...

网站开发技术现状/推广是什么意思

https://my.oschina.net/aptx4869/blog/298507 转载于:https://www.cnblogs.com/longshiyVip/p/6082695.html...

做ppt音乐怎么下载网站/最新今日头条

近期在搞论文&#xff0c;须要用梯度下降算法求解&#xff0c;所以又一次整理分享在这里。主要包含梯度介绍、公式求导、学习速率选择、代码实现。梯度下降的性质&#xff1a; 1.求得的解和选取的初始点有关 2.能够保证找到局部最优解&#xff0c;由于梯度终于会减小为0&#x…...