进程的概念之进程的状态

不逼你自己一把,你怎么知道自己行不行

文章目录

  • 进程状态看看Linux内核怎么说
    • 进程状态查看
  • 僵尸进程
    • 僵尸进程的危害
  • 孤儿进程
  • 进程优先级

进程状态看看Linux内核怎么说

为了弄明白正在进行的进程是什么意思,究竟怎样才算正在运行的进程,比如说一个人的状态可能在工作也有可能在睡觉,那么我们进程也是也有着运行状态休眠状态。

那么首先我们要知道一个进程可以有几个状态,(在Linux内核中进程有时候也叫做任务)
下面的状态再kerne(包含内核管理的核心代码)l源代码里定义

/*
* 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):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
    我们来挑重点来谈几个状态

首先就是D状态也就是磁盘休眠状态这里的意思其实很简单也就是说在一个进程想要访问某个资源的时候而这些资源却不可用的时候那么该进程就会进入D状态,那么我给大家举一个列子,比如说A进程正在向文件中写入一个很大很大的数据,这时候B进程想要访问该文件可是该文件目前正在被写入数据那么此时B进程就需要先进入磁盘休眠状态来等待该文件的写入完成从而访问该文件。


S状态,s状态也叫做可唤醒睡眠状态那么此时我们就比较容易理解了,他和T状态是有不同的比如说T状态的进程你是不能唤醒的但是S状态的进程是可以被唤醒的比如说父进程创建了一个子进程并等待子进程结束,而子进程进入一个睡眠状态比如说sleep(10)等待10秒钟。在这期间,父进程通过 waitpid 等待子进程的结束。子进程虽然处于S状态,但如果收到信号(例如SIGCHLD),它会被中断并被唤醒。在实际情况中,进程可能会因为等待I/O操作、等待信号、等待锁或其他事件而进入可中断睡眠状态。在这种状态下,如果相应的事件发生或者进程收到中断信号,它就有可能被唤醒。这种状态对于系统的资源管理是很有用的,因为它允许系统更好地处理各个进程的资源需求

代码实列

#include <stdio.h>
#include <unistd.h>
int main() {
    // 创建一个子进程
    pid_t child_pid = fork();
    if (child_pid == -1) {
        perror("Error creating child process");
        return 1;
    }
    if (child_pid == 0) {
        // 子进程在这里执行
        sleep(10);
        return 0;
    } else {
        // 父进程在这里执行
        // 父进程等待子进程结束
        waitpid(child_pid, NULL, 0);
        return 0;
    }
}

T/t状态:这两种状态呢其实到了现在区别已经很少了,T:表示进程被停止,通常是由于接收到了SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU等信号。这种状态意味着进程暂时被挂起,不再执行,等待进一步的命令以继续执行。t:表示进程是一个跟踪进程(traced process)。通常,这是由调试器(如gdb)使用 ptrace 系统调用追踪的进程。被追踪的进程会在收到SIGSTOP信号时进入小写t状态。

进程状态查看

命令:ps aux / ps axj 命令
下面这个图片是进程收到信号的一系列状态
在这里插入图片描述

僵尸进程

  • 僵尸状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
  • 僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
    • 接下来创建一个能维持30s的僵尸进程
    int main()
    {
        pid_t id = fork();    if(id < 0){
            perror("fork");        return 1;    }
        else if(id > 0){ //parent
            printf("parent[%d] is sleeping...\n", getpid());        sleep(30);
        }else{
            printf("child[%d] is begin Z...\n", getpid());
            sleep(5);
            exit(EXIT_SUCCESS);
        }
        return 0;
    }
    

    僵尸进程的危害

    进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
    维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!
    那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空
    间!
    内存泄漏?是的!

    孤儿进程

    父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?父进程先退出,子进程就称之为“孤儿进程”
    孤儿进程被1号init进程领养,当然要有init进程回收喽。

    int main()
    {
        pid_t id = fork();
        if(id < 0){
            perror("fork");
            return 1;
        }
        else if(id == 0){//child
            printf("I am child, pid : %d\n", getpid());        sleep(10);
        }else{//parent
            printf("I am parent, pid: %d\n", getpid());        sleep(3);
            exit(0);
        }
        return 0;
    }
    

    进程优先级

    cpu资源分配的先后顺序,就是指进程的优先权(priority)。
    优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AutoPDMS10.6.4在win10上启动情况

中国电子系统某建筑设计院软件升级&#xff0c;win10机子&#xff0c;装AutoPDMS10.6.4&#xff0c;管理员身份启动或双击启动&#xff0c;都是如下提示&#xff1a; 把VC的插件安装&#xff0c;重新安装&#xff0c;且看杀毒软件是否屏蔽&#xff08;win10都没装杀毒软件&…

SL3036国产新品 48V/60V电动车里程增程器供电芯片

随着电动车的普及&#xff0c;里程焦虑成为了很多电动车用户面临的问题。为了解决这个问题&#xff0c;SL3036国产新品应运而生&#xff0c;它是一款48V/60V电动车里程增程器供电芯片。这款芯片的出现&#xff0c;为电动车用户提供了更加可靠的续航里程&#xff0c;让他们在出行…

VUE项目快速打包发布

VUE项目快速打包发布 首先在你的VS Code中新建一个终端 输入 npm run build 回车等运行结束之后会在你的项目中生成一个dist目录 此时再iis部署的时候把你添加的网站指定的目录指向dist即可

迅为RK3588开发板编译 Buildroot单独编译图形化界面(编译 buildroot)

第四步&#xff1a;编译 buildroot 首先在 linux 源码目录下输入以下命令进入编译的 UI 界面&#xff0c;进入之后如下所示&#xff1a; ./build.sh 然后将光标移动到第三个 rootfs&#xff0c;点击回车会进入到文件系统镜像选择界面&#xff0c;如下图所示&#xff1a; 这里…

知存科技助力AI应用落地:WTMDK2101-ZT1评估板实地评测与性能揭秘

文章目录 一、前言二、深入了解存算一体技术2.1 什么是存算一体2.2 存算一体技术发展历程2.3 基于不同存储介质的存内计算芯片性能比较 三、国产存算一体&#xff0c;重大进展3.1 知存科技&#xff1a;我国存算一体领域的研发领导者 四、知存科技新型 WTM2101 SOC 评估板使用评…

数据库-数据结构

数据库-数据结构 一、B-树、B树、B*树1 B-树2 B树3 B*树 二、AVL树1 左旋2 右旋3 LL4 RR5 LR6 RL 三、红黑树1 插入操作1.1 父节点是黑色1.2 父节点是红色且叔父节点是红色1.3 父节点是红色且叔父节点是黑色 2 删除操作2.1 有2个孩子2.1 有1个孩子2.3 没有孩子2.3.1 节点为红色…

DOM 的 diff 算法

经典面试题&#xff1a; 1&#xff09;react/vue中的 key 有什么作用&#xff1f;&#xff08;key的内部原理是什么&#xff1f;&#xff09; 2&#xff09;为什么遍历列表时&#xff0c;key 最好不用 index&#xff1f; 1、虚拟dom中key的作用&#xff1a; 1&#xff09; 简…

Python GUI库大汇总

所有程序都是基于命令行的&#xff0c;这些程序可能只有一些“专业”的计算机人士才会使用。例如前面编写的五子棋等程序&#xff0c;恐怕只有程序员自己才愿意玩这么“糟糕”的游戏&#xff0c;很少有最终用户愿意对着黑乎乎的命令行界面敲命令。 相反&#xff0c;如果为程序…

联想小新M7268一体机常用功能和操作步骤

联想小新M7268黑白激光多功能打印一体机&#xff0c;小身材、大智慧&#xff0c;小心M7268身材十分娇小&#xff0c;净尺寸方面为350*275*135mm&#xff08;长*宽*高&#xff09;&#xff08;手工测量&#xff09;&#xff0c;在实际使用时&#xff0c;小新M7268所占空间要略大…

Linux平台建立GB28181设备模拟器

目录 下载模拟器解决动态库缺少问题运行模拟器抓包参考资料 在没有GB28181摄像机的情况下,在Linux虚拟机中模拟出一台GB28181摄像机用于调试和学习. 下载模拟器 到网站下载Linux 平台版本: https://www.happytimesoft.com/download.html tar -zxvf happytime-gb28181-device…

使用 Docker 部署 Halo 博客系统

:::info 项目地址&#xff1a;https://github.com/halo-dev/halo ::: 一、Halo 介绍 1&#xff09;Halo 简介 Halo 是一款强大易用的开源建站工具&#xff0c;它让你无需太多的技术知识就可以快速搭建一个博客、网站或者内容管理系统。具备可插拔架构、主题套用、富文本编辑器…

基于Springboot的私人健身与教练预约管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的私人健身与教练预约管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三…

某侠网js逆向wasm解析

本次目标地址如下&#xff0c;使用base64解密获得 aHR0cHM6Ly93d3cud2FpbWFveGlhLm5ldC9sb2dpbg 打开网址&#xff0c;本次的目标是登录接口&#xff0c;如下图 本文主要讲解wasm的解析&#xff0c;所以对其他参数不做逆向处理&#xff0c;本次由wasm加密的参数只有sign一个&a…

分布式存储

1 存储基础 1.1 单机存储设备 DAS&#xff08;直接附加存储&#xff0c;是直接接到计算机打的主板总线上去的存储&#xff09; UDE、SATA、SCSI、SAS、USB接口的磁盘 所谓的接口就是一种存储设备驱动下的磁盘设备&#xff0c;提供块级别的存储 NAS&#xff08;网络附加存储…

BLHeli_S 代码分析---BLHeli.asm入口函数pgm_start分析

BLHeli_S 代码分析—BLHeli.asm入口函数pgm_start分析 pgm_start 代码 代码中数据变量定义 Bit_Access: DS 1Flash_Key_1: DS 1 ; Flash key one Flash_Key_2: DS 1 ; Flash key twoAIKON_Boltlite_30A.inc文件中定义的变量 LOCK_BYTE_ADDRESS_16K EQU 3FFFh ; Ad…

苹果最新系统iOS 17的调试和适配方法 - Xcode 14.3.1 真机调试指南

最近苹果发布了iOS 17作为其最新操作系统版本&#xff0c;作为开发者&#xff0c;你可能需要了解如何在Xcode 14.3.1中进行真机调试和适配。本文将为你详细介绍步骤和注意事项。 I. 检查Xcode版本 在开始之前&#xff0c;确保你已经安装了Xcode 14.3.1或更高版本。你可以在Xco…

APP广告变现设置合理的广告频次的原因

过多的广告展示可能会导致用户体验下降&#xff0c;而过少则可能会降低广告收入&#xff0c;我们需要的是找到其中的平衡点。 广告频次限制可以通过多种方式实现&#xff0c;比如限制某段时间内广告出现的次数、限制某个用户在一定时间内看到广告的次数等。在实践中&#xff0…

SpringBoot+SSM项目实战 苍穹外卖(12) Apache POI

继续上一节的内容&#xff0c;本节是苍穹外卖后端开发的最后一节&#xff0c;本节学习Apache POI&#xff0c;完成工作台、数据导出功能。 目录 工作台Apache POI入门案例 导出运营数据Excel报表 工作台 工作台是系统运营的数据看板&#xff0c;并提供快捷操作入口&#xff0c…

【目标检测实验系列】YOLOv5模型改进:融入坐标注意力机制CA,多维度关注数据特征,高效涨点!(内含源代码,超详细改进代码流程)

自我介绍&#xff1a;本人硕士期间全程放养&#xff0c;目前成果:一篇北大核心CSCD录用,两篇中科院三区已见刊&#xff0c;一篇中科院四区在投。如何找创新点&#xff0c;如何放养过程厚积薄发&#xff0c;如何写中英论文&#xff0c;找期刊等等。本人后续会以自己实战经验详细…

免费开源OCR 软件Umi-OCR

Umi-OCR 是一款免费、开源、可批量的离线 OCR 软件&#xff0c;基于 PaddleOCR&#xff0c;适用于 Windows10/11 平台 免费&#xff1a;本项目所有代码开源&#xff0c;完全免费。方便&#xff1a;解压即用&#xff0c;离线运行&#xff0c;无需网络。高效&#xff1a;自带高效…
最新文章