理解Linux中的进程状态

news2025/1/16 5:53:44

文章目录

      • 运行状态
      • 阻塞状态
      • 挂起状态
      • 磁盘睡眠状态
      • 暂停状态
      • 追踪停止状态
      • 僵尸状态
      • 死亡状态
      • 孤儿状态
      • Linux内核进程状态源代码

一台电脑一般只有一个CPU、一个磁盘(无论一台电脑有几个CPU、磁盘,数量都是远少于进程的,这里举例用一个)。

运行状态

而一个CPU同时只能调度一个进程,所以操作系统就维护起了一个运行队列runqueue,在这个队列中排队的进程就称为运行(R)状态,并不是正在被CPU调度的进程称为运行(R)状态。

#include <stdio.h>
int main()
{
    while(1);
    return 0;
}

截屏2022-12-25 15.07.22

阻塞状态

假设我们的某些进程想要访问磁盘,而由于CPU的速度非常快,磁盘的速度非常慢,那么当CPU执行完5个进程,磁盘连一个进程都没执行完,所以就会导致,CPU执行完的需要访问磁盘的进程就需要排队,所以操作系统又维护了一个等待队列waitqueue,在磁盘中排队的都进程都会在这个队列中,当进程访问完磁盘后,该进程又会重新去runqueue排队。而在这个队列中排队的进程就称为阻塞(S)状态

#include <stdio.h>
#include <unistd.h>
int main()
{
    while(1)
    {
        sleep(1);
        printf("hello world\n");
    }
    return 0;
}

截屏2022-12-25 15.17.01

这里有一个很违反直觉的现象,输出hello world怎么每次都是S状态?这是因为CPU的速度太快了!而磁盘的速度太慢了!所以当ps命令去查该进程状态的时候会有99%的几率查到的都是S状态,因为99%的时间都在等待IO。

挂起状态

有一个状态在Linux中未显式写出来,但教材中会经常提到,就是挂起状态。假设现在有很多进程都在访问磁盘,但是内存中的空间不够了,于是操作系统就会将一些在waitqueue的进程的程序代码和数据保存到磁盘上(PCB仍在waitqueue中),而这样的进程状态就称为挂起状态,该状态其实更应该被称为阻塞挂起状态,因为挂起状态可以和任意状态组合,比如运行挂起状态、就绪挂起状态、暂停挂起状态等等。

磁盘睡眠状态

假设有大量的进程在等待IO,而此时内存空间严重不足,操作系统挂起了很多进程也无济于事,这时操作系统很容易崩溃,为了防止操作系统杀掉这些在等待IO的进程(可能有重要的数据),于是在这种情况下的这种进程就会转为磁盘睡眠(D)状态,在该状态下的进程是不会被杀掉的,只能通过重启或者断电的方式。

暂停状态

#include <stdio.h>
#include <unistd.h>
int main()
{
    while(1)
    {
        sleep(1);
        printf("hello world\n");
    }
    return 0;
}

一个进程是可以被暂停的,在Linux下使用kill -19 目标进程PID命令可以使目标进程暂停,此时进程的状态会转为暂停(T)状态

截屏2022-12-25 15.34.00

kill -18 目标进程PID可以解除T状态。

截屏2022-12-25 15.36.37

这时会发现,原本的状态是S+,后来经过T状态后,变为了S。其实带有+号的状态是前台进程,不带的是后台进程,而后台进程是无法用ctrl+c信号来终止的,只能通过kill -9命令。

追踪停止状态

当我们调试程序的时候,该进程也总是处于暂停状态的,但并不是上面的使用kill命令导致的暂停状态,在Linux中该状态称为追踪停止(t)状态

截屏2022-12-25 15.43.47

僵尸状态

进程可以派生子进程,一个子进程在结束时,需要告诉父进程我的任务完成的怎么样,而父进程需要去接收该信息(终止状态),如果父进程不接收终止状态,则会导致子进程的PCB一直无法释放(代码和数据释放了),而在这段时间内,该子进程的状态就为僵尸(Z)状态,也称为僵尸进程,该进程会导致内存泄漏。

#include <stdio.h>
#include <unistd.h>
int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        //child
        printf("I am child, pid = %d, ppid = %d\n", getpid(), getppid());
    }
    else if(id > 0)
    {
        //parent
        printf("I am parent, pid = %d, ppid = %d\n", getpid(), getppid());
        while(1)
        {
            //死循环,不接收子进程的终止状态
        }
    }
    else 
    {
        //error
    }
    return 0;
}

截屏2022-12-25 15.51.51

死亡状态

Linux中还有一个死亡(X)状态,处在该状态的进程就表明该进程马上就执行完了,没什么好说的。

孤儿状态

上面说到的僵尸状态是由于子进程执行完了,而父进程没有及时接收子进程的终止状态导致的,那么如果父进程先执行完,子进程后执行完的话,这时由于父进程已经执行完了,所以无法接受子进程的终止状态,但子进程的终止状态必须有人来接受,所以此时操作系统(1号Init进程)就会领养该子进程,以便能够接受子进程的终止状态,而处于被操作系统领养的进程所处的状态就称为孤儿状态, 也称为孤儿进程。

截屏2022-12-25 16.01.23

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[] = {

	/* states in TASK_REPORT: */
	"R (running)",		/* 0x00 */
	"S (sleeping)",		/* 0x01 */
	"D (disk sleep)",	/* 0x02 */
	"T (stopped)",		/* 0x04 */
	"t (tracing stop)",	/* 0x08 */
	"X (dead)",		/* 0x10 */
	"Z (zombie)",		/* 0x20 */
        
};

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

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

相关文章

2022年广西食品安全管理员模拟试题及答案

百分百题库提供食品安全管理员考试试题、食品安全管理员考试预测题、食品安全管理员考试真题、食品安全管理员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 一、单选题 1.&#xff08;重点&#xff09;《上海市集体用餐配…

深度对比MemcacheD 和 Redis,论你不知道的二三事

谈到深度对比MemcacheD 和 Redis&#xff0c;作为老牌程序员首先想到的就是Memcache好一点&#xff0c;毕竟更节省内存。还可以存图片视频之类的&#xff0c;大部分市面上的cache都是MemcacheD。 但是评价一款cache并不能只看这一方面不是~ 数据存储的安全系数 要知道&#…

2023春招面试题:Redis数据库面试题整理

redis是什么&#xff1f;&#xff08;必会&#xff09; Redis 是 C 语言开发的一个开源的&#xff08;遵从 BSD 协议&#xff09;高性能非关系型&#xff08;NoSQL&#xff09;的&#xff08;key-value&#xff09;键值对数据库。可以用作数据库、缓存、消息中间件等。 redis…

STM32F103学习

目录 1、框架了解 2.GPIO &#xff08;1&#xff09;开漏输出与推挽输出 &#xff08;2&#xff09;基本知识了解 HAL库函数&#xff1a; 配置流程&#xff1a; &#xff08;3&#xff09;按键实验&#xff1a;STM32的按键开发基础_哔哩哔哩_bilibili 3、时钟 时钟框图…

力扣(leetcode)经典题目分享第3期——栈和队列

栈和队列一. 选择题1.1 进出栈顺序1.2 循环队列1.3 队列的基本运算1.4 循环队列的有效长度二. OJ练习题2.1 括号匹配问题2.2 用队列实现栈2.3 用栈实现队列2.4 循环队列总结&#xff1a;一. 选择题 1.1 进出栈顺序 若进栈序列为 1,2,3,4 &#xff0c;进栈过程中可以出栈&…

unreal编译源码搭建dedicated server的流水账——但是细

参考视频&#xff1a; B站的视频&#xff1a; https://www.bilibili.com/video/BV1wk4y1m7wz/?spm_id_from333.337.search-card.all.click&vd_sourced33b44674c517c8b7928e8d3ac316b37 YouTube的视频&#xff1a; https://www.youtube.com/watch?vAKiGajA7AXM 和上面的视…

基于STM32CUBEMX驱动多个VL6180X

概述 VL6180X是基于ST FlightSense™专利技术的最新产品。这是一个突破性的技术&#xff0c;实现了独立于目标反射率的绝对距离测量。现有技术通过测量反射光的光量来估算距离&#xff0c;这种方法的最大缺点是被测物体的颜色和表面对测量精度影响很大&#xff0c;而VL6180X则…

云端办公后,协同软件也能轻松做好项目管理

最近很多朋友在后台问我&#xff0c;数字化移动办公环境下如何做好项目管理&#xff0c;但是问题不够聚焦&#xff0c;所以我决定从自己的理解出发&#xff0c;分享一下项目管理的一些心得。需要说明的是&#xff0c;传统项目管理和互联网项目管理存在很大的差异&#xff0c;尤…

MyBatis源码(二)如何执行sql

前言 接着environmentElement获取数据源信息后&#xff0c;同级执行代码的mappersElement。 Mybatis源码&#xff08;三&#xff09;如何操作数据库 MyBatis源码&#xff08;二&#xff09;如何执行sql Mybatis源码&#xff08;一&#xff09;获取数据源 结构小结 分析ma…

Leetcode 2. 两数相加(高精度加法模板)

Leetcode 2. 两数相加 题目 思路 链表从头开始存放数据的个位十位 百位新建一个链表C&#xff0c;将链表A和B每一个相加的结果存放在C中&#xff0c;注意加法的进位 代码 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode n…

实力领航|万应智谷云平台成功入选2022中国互联网大会“互联网助力经济社会数字化转型”特色案例

近日&#xff0c;以“发展数字经济 促进数字文明”为主题&#xff0c;由工业和信息化部、深圳市人民政府主办&#xff0c;中国互联网协会、广东省通信管理局、深圳市工业和信息化局等单位承办的2022&#xff08;第二十一届&#xff09;中国互联网大会在深圳国际会展中心召开。开…

【超多代码、超多图解】Node.js一文全解析

目录一、Node.js简介1.1什么是Node.js1.2 Node.js可以做什么1.3 Node.js的安装1.4 Node.js的使用二、模块化处理2.1 什么是模块化2.2 内置模块2.2.1 fs文件系统模块&#xff08;1&#xff09;基本用法&#xff08;2&#xff09;防止动态拼接(3)路径问题2.2.2 path内置模块2.2.3…

前缀函数与KMP算法

一&#xff0c;前缀函数 1&#xff0c;定义 该函数存储一个字符串的各个长度的子串真前缀与真后缀相等的长度&#xff08;注意&#xff0c;真前缀最多长度为n-1&#xff0c;不包含最后一个字符&#xff0c;真后缀同理&#xff0c;不包含第一个字符&#xff09; 用p[i]数组储…

【LeetCode每日一题】——744.寻找比目标字母大的最小字母

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 二分查找 二【题目难度】 简单 三【题目编号】 744.寻找比目标字母大的最小字母 四【题目描述…

【小5聊】基础算法 - 实现字符串1到N位长度的组合关键词

在本篇文章中&#xff0c;我们讲一起了解下基础算法的运用 在程序开发里&#xff0c;算法无处不在&#xff0c;掌握算法才能更好的提高程序效率和质量 【算法返回效果】 【实现的功能描述】 当前算法主要实现输入一定长度的字符串后&#xff0c;能够返回按顺序1个字符长度、…

第二证券|七位投资专家指点2023 战略性看好A股 市场将提供更多机会

2022年行将收官&#xff0c;2023年新征途行将开启。 阅历了本年的一波三折、震动大跌&#xff0c;2023年A股商场将怎么演绎&#xff1f;有哪些时机值得注重&#xff1f;哪些危险要素需求留意&#xff1f; 对此&#xff0c;我国基金报记者专访了来自公募、券商资管、私募的七位…

Vjudge如何绑定洛谷账号

因为洛谷不支持Vjudge的bot提交&#xff0c;一个学弟问我才发现。要绑定洛谷账号才能在vj本地提交&#xff0c;绑定的方法也很奇怪&#xff0c;方法如下。 在题目来自洛谷的题目界面点击提交&#xff0c;出现如下界面。 发现没有bot提交选项&#xff0c;只能选择My Account,点…

NetInside网络攻击分析帮您轻松发现网络异常

分析概述 分析概述从以下四点做介绍。 故障信息来源 根据网络管理老师提供信息&#xff0c;29日上午7点半到9点时分&#xff0c;网络出现过故障。 分析对象 使用NetInside全流量分析系统对改故障进行分析。 分析思路 1、对比分析故障时段与非故障时段总流量信息。 2、对…

硬盘数据恢复的方法有哪些?这五种恢复方法你知道吗

硬盘通常泛指电脑硬盘&#xff0c;也可以将其定义为电脑数据的“载体”。硬盘的主要作用是存储数据&#xff0c;它具有读写速度快、耗能低、体积小等优势&#xff0c;但是在使用过程中&#xff0c;总会遇到硬盘数据丢失问题&#xff0c;比如受病毒感染、误格式化、误删除、操作…

C++中的多态(概念篇)

多态的概念 通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某一个行为&#xff0c;不同的对象去完成时会产生出不同的状态。比如最常见的买票&#xff0c;学生为半价&#xff0c;成人为全票。 多态的分类 静态的多态&#xff1a;如函数重载&#xff0c;看起…