进程生命周期

进程生命周期

Linux是多任务操作系统,系统中的每个进程能够分时复用CPU时间片,通过有效的进程调度策略实现多任务并行执行。进程在被CPU调度运行,等待CPU资源分配以及等待外部事件时会处于不同的状态。进程状态如下:

  • 创建状态:创建新进程;
  • 就绪状态:进程获取可以运作所有资源及准备相关条件;
  • 执行状态:进程正在CPU中执行操作;
  • 阻塞状态:进程因等待某些资源而被跳出CPU;
  • 终止状态:进程消亡;
[新建][就绪][运行][终止]
           ↑       ↓
           └── [阻塞] ←─┘

linux内核中进程状态

内核进程状态定义如下。

/* Used in tsk->state: */
#define TASK_RUNNING			0x0000 // 运行或就绪
#define TASK_INTERRUPTIBLE		0x0001 // 可中断睡眠,也叫轻度睡眠,可被信号或资源就绪唤醒
#define TASK_UNINTERRUPTIBLE		0x0002 // 深度睡眠,仅由资源就绪唤醒(不可被信号中断)
#define TASK_KILLABLE           (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE) // 0x0102,中度睡眠,能被kill信号打断
#define __TASK_STOPPED			0x0004
#define __TASK_TRACED			0x0008
/* Used in tsk->exit_state: */
#define EXIT_DEAD			0x0010 // 进程完全终止(资源已回收)
#define EXIT_ZOMBIE			0x0020 // 进程已终止,但父进程未回收其资源(wait() 未调用)
#define EXIT_TRACE			(EXIT_ZOMBIE | EXIT_DEAD)

进程状态查询方法

  • **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">ps</font>**/**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">top</font>**
  • **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">cat /proc/<PID>/status</font>**

<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">ps</font>/<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">top</font> 显示的进程状态

符号**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">ps</font>**/**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">top</font>**状态对应内核状态场景描述
RRunning**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">TASK_RUNNING</font>**进程正在运行或就绪(等待CPU调度)。
SSleeping**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">TASK_INTERRUPTIBLE</font>**可中断睡眠
DUninterruptible**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">TASK_UNINTERRUPTIBLE</font>**不可中断睡眠
TStopped**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">__TASK_STOPPED</font>**进程被暂停(如收到**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">SIGSTOP</font>****<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">SIGTSTP</font>**信号)。
tTraced**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">__TASK_TRACED</font>**进程被调试器(如gdb)追踪(通常在断点处暂停)。
ZZombie**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">EXIT_ZOMBIE</font>**僵尸进程(已终止但父进程未回收资源)。
XDead**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">EXIT_DEAD</font>**
(极少在**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">ps</font>**中看到)
进程完全终止(资源已回收,通常瞬间状态)。
IIdle(内核线程的特殊标记)内核空闲线程。

僵尸进程

进程已终止执行,但其父进程尚未调用 **wait()** 系统调用来回收它的资源(主要是退出状态信息)。 这样的进程称为僵尸进程

进程状态为 Z(Zombie)。

进程已经执行完成,但是没有释放pid,task_struct等资源。

系统pid资源是有限的,大量僵尸进程会耗尽系统pid。

下面是僵尸进程测试代码。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();

    if (pid == 0) {
        printf("子进程退出\n");
        exit(0);  // 子进程终止
    } else {
        sleep(60);  // 父进程没有调用 wait()
    }

    return 0;
}

结果如下。

root@VM:~$ ps aux | grep zom
root    10106  0.0  0.0   2364   576 pts/4    S+   17:20   0:00 ./zombie_process_test
root    10107  0.0  0.0      0     0 pts/4    Z+   17:20   0:00 [zombie_process_] <defunct>

孤儿进程

进程的父进程已经提前退出,而该进程仍然在运行。 这种进程称为孤儿进程。

孤儿进程执行完后会被init进程回收。一般不会产生危害。

下面是孤儿进城的测试代码。

#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();

    if (pid == 0) {
        sleep(60); // 子进程继续运行
        printf("我是子进程,父进程已经退出\n");
    } else {
        printf("父进程退出\n");
        exit(0); // 父进程终止
    }

    return 0;
}

参考资料

  1. Professional Linux Kernel Architecture,Wolfgang Mauerer
  2. Linux内核深度解析,余华兵
  3. Linux设备驱动开发详解,宋宝华
  4. linux kernel 4.12
基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值