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

【Linux】进程学习(二):进程状态

目录

  • 1.进程状态
    • 1.1 阻塞
    • 1.2 挂起
  • 2. 进程状态
    • 2.1 运行状态-R
      • 进一步理解运行状态
    • 2.2 睡眠状态-S
    • 2.3 休眠状态-D
    • 2.4 暂停状态-T
    • 2.5 僵尸状态-Z
      • 僵尸进程的危害
    • 2.6 死亡状态-X
    • 2.7 孤儿进程

1.进程状态

1.1 阻塞

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

所以阻塞一定是在等待某种资源

为什么阻塞

因为进程要通过等待的方式,等具体的资源被别人用完之后,再被自己使用。

简单理解进程等待和资源

  • 资源比如磁盘、网卡、显卡 等各种外设
  • 例如,当我们下载游戏时,下载速度0kb,此时CPU无法继续正常的下载,需要等待网络资源,CPU就将这个进程设置为阻塞状态,此时进程就在等待。

具体理解进程等待

系统为了管理各种各样的进程,需要为进程先描述创建task_struct,然后再组织形成双链表形式的数据结构,同样,系统为了管理各种各样的硬件资源(磁盘、网卡、显卡 等各种外设),就需要为他们创建struct来对硬件资源进行描述,然后再组织形成数据结构
例如为了管理网卡操作系统创建了struct dev,其中包含了struct task_struct* queue的等待队列,当一个进程等待网卡资源时,cpu无法调度这个进程,这个进程就被维护在网卡struct dev结构体中的queue等待队列中。
例如当scanf等待用户输入时,该进程就是阻塞状态,这个进程被维护在键盘struct dev结构体中的queue等待队列中。

实际操作系统的实现要复杂的多,这只是一个基本的理解过程。

总的来说:
阻塞就是进程不被调度,一定是当前进程需要等待某种资源就绪,一定是进程的 task_struct 结构体需要在某种被 OS 管理的资源下排队

1.2 挂起

挂起:当 CPU 资源紧张时,将 进程的代码和数据交换至磁盘中挂起,此时内存中只有 PCB
挂起可以看作一种特殊的阻塞状态,因此挂起的全称是阻塞挂起

2. 进程状态

进程和程序不相同,进程是活动的且有状态变化的。一个进程是有多个状态的。

这里我们具体谈一下Linux操作系统中的进程状态,Linux操作系统的源代码当中对于进程状态有如下定义:

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 */

task_struct是一个结构体,内部会包含各种属性,其中就有状态

struct task_struct
{
int status;

}

在这里插入图片描述

2.1 运行状态-R

进程是R状态,不代表正在运行,代表可被调度。换句话说,进程只有是R状态才可被调度,其他状态要先转为R状态,才能被OS调度。

这表明处在运行状态的进程要么是在被OS调度中,要么在运行队列里。
当操作系统需要切换进程运行时,就直接在运行队列中选取进程运行

进一步理解运行状态

当我们运行下面这个简单的死循环,我们再来查看当前进程的状态

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

我们发现该进程并不是处在运行状态上,他的状态是S+(睡眠状态)( + 表示当前进程在前台运行中),并不是在运行状态,这和我们的认知相矛盾。

在这里插入图片描述

原因在于:

  • 代码中存在printf,这个函数需要去访问外设资源。
  • 我们知道,CPU的速度非常快,外设的速度非常慢。
  • 当printf想要访问屏幕外设来打印时,这个外设并不一定准备就绪,因此进程就在这个外设的等待队列中等待。
  • 外设准备就绪,进程被CPU调度,打印工作几乎一瞬间就运行完成,因此这个状态R很难被查询到。绝大多数的时间进程都在外设等待队列中排队,所以我们就查到S睡眠状态。

2.2 睡眠状态-S

睡眠 S 的本质就是 进程阻塞,表示此时进程因等待某种资源而暂停运行。
睡眠 S也称作可中断睡眠我们可以强制将其关闭。

  • ctrl + c 关闭
    注意:处在后台运行(也就是不带+号的)的进程无法使用ctrl + c来关闭。
    在这里插入图片描述
  • kill命令关闭
    kill -9 pid

在这里插入图片描述

2.3 休眠状态-D

当一个进程处于休眠状态(disk sleep)时,表示该进程不会被杀掉,即便是kill命令和操作系统也不行只有该进程自动唤醒才可以恢复。
休眠也称为 不可中断睡眠

2.4 暂停状态-T

我们可以让进程处于暂停状态

通过kill -l命令来查看信号
在这里插入图片描述
我们可以使用19.SIGSTOP和18.SIGCONT来使进程暂停和恢复

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

暂停进程

在这里插入图片描述
恢复进程

在这里插入图片描述

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

2.5 僵尸状态-Z

Linux当进程退出时,一般进程不会立即退出,而是会维持一个状态------僵尸状态Z
目的是为了方便后续父进程或是OS读取子进程的退出结果

创建一个父子进程,并运行。
在这里插入图片描述
终止子进程,就可以看到子进程的状态变成了僵尸进程
在这里插入图片描述

僵尸状态是必要的,进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。 而任务完成的结果,可以用退出码来体现。

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

这个返回值0返回给了操作系统,告诉他任务顺利完成。
在Linux操作系统,我们可以使用**echo $?**命令获取最近一次进程退出时的退出码。

echo $?

僵尸进程的危害

维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护不能释放。
如果不能对僵尸进程进行回收,就会造成内存泄漏的问题。

2.6 死亡状态-X

这个状态只是一个返回状态,我们不会在任务列表里看到这个状态。因为当一个进程的退出信息被读取后,该进程所申请的资源就会立即被释放,该进程也就不存在了。

2.7 孤儿进程

当创建一个父子进程,如果退出子进程,此时子进程就成了僵尸进程。当先退出了父进程时,此时的子进程就被称为孤儿进程

在这里插入图片描述
当退出父进程后,父进程无法通过ps指令查询出来,说明此时的父进程已经被回收了。此外子进程的PPID变成了1,也就是操作系统。

  • 父进程的父进程是bash,有回收机制,因此无法看到僵尸进程。
  • 当终止父进程时,此时的子进程会被OS领养
    • 被领养后,后续子进程退出,就能被回收了。这也就是OS领养的原因

以上就是我们对“进程状态”这一主题的全面探讨。通过此次学习,我们初步掌握了进程的不同状态,理解了何为阻塞状态及其产生的原因。同时,我们也深入了解了进程状态转换的各种情况,为今后更深入地学习和控制进程状态奠定了坚实的基础。

相关文章:

【Linux】进程学习(二):进程状态

目录 1.进程状态1.1 阻塞1.2 挂起 2. 进程状态2.1 运行状态-R进一步理解运行状态 2.2 睡眠状态-S2.3 休眠状态-D2.4 暂停状态-T2.5 僵尸状态-Z僵尸进程的危害 2.6 死亡状态-X2.7 孤儿进程 1.进程状态 1.1 阻塞 阻塞&#xff1a;进程因为等待某种条件就绪&#xff0c;而导致的…...

Spring Boot 笔记 003 Bean注册

使用Idea导入第三方jar包 在porn.xml种添加的第三方jar包依赖&#xff0c;并刷新 可以在启动类中尝试调用 以上放到启动类中&#xff0c;不推荐&#xff0c;建议创建一个专门定义的类 package com.geji.config;import cn.itcast.pojo.Country; import cn.itcast.pojo.Province;…...

PCIE 参考时钟架构

一、PCIe架构组件 首先先看下PCIE架构组件&#xff0c;下图中主要包括&#xff1a; ROOT COMPLEX (RC) (CPU); PCIE PCI/PCI-X Bridge; PCIE SWITCH; PCIE ENDPOINT (EP) (pcie设备); BUFFER; 各个器件的时钟来源都是由100MHz经过Buffer后提供。一个PCIE树上最多可以有256…...

【开源】JAVA+Vue.js实现在线课程教学系统

目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2.3 课时管理模块2.4 课程交互模块2.5 系统基础模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示4.1 管理后台4.2 用户网页 五、样例代码5.1 新增课程类型5.2 网站登录5.3 课…...

计算机网络(第六版)复习提纲29

第六章&#xff1a;应用层 SS6.1 域名系统DNS 1 DNS被设计为一个联机分布式数据库系统&#xff0c;并采用客户服务器方式&#xff08;C/S&#xff09; 2 域名的体系结构 3 域名服务器及其体系结构 A 域名服务器的分类 1 根域名服务器 2 顶级域名服务器&#xff08;TLD服务器&a…...

有道ai写作,突破免费限制,无限制使用

预览效果 文末提供源码包及apk下载地址 有道ai写作python版 import hashlib import time import json import ssl import base64 import uuidfrom urllib.parse import quote import requests from requests_toolbelt.multipart.encoder import MultipartEncoder from Crypto…...

node.js 使用 elementtree 生成思维导图 Freemind 文件

请参阅: java : pdfbox 读取 PDF文件内书签 请注意&#xff1a;书的目录.txt 编码&#xff1a;UTF-8&#xff0c;推荐用 Notepad 转换编码。 npm install elementtree --save 编写 txt_etree_mm.js 如下 // 读目录.txt文件&#xff0c;使用 elementtree 生成思维导图 Free…...

Vue中路由守卫的详细应用

作为一名web前端开发者&#xff0c;我们肯定经常使用Vue框架来构建我们的项目。而在Vue中&#xff0c;路由是非常重要的一部分&#xff0c;它能够实现页面的跳转和导航&#xff0c;提供更好的用户体验。然而&#xff0c;有时我们需要在路由跳转前或跳转后执行一些特定的逻辑&am…...

Flink Checkpoint过程

Checkpoint 使用了 Chandy-Lamport 算法 流程 1. 正常流式处理&#xff08;尚未Checkpoint&#xff09; 如下图&#xff0c;Topic 有两个分区&#xff0c;并行度也为 2&#xff0c;根据奇偶数 我们假设任务从 Kafka 的某个 Topic 中读取数据&#xff0c;该Topic 有 2 个 Pa…...

【Java程序代理与系统代理关系】Java程序代理与系统代理关系优先级及覆盖关系

前言 使用Apache HttpClient工具包中的HttpClients.createDefault()方法创建的默认HTTP客户端会根据操作系统当前的设置来决定是否使用代理。 具体来说&#xff0c;当创建默认HTTP客户端时&#xff0c;它会检查系统的代理设置。如果操作系统当前设置了系统级代理&#xff0c;…...

MQ,RabbitMQ,SpringAMQP的原理与实操

MQ 同步通信 异步通信 事件驱动优势&#xff1a; 服务解耦 性能提升&#xff0c;吞吐量提高 服务没有强依赖&#xff0c;不担心级联失败问题 流量消峰 ​ 小结: 大多情况对时效性要求较高&#xff0c;所有大多数时间用同步。而如果不需要对方的结果&#xff0c;且吞吐…...

Vue 3 + Koa2 + MySQL 开发和上线部署个人网站

Vue 3 Koa2 MySQL 开发和上线部署个人网站 记录个人的一个操作步骤, 顺序不分先后, 嫌啰嗦请出门右转! 环境说明: 服务器: 阿里云轻量应用服务器 服务器系统: CentOS8.2 本地环境: macOS 12.7.2 Node: 20.10.0 MySQL: 8.0.26 Vue: 3.3.11 Koa: 2.7.0 pm2: 5.3.1 Nginx: 1.1…...

uniapp踩坑之项目:简易版不同角色显示不一样的tabbar和页面

1. pages下创建三个不同用户身份的“我的”页面。 显示第几个tabbar&#xff0c;0是管理员 1是财务 2是司机 2. 在uni_modules文件夹创建底部导航cc-myTabbar文件夹&#xff0c;在cc-myTabbar文件夹创建components文件夹&#xff0c;在components文件夹创建cc-myTabbar.vue组件…...

源支付V7开心1.9修复版,非网络上泛滥不能那种

源支付V7开心1.9修复版&#xff0c;非网络上泛滥不能那种 修复版源码&#xff0c;非网络泛滥版&#xff0c;防止源码泛滥&#xff0c;会员专属源码, 本站会员免费下载所有资源 注&#xff1a;开发不易&#xff0c;仅限交流学习使用&#xff0c;如商业使用&#xff0c;请支持正…...

Gitlab和Jenkins集成 实现CI (二)

Gitlab和Jenkins集成 实现CI (一) Gitlab和Jenkins集成 实现CI (二) Gitlab和Jenkins集成 实现CI (三) 配置Gitlab api token 配置 Gitlab 进入gitlab #mermaid-svg-t84fR8wrT4sB4raQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:…...

Java:内部类、枚举、泛型以及常用API --黑马笔记

内部类 内部类是类中的五大成分之一&#xff08;成员变量、方法、构造器、内部类、代码块&#xff09;&#xff0c;如果一个类定义在另一个类的内部&#xff0c;这个类就是内部类。 当一个类的内部&#xff0c;包含一个完整的事物&#xff0c;且这个事物没有必要单独设计时&a…...

【持续更新】2024牛客寒假算法基础集训营3 题解 | JorbanS

A - 智乃与瞩目狸猫、幸运水母、月宫龙虾 string solve() {string a, b; cin >> a >> b;if (isupper(a[0])) a[0] a - A;if (isupper(b[0])) b[0] a - A;return a[0] b[0] ? yes : no; }B - 智乃的数字手串 string solve() {cin >> n;int cnt 0;for (…...

Java基于微信小程序的驾校报名小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

Android中AGP与Gradle、AS、JDK的版本关系

文章目录 AGP版本所要求的Gradle、JDK、SDK Build Tools最小版本Android Studio所要求的AGP最小版本 本文介绍了 在Android开发中由于AGP与gradle、JDK、AS等版本不匹配导致的编译失败问题屡见不鲜&#xff0c;尤其是对于新手而言更是叫苦不迭。新手经常遇到拿到别人的工程代码…...

web 前端实现一个根据域名的判断 来显示不同的logo 和不同的标题

1.需求 有可能我做一个后台 web端 我想实现一套代码的逻辑 显示不同的公司主题logo以及内容&#xff0c;但是实际上 业务逻辑一样 2.实现 建一个store oem.ts 这个名为是 oem系统 oem.ts import { defineStore } from pinia;import { store } from /store;const oemDataLis…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...