【Linux】进程4——进程状态

1.进程状态

什么是状态?

每个人都有状态——颓废,阳光,积极向上。。。。

进程也有状态

在操作系统中,由于进程的数量是非常多的,而系统的资源又非常少,所以不可能每一个进程在每时每刻都会处于上处理机运行的状态,所以在系统中应该要为进程维护好相关的状态:运行态,终止态,阻塞态,挂起态,还有Linux中特有的其他进程状态:R(Running),S(Sleeping),D(disk sleeping),T(stopping),t(trace stopping)

 事实上进程的基本状态如下

1.1.运行态

我们先补充一点知识        

        一个进程只要把自己放到CPU上开始运行了,是不是要一直执行完毕,才把自己放下来是不是?

  • 不是,因为每个进程都有一个时间片的概念,每个进程一次性在CPU上最多执行时间片大小的时间
  • 即在某个时间段内,所有进程代码都会被执行
  • 大量的把进程从CPU上放下去,拿上来的动作——进程切换 

      说到进程的运行状态,很多同学可能第一时间想到的是此时进程应该在处理机上运行,这个时候的进程所处的状态就称为运行态

       其实并不是的,我们可以思考:在系统中一般只有一个处理机,而进程的数量又非常庞大,如果说,上处理机处理的运行的进程才称为运行态,那么进程在处理机上的运行切换又是非常快的,所以就会导致进程的状态不断发生改变,从而维护进程属性的PCB结构体中的进程相关状态信息的值会频繁发生变化,显然这是不合理的,也没有必要。

       因此,如果正确定义进程的运行态呢??

       进程在载入内存的时候,通常操作系统会为该程序创建一个PCB结构体来维护该进程中的相关信息,那么当这一切的准备工作全部准备就绪的时候,这个PCB结构体就会被放入CPU相应的运行队列中,那么此时我们就称该进程已经处于运行态

       总结来说,就是一个进程中的PCB结构体加入运行队列中随时准备上处理机运行的状态就称为运行态,此时进程在内存中。

如图是CPU中的运行队列的大致图,上述所有在运行队列中的进程都处于运行状态

1.2.就绪态

        当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。

这个状态的特点是

  • ① 一个进程已经具备运行条件,但没有分配CPU,暂时不能运行。
  • ②当调度给该进程CPU时,立即可以运行。

1.3.阻塞态

        这个可以类比进程的运行态,但是与进程的运行态不同的是,运行态等待的是CPU资源,而阻塞态是由于等待一些非CPU资源而无法运行的状态,同样也会维护相应的等待队列,这个等待队列因等待的资源不同而有所差异,比如常见等待的资源:磁盘,显卡,网卡,打印机,因此这些资源都会维护对应的等待队列,比如:磁盘等待队列,网卡等待队列,显卡等待队列等,此时进程在内存中。

这个状态的特点是:

  • ① 有时也叫作 “等待态、封锁态、睡眠态” 。
  • ② 当前进程因等待某事件的发生而暂时不能运行的状态。
  • ③ 即使这时CPU空闲,该进程也不能运行。

此过程会发生的事情:

  1.  当前进程的PCB会从runqueue中移除
  2. 当前进程的PCB会被加入到对应等待资源的等待队列中
  3. 对应进程的PCB中的进程的状态会被改变 

1.4.挂起态

        挂起态也属于一种等待状态,和阻塞态稍微有点类似,

        不过,挂起态的本质原因是操作系统中的内存资源不够,进程的数量太多,导致系统的压力非常大,因此此时操作系统为了释放压力,必须将一些暂时不需要运行的进程中的相关的代码和数据先置换到磁盘上,一般情况下,磁盘都会预先留出一部分空间:swap分区,此时进程不在内存中,而在磁盘上。

1.5.终止态

终止态是指一个进程在运行结束之后,不需要再上处理机运行的状态,对应的PCB加入到终止队列中,此时我们称这样的进程处于终止状态

        思考:为什么进程在结束运行不再需要上处理机运行时不直接被操作系统回收,而需要维护一个终止态呢?

        操作系统在回收相关进程的资源的时候不是一蹴而就的,而是需要花费一定的时间和开销,因此,在回收之前需要维护一个终止队列,对应PCB处于终止队列上的进程就是处于终止态此时进程在内存中。

2.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 */
};
  1. R  ——运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列 里。
  2. S  ——睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))。
  3. D  ——磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的 进程通常会等待IO的结束。
  4. T  ——停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行。
  5. X  ——死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

2.1. R(running):运行态

进程中的进程如果一直被运行,就会处于运行状态

我们来看看

我们编译运行,换另外一个账号来

我们发现不是r状态???

我们修改一下代码

我们编译运行

我们再用别的账号看看

都是R状态了

我们看到的现象是程序不断地输出,但是为啥是处于S状态呢??
        原因很简单,主要是因为我们在程序的源代码中调用printf函数,这个函数是向终端输出内容的,是一种向慢设备输出的一个过程,因此,因为我们知道处理机的速度是非常快的,慢设备的速度是非常慢的,所以,这个过程中大部分时间都是处于等待的过程,因此此时进程所属的状态是S状态

 S就对应我们的阻塞状态了

2.2. S(sleeping):睡眠状态

这种状态是一种阻塞状态,表示的是等待外设的就绪,是一种浅度睡眠状态,可以随时被中断

当然我们也可以采用kill -9 进程的pid 命令来杀掉该进程

2.3. D(disk sleeping):阻塞状态

属于一种深度睡眠的状态,这个状态一旦发生,就不容易被中断,一般情况下只能通过关机或者断电才能够中断,其发生本质原因是等待磁盘资源的分配,磁盘的资源压力过大

2. 4. Z和X状态:死亡与僵尸

  • X状态:表示进程已经死亡,处于终止态
  • Z状态:表示进程处于僵尸状态,已经不用上处理机运行的状态

        我们需要知道,在Linux中,一个进程退出时不会马上进入X态,而是会进入Z状态,那么这是为什么呢?
        一个进程被创建就是为了完成某项任务,因此,当进程结束的时候,需要将进程的结束信息(是否完成任务等)告诉给父进程或者操作系统,也就是说:操作系统在一个进程退出后,这个进程不会马上处于X态,而是会为其维护一个称为僵尸态的状态,维护的目的是:就是维护进程的退出信息,以便将这个信息告知给操作系统或者父进程

如何模拟僵尸进程?
一般情况下,我们都会创建进程,这个进程会有相应的父进程,当子进程退出而父进程没有退出的时候,此时子进程所处的状态就是僵尸状态(Z状态

此时可以看出,该进程处于僵尸状态

我们知道,一个进程处于僵尸状态的话,就说明其资源还没有被操作系统回收,那么长期如此,就会导致内存泄露,因此,当出现僵尸进程的时候,我们必须合理地解决好僵尸进程的问题

2.4.1.孤儿进程

当一个进程的父进程提前退出的时候,子进程还在运行,此时子进程会被父进程的父进程领养,即会被bash(1号进程)领养

 此时我们会发现,这个进程的状态相比于上述的进程来说是没有+的,这种进程状态没有+,是不能被Ctrl+C杀掉的,此时必须使用kill -9 进程的pid命令才能够杀掉进程

查看1号进程:使用top命令

从上图中我们可以看出,1号进程本质就是root,名为:systemd

2.5. T(Stopping):暂停状态

当进程被kill -19 pid 暂停的时候,此时进程会处于暂停状态

 想要将进程进行恢复的话可以采用kill -18 pid进行恢复

2.6. t(tracing stopping):追踪暂停状态

一般是在调试的过程中遇到断点的状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/850185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python报错】list indices must be integers or slices, not tuple

【Python报错】list indices must be integers or slices, not tuple 在Python中,列表(list)是一种常用的数据结构,用于存储一系列的元素。当你尝试使用不支持的索引类型访问列表元素时,会遇到list indices must be in…

OS复习笔记ch7-3

承接上文我们讲完了页式管理和段式管理,接下来让我们深入讲解一下快表和二级页表 快表 快表和计算机组成原理讲的Cache原理如出一辙。为了减少访存的次数,OS在访问页面的时候创建了快表(Translation Lookaside Buffer ,简称TLB&…

pikachu靶场全流程

目录​​​​​​​ 暴力破解: 1.基于表单的暴力破解: 2.验证码绕过(on server): 3.验证码绕过(on client): token防爆破: XSS: 1.反射型xss(get): 2.反射性xss(post): 3.存…

Elasticsearch之写入原理以及调优

1、ES 的写入过程 1.1 ES支持四种对文档的数据写操作 create:如果在PUT数据的时候当前数据已经存在,则数据会被覆盖,如果在PUT的时候加上操作类型create,此时如果数据已存在则会返回失败,因为已经强制指定了操作类型…

RPA影刀 | 设置当前时间

1. 新建流程 2. 创建指令 指令1:获取当前日期时间 指令3:日期时间转文本 %Y:年 %m:月 %d:日期 其他字符自由添加。 常用格式如下: %Y年%m月%d日%Y-%m-%d%Y_%m_%d%Y%m%d 3. 运行流程

【办公类-04-02】华为助手导出照片读取拍摄时间分类导出,视频不行)

背景需求 今天我用QQ相册导出照片,但是始终在转圈,手机上无法跳出“连结“”的提示,换了台式和笔记本都无法传输。(明明5月14日还可以导出的) 最后我只能用华为传输助手,把照片快速提取出来了。 使用原来…

从记忆到想象:探索AI的智能未来

引言 人工智能(AI)在信息处理、数据分析和任务自动化等方面展现了强大的能力。然而,在人类独有的记忆和想象力领域,AI仍然有很长的路要走。加利福尼亚大学戴维斯分校的心理学和神经科学教授查兰兰加纳特(Charan Ranga…

STM32编程:实现LED灯闪烁(基于手写SDK的方式)

项目结构 stm32f10x.h 文件 //寄存器的值常常是芯片外设自动更改的,即使CPU没有执行程序,也有可能发生变化 //编译器有可能会对没有执行程序的变量进行优化//volatile表示易变的变量,防止编译器优化, #define __IO volati…

Linux(Rocky)下 如何输入中文(切换中文输入法)教程

RockyLinux如何输入中文(切换中文输入法) 注意 在字符画界面的Linux系统中 默认不具备中文输入法的功能 需要SSH或其他远程工具来实现 问题 可能大家有的时候安装了一个虚拟机之后 想切换中文输入法 但是一直找不到方法 下面将利用Rocky9.2作为演示…

Failed to build causal-conv1d -- 离线安装(mamba_ssm)

Building wheels for collected packages: causal-conv1d Building wheel for causal-conv1d (setup.py) … error error: subprocess-exited-with-error python setup.py bdist_wheel did not run successfully. │ exit code: 1 ╰─> [8 lines of output] torch.__versi…

苹果将推出“Apple Intelligence”AI系统,专注于隐私和广泛应用|TodayAI

据彭博社报道,苹果公司将在下周的 WWDC 2024 开发者大会上揭晓其全新的 AI 系统——“Apple Intelligence”,该系统将适用于 iPhone、iPad 和 Mac 设备。这一新系统将结合苹果自身技术和 OpenAI 的工具,为用户提供一系列新的 AI 功能&#xf…

独立游戏之路 -- TapTap广告收益损失和常见问题

一个操作带来的TapTap广告收益损失 一,收益损失1.1 广告入口1.2 损失对比二,常见问题2.1 有展现量没有预估收益 /eCPM 波动大?2.2 新建正式媒体找不到预约游戏2.3 聚合模式由于没有回传 oaid 无数据2.4 每日观看次数限制是否有限制一,收益损失 1.1 广告入口 TapTap广告联…

【JAVASE】日期与时间类(下)

三:LocalDateTime 相当于LocalDate类,在LocalDateTime类的对象中还可以封装时、分、秒和纳秒(1纳秒是1秒的十亿分之一)等时间类型。 例如,创建LocalDateTime对象 , LocalDateTime date LocalDateTi…

动手学深度学习29 残差网络ResNet

动手学深度学习29 残差网络ResNet ResNet代码ReLU的两种调用1. 使用 torch.nn.ReLU 模块2. 使用 torch.nn.functional.relu 函数总结 QA29.2 ResNet 为什么能训练处1000层的模型ResNet的梯度计算怎么处理梯度消失的 QA ResNet 更复杂模型包含小模型,不一定改进&…

Shell以及Shell编程

Shell的任务 ①分析命令; ②处理通配符、变量替换、命令替换、重定向、管道和作业控制; ③搜索命令并执行。 内部命令:内嵌在Shell中。 外部命令:存在于磁盘上的独立可执行文件。 #!/bin/bash #! 称为一个幻数&…

Polar Web【中等】你知道sys还能这样玩吗

Polar Web【中等】你知道sys还能这样玩吗 Contents Polar Web【中等】你知道sys还能这样玩吗思路&探索源码 EXPPHP测试生成十六进制化的命令上传测试 Python 脚本 运行&总结 思路&探索 本题属实是有些…即使提示了sys也难以迅速想到 /sys.php 这个路径,…

MySQL—多表查询—多表关系介绍

一、引言 提到查询,我们想到之前学习的单表查询(DQL语句)。而这一章节部分的博客我们将要去学习和了解多表查询。 对于多表查询,主要从以下7个方面进行学习。 (1)第一部分:介绍 1、多表关系 2、…

每日5题Day18 - LeetCode 86 - 90

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前! 第一题:86. 分隔链表 - 力扣(LeetCode) /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;…

Vue前端在线预览文件插件

Vue前端在线预览文件插件 一、使用场景 1.1.像文档资料等,只想让他人在线预览,但不能下载。此等场景需求可以用到此插件。 二、此文档介绍两种插件 1.view.xdocin插件 (上线后免费几天,然后收费,添加作者后,可以延…

二叉树的实现(初阶数据结构)

1.二叉树的概念及结构 1.1 概念 一棵二叉树是结点的一个有限集合,该集合: 1.或者为空 2.由一个根结点加上两棵别称为左子树和右子树的二叉树组成 从上图可以看出: 1.二叉树不存在度大于2的结点 2.二叉树的子树有左右之分,次序不能…