【Linux】进程状态

一、概念

        我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)

在操作系统原理中:运行状态分为以下三种:运行状态(执行)、阻塞状态、就绪状态

1. 运行状态:

        此状态下是指:进程正在使用CPU执行其指令。

        转换:进程在运行状态下可能会因为时间片用完(时间片用完,但程序还没执行完)或被其他更高优先级的进程抢占而切换到就绪状态。

2.阻塞状态:

        只能由运行状态转换过来,进程在运行到等待某个事件(如I/O操作完成(如等待cin输入)、信号等)时转入阻塞状态。

        转换:当等待的事件发生时,阻塞状态的进程会转换为就绪状态

3.就绪状态:

        进程已准备好执行,但由于CPU被其他进程占用而暂时未被调度。

        转换:当CPU空闲并调度此进程时,它会从就绪状态转换为运行状态。

以上就是在操作系统原理学科中对进程状态的概念。

二、Liunx下的进程状态

        前面章节已经介绍过Linux进程PCB的相关概念,现在可以继续学习PCB中的state成员。

只要是进程就会有对应的进程状态,在Liunx中用task_struct 的state成员来记录进程状态。

struct task_struct {pid_t pid;                         // 进程IDlong state;                        // 进程状态unsigned int flags;                // 进程标志struct mm_struct *mm;              // 进程的内存管理信息struct task_struct *parent;        // 父进程struct list_head children;         // 子进程列表struct files_struct *files;        // 进程打开的文件信息struct fs_struct *fs;              // 文件系统信息// 其他字段...
};

Liunx下对应的进程状态,这里我们主要解释一下几个常见的状态。 

static const char * const 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"运行状态

        在Linux操作系统中,进程的"R"状态表示进程正在运行或准备运行。这意味着进程当前正在使用CPU,或者在就绪队列中等待被调度。

当一个进程处于"R"状态时,它可能正在执行以下操作之一:
1. 正在执行:进程正在CPU上执行其指令。
2. 可运行:进程已经准备好执行,但由于其他进程正在运行,它正在等待调度器给它分配CPU时间。
3. 运行队列中的等待:进程可能因为系统负载较高,导致多个进程竞争CPU时间,因此它在运行队列中等待。

        在Linux中,"R"状态是一种动态状态,进程可以在"R"状态和其他状态(如 "S" 或 "D" )之间切换。例如,一个进程可能会因为等待某些资源(如输入操作完成)而进入睡眠状态,当这些资源变得可用时,进程将被唤醒并返回到 "R" 状态。

【R+】状态:当用ps命令查看进程的状态时,如果进程的状态显示为"R+"

  • R (running): 进程正在运行或可运行。

  • +: 进程是前台进程组的成员。(该进程在前台运行)

前台进程和后台进程

前台进程:

        前台进程是用户当前正在与之交互的进程。它是用户直接控制和输入的进程,通常是在终端(shell)中运行的程序。

        用户可以通过键盘输入与前台进程交互,前台进程的输出会直接显示在用户的终端上。

        用户在终端中运行的文本编辑器、编译器等。

后台进程:

        后台进程是那些启动后不在用户当前工作终端上接收输入和显示输出的进程。后台进程通常用于执行不需要用户交互的任务,例如后台运行编译作业或下载文件。

        运行方法:通过在命令后加上&符号,可以将命令直接以后台方式运行。例如:command &


        在Linux中,每个终端会话都有一个前台进程组,包含一个或多个进程。前台进程组中的进程可以接收来自用户的输入信号(如键盘输入),并且它们的输出会显示在用户的屏幕上。特点:只有前台进程组中的进程才能读取终端输入和向终端写入输出。

2.2 "S" 休眠状态

        进程的"S"状态表示进程正在睡眠(Sleep)(浅度睡眠),进程在等待某个条件或事件(例如I/O操作完成)。在这个状态下,进程不占用CPU资源,处于等待状态。

        当进程调用某个阻塞型系统调用(如read()write()wait()等)时,会进入"S"状态,直到系统调用完成或事件发生。

2.3 "D" 休眠状态(深度)

        进程的"D"状态表示进程深度睡眠(Deep Sleep)(深度睡眠)进程处于不可中断的睡眠状态,通常是在等待一个无法中断的重要I/O操作。这种状态下,进程不能被信号中断。

2.4 "T" 停止状态

        进程已停止,通常是因为接收到停止信号(如SIGSTOP)。进程暂停执行,等待进一步的信号(如SIGCONT)来恢复执行。

        当一个进程接收到'SIGSTOP'、'SIGTSTP'(通常是Ctrl+Z组合键)'SIGTTIN'或'SIGTTOU'信号时(用”kill "命令或系统调用),它将进入" T "状态,处于停止状态的进程暂时不会被执行,但它的资源(如内存和文件描述符)通常仍然被保留

2.4 "Z" 僵尸状态

        Linux操作系统中,进程的" Z "状态表示僵尸状态,在僵尸状态下的进程称为:僵尸进程(Zombie)。进程已终止,但其父进程尚未读取其退出状态。在这种状态下,进程的资源尚未完全释放,仍在进程表中保留一条记录。

要理解僵尸状态,首先要理解下面概念:
1. 进程创建

        每个进程创建:由内核PCB(进程控制块)和进程的代码与数据组成,它们都占据内存空间。

2. 进程退出

        进程退出时,需要释放其PCB、代码和数据所占用的内存空间。退出信息(如退出状态码)会由操作系统写入当前退出进程的PCB中,以供父进程读取。

【退出信息】记录着程序是否正常退出,还是出现异常了。

3. PCB的保留:

        尽管进程的代码和数据空间可以被释放,但PCB不能立即释放,因为父进程或操作系统需要读取进程的退出信息。父进程可以通过调用wait()waitpid()系统调用来读取退出信息。


那么何谓僵尸进程?

僵尸进程

  • 子进程执行完毕并退出,但其父进程未读取其退出状态时,该进程处于僵尸状态。

  • 僵尸进程保留其PCB结构,以便父进程能够读取其退出信息。

  • 僵尸进程的状态为Z,表示它已经终止但仍在进程表中保留记录,直到父进程读取其退出状态。

        通常,父进程应该负责回收其子进程的状态信息。如果父进程没有正确地回收子进程,那么子进程就会进入僵尸状态
        虽然单个僵尸进程对系统的影响很小,但如果系统中存在大量的僵尸进程,它们可能会耗尽进程表的空间(内存泄漏),影响新进程的创建。 

2.5 孤儿进程

        Linux系统中,孤儿进程是指其父进程已经结束,但该进程仍在运行的子进程。当父进程结束后,这些孤儿进程会被"init"进程(在大多数Linux系统中,PID为1)领养,并将孤儿进程的父进程ID(PPID)设置为1。孤儿进程被1号 init 进程领养,也由 init 进程回收,因此孤儿进程不会变成僵尸进程。孤儿进程的管理通常不需要用户干预。

孤儿进程与僵尸进程的区别

  • 孤儿进程:仍在运行的子进程,其父进程已经结束。它们会被系统的"init"进程接管。

  • 僵尸进程:已结束但尚未被其父进程回收的进程(父进程仍在运行)。僵尸进程在进程表中保留了其退出状态,等待父进程通过wait()waitpid()系统调用来读取和清理。

三、进程优先级 

3.1 概念

进程优先级:确定cpu资源分配的先后顺序,就是指进程的优先权(priority)。

  • 进程的优先权决定了进程获得CPU资源的先后顺序。优先权高的进程会比优先权低的进程更早获得CPU时间。

  • 通过设置进程的优先权,可以在多任务环境中优化系统性能,使关键任务优先得到执行。

进程优先级命令: 

ps -la

 

注意到其中的几个重要信息,有下:
UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值(下面详解)

3.2优先级的调整 

Linux进程的优先级 PRI范围:60 ~ 99  (默认)优先级:80
Linux是支持动态优先级调整的,但不运行直接修改PRI的数字,我们通过修改nice值来达到修改优先级目的

nice值:进程优先级的修正数据。

范围是从-20 ~ 19(默认)nice值:0 【其中-20是最高优先级,19是最低优先级。】

优先级计算:

PRI(新) = PRI(old) + nice 

old PRI 每次修改都是从80修改的。

【注意】只有特权用户(通常是root)才能设置负的nice值,从而提高进程的优先级。

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

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

相关文章

UE材质节点Fresnel

Fresnel节点 ExponentIn 控制边缘透明度 BaseReflectFractionIn 控制中心透明度

LeetCode100之搜索二维矩阵(46)--Java

1.问题描述 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回…

“AI 自动化效能评估系统:开启企业高效发展新征程

在当今数字化飞速发展的时代,企业面临着日益激烈的市场竞争,如何提升效率、降低成本成为了企业生存与发展的关键。AI 自动化效能评估系统应运而生,它如同一把智能钥匙,为企业开启了高效发展的新征程。 AI 自动化效能评估系统&…

primitive 编写着色器材质

import { nextTick, onMounted, ref } from vue import * as Cesium from cesium import gsap from gsaponMounted(() > { ... })// 1、创建矩形几何体,Cesium.RectangleGeometry:几何体,Rectangle:矩形 let rectGeometry new…

提供的 IP 地址 10.0.0.5 和子网掩码位 /26 来计算相关的网络信息

网络和IP地址计算器 https://www.sojson.com/convert/subnetmask.html提供的 IP 地址 10.0.0.5 和子网掩码位 /26 来计算相关的网络信息。 子网掩码转换 子网掩码 /26 的含义二进制表示:/26 表示前 26 位是网络部分,剩下的 6 位是主机部分。对应的子网掩码为 255…

Linux 服务器挖矿木马防护实战:快速切断、清理与加固20250114

Linux 服务器挖矿木马防护实战:快速切断、清理与加固 引言 挖矿木马作为一种常见的恶意软件,对服务器资源和安全构成严重威胁。据安全机构统计,2023 年全球约 45%的 Linux 服务器遭受过挖矿木马攻击,平均每台被感染服务器每月造…

6.1 MySQL数字函数和条件函数

以前我们在课程中使用过一些mysql的内置函数,比如说四舍五入的round函数,做日期计算的data, datediff函数等等。那么本次课程咱们就来系统的学习一下mysql的这些内置函数,我们使用编程语言写程序的时候,通常会把某一项业务功能封装…

【如何从0到1设计测试用例使用Fiddler完成弱网测试】

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 ⭐⭐⭐测试用…

Oracle EBS GL定期盘存WIP日记账无法过账数据修复

系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状 用户反映来源为“定期盘存”和类别为“WIP”的日记账无法过账,标准日记账的界面上的过账按钮灰色不可用。但是,在超级用户职责下,该日记账又可以过账,细心检查发现该业务实体下有二个公司段值15100和…

【Axure视频教程】中继器表格——拖动排序

今天教大家在Axure用中继器制作拖动排序效果的原型模板,我们可以通过拖动的方式,将对应的行摆放到任意位置,效果如下图所示: 这个原型模板是用中继器制作的,所以使用也很简单,只需要在中继器表格里填写对应…

python学opencv|读取图像(三十一)缩放图像的三种方法

【1】引言 前序学习进程中,我们至少掌握了两种方法,可以实现对图像实现缩放。 第一种方法是调用cv2.resize()函数实现,相关学习链接为: python学opencv|读取图像(三)放大和缩小图像_python opencv 读取图…

Elasticsearch:使用全文搜索在 ES|QL 中进行过滤 - 8.17

8.17 在 ES|QL 中引入了 match 和 qstr 函数,可用于执行全文过滤。本文介绍了它们的作用、使用方法、与现有文本过滤方法的区别、当前的限制以及未来的改进。 ES|QL 现在包含全文函数,可用于使用文本查询过滤数据。我们将回顾可用的文本过滤方法&#xf…

Java 0114学习总结

1.如何解决线程安全问题 当多个线程共享一个资源时,则可能出现线程安全问题。java中解决线程安全的方式有三种: ①同步代码快 ②同步方法 ③Lock锁 1.1同步代码块 synchronized(锁对象){ 需要同步的代码。 } ①synchronized 同步的意思; ②锁…

【Unity-Animator】通过 StateMachineBehaviour 实现回调

StateMachineBehaviour 简介 StateMachineBehaviour是一个基类,所有状态脚本都派生自该类。它可以在状态机进入、退出或更新状态时执行代码,而无需编写自己的逻辑来测试和检测状态的变化。这使得开发者可以更方便地处理状态转换时的逻辑,例…

解决 VSCode 调试时 Python 文件出现相对路径报错问题‘FileNotFoundError’

文章目录 1. 问题描述2. 解决方法 1. 问题描述 在使用 VSCode 进行 Python 开发时,遇到一个的问题:在调试模式下,程序无法读取文件或路径,导致File Not Found Error 错误。然而,当不使用调试模式而是直接运行 Python 文…

OpenCV的TIF红外可见光融合算法

一、简介 首先TIF是Two-Scale Image Fusion的缩写,论文《Two-Scale Image Fusion of Infrared and Visible Images Using Saliency Detection (TIF)》,作者在论文中提到TIF算法主要通过以下三个步骤实现融合: 图像分解,图像分解使…

scrapy爬取图片

scrapy 爬取图片 环境准备 python3.10scrapy pillowpycharm 简要介绍scrapy Scrapy 是一个开源的 Python 爬虫框架,专为爬取网页数据和进行 Web 抓取而设计。它的主要特点包括: 高效的抓取性能:Scrapy 采用了异步机制,能够高效…

Sentaurus TCAD学习笔记:transform指令

目录 一、transform指令简介二、transform指令的实现1.cut指令2.flip指令3.rotate指令4.stretch指令5.translate指令6.reflect指令 三、transform指令示例 一、transform指令简介 在Sentaurus中,如果需要对器件进行翻转、平移等操作,可以通过transform指…

国内源快速在线安装qt5.15以上版本。(10min安装好)(图文教程)

参考文章:Qt6安装教程——国内源-CSDN博客 1、在国内源上下载qt在线安装工具 NJU Mirror 2、 将下载好的在线安装工具,放到C盘根目录, 2.1 打开windows Powershell(WinX),下边那个最好。 输入两条指令&a…

LSA更新、撤销

LSA的新旧判断&#xff1a; 1.seq&#xff0c;值越大越优先 2.chksum&#xff0c;值越大越优先 3.age&#xff0c;本地的LSA age和收到的LSA age作比较 如果差值<900s&#xff0c;认为age一致&#xff0c;保留本地的&#xff1a;我本地有一条LSA是100 你给的是400 差值小于…