【Linux系统编程】进程状态

介绍

        进程的状态指的是进程在执行过程中所处的状态。进程的状态随着进程的执行和外界条件的变化而转换。我们可用 kill 命令来进程控制进程的状态。

        kill中的 kill -l 指令用于查看系统中定义的所有信号及其对应的编号。这些信号可以用于 kill 命令来向进程发送特定的信号控制其状态。例如,kill - 9 命令会向进程发送 SIGKILL 信号,强制终止进程,kill -19 命令会向进程发送 SIGSTOP 信号,使进程进入暂停状态,如同 Ctrl+Z 组合键的效果,kill -18 命令用于向进程发送 SIGCONT 信号,使进程从暂停状态恢复执行,如同 Ctrl+C 组合键的效果。


系统下的进程主流状态

        进程在系统中主流的四个主要状态:运行状态、排队状态、阻塞状态、挂起状态。

运行状态

        首先,要说明,系统内部的所有进程不是一次性执行完毕的,而是在内部排队等待某种资源。

        进程只要在运行队列里或正在被CUP正在执行时,此进程就处于运行状态。部分教材中可能会说明有创建状态、就绪状态、阻塞状态等,这几种状态其实都是跟进程放入运行队列有关。

排队状态

        由于大部分计算机中只有一个CUP,而一个CUP一次只能运行一个进程队列,所以在Linux系统内核中,所有进入状态的进程必须依次“ 排队 ”等待,这里的“ 排队 ”并不是进程自己在“ 排队 ”等待,而是进程的 tast_struct 结构体在进行“ 排队”等待被CUP执行。

        其实不光是等待CPU执行时需要排队,在进程等待某种资源时,也会处于排队状态。如外设等。这里的排队等待,不像一般数据结构中的排队等待,而是将 task_struct 结构体嵌入到运行队列中,系统通过地址偏移量来进行访问里面的属性数据。具体实现如下:

        总的来说,进程的排队状态是指进程在等待被执行或等待获取资源时所处的一种状态。在排队状态下,进程会被放入相应的队列中,等待其前面的进程释放资源或完成其任务,当多个进程同时请求系统资源时,操作系统会根据一定的调度算法将这些进程按照一定的顺序排列,以便按照一定的优先级逐个分配资源。

阻塞状态

        阻塞状态是进程的执行过程中一种暂停状态,此时进程放弃处理机而处于暂停状态。当进程处于阻塞状态时会排成一个队列,形成这种情况通常是因为进程在等待某个事件的发生。如,当我们的进程在进行等待软硬件资源的时候,资源如果没有就绪,我们的进程task_struct 只能将自己设置为阻塞状态,并将自己的pcb连入等待的资源提供的等待队列。

挂起状态

        进程的挂起状态是指一个进程由于某些原因暂时不能执行,而被系统挂起来,等待以后执行。在这种状态下,进程不会占用内存空间,也不会被调度执行,进程只是被存储在磁盘上。这种状态通常发生在系统资源不足或者进程等待某些事件时发生。当条件允许时,被挂起的进程就会被操作系统再次调回内存,重新进入等待被执行的状态,即就绪态。


前台进程与后台进程   

        前台进程和后台进程是操作系统中的两种进程类型,它们在运行状态和行为上存在显著差异。一般情况下,进程中的可执行程序直接运行是前台进程,当在执行可执行程序时,在后面加上“ & ”符号,就变成了后台进程。前台进程和后台进程在进程状态符观察出。当查看进程状态时,若状态符后面有“ + ”号,此进程表示前台进程,若状态符后面没有“ + ”号,此进程表示后台进程。    

        通常情况下,前台进程可以直接使用键盘上的 Ctrl+C 来终止,但后台进程则需要使用特定的命令,如“ kill -9 [PID] ”来终止。因此,当我们设为后台进程时,用户必须要获取该进程的PID。


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

        R运行状态:表示进程正在处于系统的运行状态,与上面的运行状态效果一样,并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

        S睡眠状态:进程在等待某件事件完成而进入睡眠。这种睡眠状态如同阻塞状态,有时候也叫做可中断睡眠,可直接用键盘进行中断。

        D磁盘休眠状态:这种状态有时候也叫不可中断睡眠状态,它用于资源管理。当进程的PCB指针放入磁盘结构体的队列中时,如果内存紧张,操作系统可能需要终止一些后台进程来缓解内存压力。但是,如果正在写入磁盘的数据很重要,直接终止可能会导致不良后果。此时将进程置于D状态可以确保即使在内存紧张的情况下,操作系统也不会终止它,直到IO操作完成。

        T停止状态:表示进程被暂定,如同 kill -19 命令停止运行进程。此状态也可理解为阻塞状态的分支。

        t停止状态:表示进程处于跟踪状态而暂定,通常用于调试目的。

注意:状态T和状态t都是表示进程被停止,其中,状态T停止是常规控制停止,而状态t停止是因为深入跟踪导致进程停止,通常用于调试。

        X死亡状态:此状态表示进程已经结束,并且可以被回收的状态。当一个进程完全结束执行,并且系统已经回收了其资源时,该进程就会进入X状态,因此,这个状态只是一个返回状态,我们不会在任务列表里看到这个状态。

        Z僵尸状态:表示一个进程已经结束执行,但其父进程还没有读取它的退出状态信息。在这种情况下,该进程会以终止状态保持在进程表中,等待父进程读取其退出状态代码。

        当一个进程退出时,它会将退出信息保存在task_struct中,供父进程或操作系统读取。如果父进程在子进程退出后仍然存在,但没有读取子进程的退出状态信息,子进程就会进入Z状态。处于Z状态的进程不会占用CPU资源,但会占用进程表中的一个槽位和内存,直到其父进程读取了其退出状态信息并对其进行回收,因此,僵尸进程可能会造成内存资源的浪费,有一定的危害。以下代码的子进程就为僵尸进程。

#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
    pid_t id = fork();
    if (id == 0)  //子进程
    {
        int n = 5;
        while (n)
        {
            cout << "PID: " << getpid() << "   " << "PPID: " << getppid() << endl;
            sleep(1);
            n--;
        }
        exit(0);  //子进程退出
    }
    while (1)  //父进程运行
    {
        cout << "PID: " << getpid() << "   " << "PPID: " << getppid() << endl;
        sleep(1);
    }
    return 0;
}


孤儿进程

        孤儿进程是指一个进程的父进程已经终止,而该进程还在运行。

        由于孤儿进程原有的父进程已不存在,所以,孤儿进程通常由init进程(进程号为1)收养,并由init进程对它们完成状态收集工作。因此,孤儿进程并不会有什么危害。以下是孤儿进程的代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
    pid_t id = fork();
    if (id < 0) 
    {
        perror("fork");
        return 1;
    }
    else if (id == 0)   //子进程
    {
        cout << "I am child, pid : " << getpid() << endl;
        sleep(5);
    }
    else  //父进程
    {
        cout << "I am child, pid : " << getpid() << endl;
        sleep(5);
        exit(0);
    }
    return 0;
}

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

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

相关文章

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Toast组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Toast组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Toast组件 Toast 的应用场景也非常广泛&#xff0c;比如网络请求出错了可以弹一个…

鸿蒙开发(二)- 鸿蒙DevEco开发环境搭建

上篇说到&#xff0c;鸿蒙开发目前势头旺盛&#xff0c;头部大厂正在如火如荼地进行着&#xff0c;华为也对外宣称已经跟多个厂商达成合作。目前看来&#xff0c;对于前端或客户端开发人员来说&#xff0c;掌握下鸿蒙开发还是有些必要性的。如果你之前是从事Android开发的&…

论文阅读<CF-YOLO: Cross Fusion YOLO for Object Detection in Adverse Weather.....>

论文链接&#xff1a;https://arxiv.org/pdf/2309.08152.pdfhttps://arxiv.org/pdf/2206.01381.pdfhttps://arxiv.org/pdf/2309.08152.pdf 代码链接&#xff1a;https://github.com/DiffPrompter/diff-prompter 目前没有完整代码放出。 恶劣天气下的目标检测主要有以下三种解…

Stable Diffusion系列(三):网络分类与选择

文章目录 网络分类模型基座模型衍生模型二次元模型2.5D模型写实风格模型 名称解读 VAELora嵌入文件放置界面使用 网络分类 当使用SD webui绘图时&#xff0c;为了提升绘图质量&#xff0c;可以多种网络混合使用&#xff0c;可选的网络包括了模型、VAE、超网络、Lora和嵌入。 …

引用jquery.js的html5基础页面模板

本专栏是汇集了一些HTML常常被遗忘的知识&#xff0c;这里算是温故而知新&#xff0c;往往这些零碎的知识点&#xff0c;在你开发中能起到炸惊效果。我们每个人都没有过目不忘&#xff0c;过久不忘的本事&#xff0c;就让这一点点知识慢慢渗透你的脑海。 本专栏的风格是力求简洁…

使用LLaMA-Factory微调ChatGLM3

1、创建虚拟环境 略 2、部署LLaMA-Factory &#xff08;1&#xff09;下载LLaMA-Factory https://github.com/hiyouga/LLaMA-Factory &#xff08;2&#xff09;安装依赖 pip3 install -r requirements.txt&#xff08;3&#xff09;启动LLaMA-Factory的web页面 CUDA_VI…

Java经典框架之Spring MVC

Spring MVC Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Spring MVC 入门案例 2. 基…

JVS低代码平台:多级菜单配置的详细教程与演示

多级菜单是软件系统一种常见的用户界面设计&#xff0c;它允许用户通过点击或选择不同的菜单项来执行不同的操作或访问不同的功能。多级菜单通常由多个级别的菜单组成&#xff0c;每个级别都包含一组可选择的菜单项。用户可以通过点击或选择菜单项来进入下一级菜单&#xff0c;…

【MYSQL】MYSQL 的学习教程(七)之 慢 SQL 优化思路

1. 慢 SQL 优化思路 慢查询日志记录慢 SQLexplain 分析 SQL 的执行计划profile 分析执行耗时Optimizer Trace 分析详情确定问题并采用相应的措施 1. 慢查询日志记录慢 SQL 如何定位慢SQL呢&#xff1f; 我们可以通过 慢查询日志 来查看慢 SQL。 ①&#xff1a;开启慢查询日志…

vr虚拟高压电器三维仿真展示更立体全面

VR工业虚拟仿真软件的应用价值主要体现在以下几个方面&#xff1a; 降低成本&#xff1a;通过VR技术进行产品设计和开发&#xff0c;可以在虚拟环境中进行&#xff0c;从而减少对物理样机的依赖&#xff0c;降低试错成本和时间。此外&#xff0c;利用VR技术构建的模拟场景使用方…

蓝桥杯-Excel地址[Java]

目录&#xff1a; 学习目标&#xff1a; 学习内容&#xff1a; 学习时间&#xff1a; 题目&#xff1a; 题目描述: 输入描述: 输出描述: 输入输出样例: 示例 1: 运行限制: 题解: 思路: 学习目标&#xff1a; 刷蓝桥杯题库日记 学习内容&#xff1a; 编号96题目Ex…

Find My文具盒|苹果Find My技术与文具盒结合,智能防丢,全球定位

文具盒&#xff0c;学生用来装钢笔、铅笔、尺子、橡皮等文具的盒子。质地种类很多&#xff0c;一般有木质、铁质、塑料等制品&#xff0c;形状各异&#xff0c;多为长方体形状。文具盒能培养学生的管理能力。使用文具盒的过程就是一个管理自己的过程。每次使用文具之前&#xf…

Android/iOS APP备案流程指南

Android/iOS APP备案流程指南 摘要 本文通过详细介绍了工信部对移动互联网应用程序&#xff08;APP&#xff09;备案的要求&#xff0c;解释了APP备案的定义、时间节点、办理流程以及腾讯云、阿里云的备案流程&#xff0c;最后提供了常见问题的解答。 引言 随着移动互联网的…

docker部署kafka zookeeper模式集群

单机模式链接&#xff1a;https://blog.csdn.net/wsdhla/article/details/133032238 kraft集群模式链接&#xff1a;部署Kafka_kafka 部署-CSDN博客 zookeeper选举机制举例&#xff1a; 目前有5台服务器&#xff0c;每台服务器均没有数据&#xff0c;它们的编号分别是1,2,3,4,5…

博客摘录「 Apollo安装和基本使用」2023年11月27日

一、常见配置中心对比 Spring Cloud Config: https://github.com/spring-cloud/spring-cloud-configApollo: https://github.com/ctripcorp/apolloNacos: https://github.com/alibaba/nacos 对比项目/配置中心 spring cloud config apollo nacos(重点) 开源时间 2014.9 …

Vue使用Element表格Table设置所有单元格内容居中对齐

为单个列的单元格设置居中对齐代码如下&#xff1a; <el-table-columnprop"productInfo.productName"label"中文名"width"100"align"center"></el-table-column>需要设置el-table-column标签里面的属性设置为align"c…

开源分布式搜索引擎ElasticSearch结合内网穿透远程连接

文章目录 前言1. Windows 安装 Cpolar2. 创建Elasticsearch公网连接地址3. 远程连接Elasticsearch4. 设置固定二级子域名 前言 简单几步,结合Cpolar 内网穿透工具实现Java 远程连接操作本地分布式搜索和数据分析引擎Elasticsearch。 Cpolar内网穿透提供了更高的安全性和隐私保…

基于XLA_GPU的llama7b推理

环境 pytorch-tpu/llamapytorch 2.1.2(cuda117)torch-xla 2.1.1 # llama2 git clone --branch llama2-google-next-inference https://github.com/pytorch-tpu/llama.git # pytorch git clone https://github.com/pytorch/pytorch.git git checkout v2.1.2 # 部分仓库可能下载…

LeetCode刷题---单词规律

解题思路&#xff1a; 首先分别将pattern字符串转为字符数组p&#xff0c;将s字符串根据" "切割为字符串数组s1&#xff0c;判断两个数组的长度是否相等&#xff0c;如果不相等&#xff0c;则返回false。之后对两个数组的每个元素与哈希表做比对&#xff0c;哈希表的…

redis cluster判断key属于那个分片。

一、判断阿里云 redis cluster&#xff0c;的key属于那个分片。 阿里云特有的命令info key 可以查看key属于那个slot&#xff0c;那个分片 命令行查看&#xff1a; xxxx:6379> info key xxxx_compressed_xxx slot:4941 node_index:9 xxxx:6379> cluster keyslot xxxx_…