【Linux】进程周边002之进程状态

2023-12-16

???? 樊梓慕: 个人主页

????个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》

???? 每一个不曾起舞的日子,都是对生命的辜负


目录

前言

1.什么是状态?

1.1运行

1.2阻塞

1.3阻塞挂起

2.Linux下具体的进程状态

2.1运行状态-R

2.2可中断睡眠状态-浅度睡眠状态-S

2.3不可中断睡眠状态-深度睡眠状态-D

2.4停止状态-T

2.5死亡状态-X

2.6僵尸状态-Z

2.6.1僵尸进程的危害

2.7孤儿进程


前言

本篇文章博主将会讲解进程状态,之前我们讲到进程是有生命的,所以他在整个生命期间必然会有状态的变化。那么具体而言什么是状态呢?Linux中包含有那些状态呢?


欢迎大家???? 收藏 ????以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================

GITEE相关代码: ???? fanfei_c的仓库 ????

=========================================================================


1.什么是状态?

所谓的状态其实就是task_struct中的一个整型变量。


状态决定了什么?你的后续动作!而Linux中可能会存在多个进程都要根据它的状态执行后续动作,此时就需要排队了。

1.1运行

一个CPU,一个运行队列 ,也就是说这些进程都需要在CPU这里进行排队,逐个执行。

而排队的是进程么?

其实不是,排队的是进程的PCB(面试时不是你在排队,而是你的简历信息在排队)。

在PCB中存在着多个节点成员,这些节点成员的存在就是为了“先描述再组织”中的组织而存在的。这也就实现了一个task_struct可以被链入多种数据结构中从而进程可以在不改变原有队列的同时,实现在各种各样的软硬件资源提供的队列中排队的操作。


但是就算进程放在了CPU上,也不是一直会运行的。在操作系统管理进程有时间片的概念,一个CPU永远不可能真正地同时运行多个任务。在只考虑一个CPU的情况下,这些进程“看起来像”同时运行的,实则是轮番穿插地运行,由于时间片通常很短(在 Linux 上为5ms-800ms),用户不会感觉到。

就好比我们的电脑,某个进程卡死了,而其他进程照常运行的原因就是这。


1.2阻塞

当进程在等待软硬件资源的时候(比如等待键盘输入),资源如果没有就绪。

此时task_struct就会被设置为阻塞状态,并链入等待的 资源提供的等待队列

没错,这里的等待队列类似于CPU运行队列。

比如:


状态的变迁,引起的是PCB会被操作系统变迁到不同的队列当中。


1.3阻塞挂起

挂起状态的前提是计算机资源已经比较吃紧了。

阻塞挂起:因为等待某种软硬件资源就绪,进程对应PCB由运行队列转至资源下的等待队列时,考虑到内存空间紧张,操作系统会将因为等待而暂时无法运行的进程对应的代码和数据先由内存转移到磁盘中,此时进程即为挂起状态,等到该进程可以被运行时再将对应的代码和数据由磁盘转移回内存中。

当计算机资源比较吃紧时,操作系统一定要确保自身不会因为资源的紧张而崩溃,所以就会将一些等待资源(阻塞)的进程的 代码和数据 交换到磁盘的swap分区中,这个过程称为唤出。

当需要调度此进程时,就会将磁盘的swap分区中保存的内容换回到内存中,这个过程称为唤入。

注意:交换的是进程的代码和数据,不是PCB!!如果PCB被交换出内存了,那操作系统如何管理呢?

所以当某个进程的代码和数据不在内存中,而被换出到磁盘上时,该进程就为挂起状态。

以上的挂起都为阻塞挂起状态。


思考:swap分区是越大越好么?

磁盘本质是输入输出设备,每次唤入唤出其实都是非常低效的操作,如果swap分区设置的过大,那么操作系统就会十分依赖它,导致出现更多低效IO,这本身就是一种牺牲效率来确保操作系统能够正常运行的行为。

所以swap分区不宜设置的过大,一般为内存大小或内存大小的一半,具体要看不同的操作系统。


2.Linux下具体的进程状态

首先我们来看一下Linux操作系统源码中定义的状态都有哪些:

/*
* 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 *task_state_array[] = {
	"R (running)",       /*  0*/
    "S (sleeping)",      /*  1*/
    "D (disk sleep)",    /*  2*/
    "T (stopped)",       /*  4*/
    "t (tracing stop)",  /*  8*/
    "Z (zombie)",        /* 16*/
    "X (dead)"           /* 32*/
};

接下来我们逐个介绍以上状态。

2.1运行状态-R

运行状态(running)并不意味着进程一定处于运行当中,运行状态表明一个进程要么在运行中,要么在运行队列里。

2.2可中断睡眠状态-浅度睡眠状态-S

浅度睡眠状态(sleeping)意味着该进程正在等待某件事情的完成,处于浅度睡眠状态的进程随时可以被唤醒,也可以被杀掉(这里的睡眠有时候也可叫做可中断睡眠(interruptible sleep))。

等同于状态概念中的阻塞状态。

我们来写段代码测试下:

首先我们讲程序运行起来,查看一下进程的状态:

为什么是睡眠状态呢?

  • 首先我们知道CPU的运行速度非常快,那他执行printf这段代码的速度也是非常快的,但是printf会调用输出设备,这个过程就会处于阻塞状态(因为CPU的速度远高于输出设备),另外sleep函数也是会处于睡眠状态, 所以虽然该进程大部分时间都是处于睡眠状态,而不是运行状态

处于S+状态时,该进程可用ctrl+c结束。

"+"代表是前台运行,无"+"代表后台运行,后台运行时可在命令行继续输入指令并执行,但无法用ctrl+c结束,需要用kill -9 pid杀死。想要后台运行某个程序就在后面加"&",如:./test &


2.3不可中断睡眠状态-深度睡眠状态-D

深度睡眠状态/不可中断睡眠状态/磁盘休眠状态,顾名思义,在这个状态的进程不会被杀掉,哪怕是操作系统也不行,通常会等待IO的结束。

例如,某一进程要求对磁盘进行写入操作,那么在磁盘进行写入期间,该进程就处于深度睡眠状态,是不会被杀掉的,因为该进程需要等待磁盘的回复(是否写入成功)以做出相应的应答。

如果在这个过程中,操作系统能够杀死该进程,那么就有可能丢失数据。

该状态也属于阻塞状态。


2.4停止状态-T

Linux中,操作系统为了防止一些进程做某种危险操作,可能会将进程设置为暂停状态。

我们可以利用SIGSTOP信号使进程进入暂停状态(stopped),发送SIGCONT信号可以让处于暂停状态的进程继续运行。

该状态也属于阻塞状态。


2.5死亡状态-X

死亡状态只是一个返回状态,当一个进程的退出信息被读取后,该进程所申请的资源就会立即被释放,该进程也就不存在了,所以你不会在任务列表当中看到死亡状态,死亡状态是一个瞬时过程,我们很难查看到。


2.6僵尸状态-Z

僵尸状态就是在等待退出信息被读取时所处的状态。

在这一状态的进程我们称之为 僵尸进程

利用代码进行观察:


为什么要有僵尸状态?

  • 创建进程是希望这个进程给用户完成工作的,子进程必须有结果数据保存在自己的PCB中,在该子进程死亡之前,必须要有父进程读取这些结果数据,读取成功后,子进程才能死亡。

2.6.1僵尸进程的危害

  • 僵尸进程的退出状态必须一直维持下去,因为它要告诉其父进程相应的退出信息。可是父进程一直不读取,那么子进程也就一直处于僵尸状态。
  • 僵尸进程的退出信息被保存在task_struct(PCB)中,僵尸状态一直不退出,那么PCB就一直需要进行维护。
  • 若是一个父进程创建了很多子进程,但都不进行回收,那么就会造成资源浪费,因为数据结构对象本身就要占用内存。
  • 僵尸进程申请的资源无法进行回收,那么僵尸进程越多,实际可用的资源就越少,也就是说,僵尸进程会导致内存泄漏。

2.7孤儿进程

孤儿进程与僵尸进程的情况刚好相反,当子进程的父进程先于子进程退出,那么将来子进程进入僵尸状态时就没有父进程对其进行处理,此时该子进程就称之为孤儿进程。

当出现孤儿进程时,该进程会被1号进程领养(可以认为是操作系统),此后当孤儿进程成为僵尸进程时就由1号进程对其进行读取。


=========================================================================

如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容

????博主很需要大家的支持,你的支持是我创作的不竭动力????

???? ~ 点赞收藏+关注 ~ ????

=========================================================================

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux】进程周边002之进程状态 的相关文章

  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • nslookup 报告“无法解析 '(null)': 名称无法解析”,尽管它成功解析了 DNS 名称

    我在 ubuntu 上 并且正在运行 docker 默认桥接网络 我有 Zookeeper kafka 的容器化版本 以及我编写的与 kafka 对话的应用程序 I do a docker exec it
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 如何更改 Apache 服务器的根目录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何更改 Apache 服务器的文档根目录 我基本上想要localhost从 来 users spencer projects目录而不是

随机推荐

  • 【网络安全】网安人(黑客)必备十大网站(内附学习笔记)

    一 前言 想投身安全行业的朋友 可以跟着我一起学习 如果一下内容你赞同 希望给个支持三连 二 知识 工具 1 https iscc isclab org cn study 这里仅仅收集了学习资料 参考平台 大家有兴趣可以去看看 2 http
  • leetcode对称二叉树(每日一题)

    https leetcode cn problems symmetric tree description 今天我们在来个题目 对称二叉树 其实这道题的思路我觉得和那到判断两棵树是不是相同的题目很相似 写这个题目的思路还是递归 但是我们看这
  • 游戏弹窗找不到emp.dll怎么办?分享5个靠谱的解决方法

    在现代的游戏世界中 我们经常会遇到各种各样的问题 其中 最常见的问题之一就是 无法找到emp dll 或 emp dll丢失 那么 emp dll到底是什么 它有什么作用 为什么会出现丢失的情况呢 不用担心 本文将从这几个方面进行详细解析
  • 计算机msvcr71.dll丢失的解决方法,总结3个有效的方法

    在计算机使用过程中 我们常常会遇到一些错误提示 其中之一就是 msvcr71 dll丢失 这个问题通常是由于系统文件损坏或缺失引起的 会导致某些程序无法正常运行 那么 msvcr71 dll到底是什么呢 它又有什么作用 本文将从多个方面对m
  • msvcp100.dll丢失的常见原因/msvcp100.dll丢失的解决方法分享

    在计算机使用过程中 我们经常会遇到一些错误提示 其中之一就是 msvcp100 dll丢失 这个错误提示通常出现在运行某些程序或游戏时 给使用者带来了很大的困扰 那么 究竟是什么原因导致了msvcp100 dll文件的丢失呢 本文将详细解析
  • IBIS AMI Model 算法模式的选择

    常规的信号完整性仿真 只会包含传统的基于IBIS的芯片行为级模型 但高速串行总线在使用过程中 经常会由于传输信道或链路过长以及信号频率较高而造成信号衰减过大 接收端无法正确判别信号 因此 这类SerDes芯片都需要集成均衡或者加重等信号处理
  • 解决msvcr100.dll丢失的3个靠谱方法,快速修复dll缺失问题

    在计算机使用过程中 我们经常会遇到一些错误提示 其中之一就是 msvcr100 dll丢失 这个错误通常会导致某些程序无法正常运行 而当我们看到 msvcr100 dll是什么 这个问题时 可能会感到困惑 那么 msvcr100 dll究竟
  • 如何进行代码混淆?方法与常见工具介绍

    如何进行代码混淆 方法与常见工具介绍 目录 什么是代码混淆 代码混淆的方法 常见代码混淆工具 什么是代码混淆 代码混淆是指将计算机程序的代码转换成一种功能上等价 但难于阅读和理解的形式的行为 混淆后的代码很难被反编译 即使反编译成功也很难得
  • 华为OD机试真题-快递员的烦恼-2023年OD统一考试(C卷)

    题目描述 快递公司每日早晨 给每位快递员推送需要送到客户手中的快递以及路线信息 快递员自己又查找了一些客户与客户之间的路线距离信息 请你依据这些信息 给快递员设计一条最短路径 告诉他最短路径的距离 注意 1 不限制快递包裹送到客户手中的顺序
  • 产品经理必掌握自定义元件&流程图&泳道图

    艳艳耶 个人主页 个人专栏 越努力 越幸运 目录 一 什么是自定义元件 1 1如何自定义元件 二 什么是流程图 泳道图 2 1什么是流程图 2 2如何画流程图 2 3什么是泳道图 2 4如何画泳道图 三 流程图和泳道图的区别 四 流程图案列
  • 评论送书:一本书讲透Java线程:原理与实践

    摘要 互联网的每一个角落 无论是大型电商平台的秒杀活动 社交平台的实时消息推送 还是在线视频平台的流量洪峰 背后都离不开多线程技术的支持 在数字化转型的过程中 高并发 高性能是衡量系统性能的核心指标 越来越多的公司对从业人员的多线程编程能力
  • 解决ps找不到MSVCP140.dll的5种方法,完美解决

    在计算机使用过程中 我们经常会遇到一些错误提示 其中之一就是 找不到MSVCP140 dll 这个问题通常出现在安装Adobe Photoshop 简称PS 时 MSVCP140 dll是Microsoft Visual C 2015 Re
  • 【Linux】公网远程访问AMH服务器管理面板

    目录 1 Linux 安装AMH 面板 2 本地访问AMH 面板 3 Linux安装Cpolar 4 配置AMH面板公网地址 5 远程访问AMH面板 6 固定AMH面板公网地址 AMH 是一款基于 Linux 系统的
  • 2023年度盘点:AIGC、AGI、GhatGPT、人工智能大模型必读书单

    文末送书 今天推荐几本AIGC AGI GhatGPT 人工智能大模型领域优质书籍 前言 2023年是人工智能大语言模型大爆发的一年 一些概念和英文缩写也在这一年里集中出现 很容易混淆 甚至把人搞懵 LLM Large Language M
  • ADS Via Designer 快速建模举例

    如何快速地对设计中的差分过孔进行建模 是layout前仿真中经常遇到的问题 好在目前主流的仿真软件都提供了独立的过孔建模向导 可以很方便地进行操作 本文以ADS提供的Via Designer向导为例 展示如何快速完成过孔的建模操作 以下图所
  • 代码混淆技术探究与工具选择

    代码混淆技术探究与工具选择 引言 在软件开发中 保护程序代码的安全性是至关重要的一环 代码混淆 Obfuscated code 作为一种常见的保护手段 通过将代码转换成难以理解的形式来提升应用被逆向破解的难度 本文将介绍代码混淆的概念 方法
  • 2023自动化测试框架的设计原则你都知道吗?快来看!

    1 代码规范 测试框架随着业务推进 必然会涉及代码的二次开发 所以代码编写应符合通用规范 代码命名符合业界标准 并且代码层次清晰 特别在大型项目 多人协作型项目中 如果代码没有良好的规范 那么整个框架的代码会风格混杂 晦涩难懂 后续维护会很
  • 【Linux】系统初识之冯诺依曼体系结构与操作系统

    樊梓慕 个人主页 个人专栏 C语言 数据结构 蓝桥杯试题 LeetCode刷题笔记 实训项目 C Linux 每一个不曾起舞的日子 都是对生命的辜负 目录 前言 1 冯诺依曼体系结构 2 操作系统 OS 1 用户到操作系统再到底层是如何组织
  • 【教程】app备案流程简单三部曲即可完成

    APP备案流程包括以下步骤 1 开发者实名认证 在提交备案申请之前 开发者需要通过移动应用开发平台进行实名认证 这个步骤需要提供身份证号码 姓名 联系方式等信息 并上传相关证件照片或扫描件 2 应用信息登记 开发者需要在应用商店或应用发布平
  • 【Linux】进程周边002之进程状态

    樊梓慕 个人主页 个人专栏 C语言 数据结构 蓝桥杯试题 LeetCode刷题笔记 实训项目 C Linux 每一个不曾起舞的日子 都是对生命的辜负 目录 前言 1 什么是状态 1 1运行 1 2阻塞