Linux进程(三) --- 状态和优先级

news2025/1/26 15:30:14

运行,阻塞,挂起

运行 (Running)

当一个进程处于运行状态时,它正在使用CPU执行指令。进程在以下两种情况下可能被认为是运行状态:

  1. 实际运行(Running on CPU): 进程当前正在CPU上执行。
  2. 可运行(Runnable): 进程准备好运行,只是在等待CPU资源。

在任务管理器中,处于运行状态的进程通常会显示为R

阻塞 (Blocked)

当一个进程被阻塞时,它正在等待某些事件完成,无法继续执行。阻塞通常发生在进程需要等待某种资源的情况,例如:

  • 等待I/O操作完成(如读取文件或网络数据)
  • 等待某个信号或条件变量

在任务管理器中,阻塞状态的进程通常会显示为D(不可中断的睡眠)或S(可中断的睡眠)。

挂起 (Suspended)

挂起状态表示进程已被暂停,暂时停止了运行。挂起可以通过以下方式发生:

  • 显式挂起(Suspended by signal): 进程收到一个挂起信号(如SIGSTOP),并停止执行,直到收到继续信号(如SIGCONT)。
  • 后台挂起(Suspended by job control): 用户在shell中使用命令(如Ctrl+Z)将前台进程挂起并转入后台。

在任务管理器中,挂起状态的进程通常会显示为T(stopped by job control signal)。

总结

  • 运行(Running): 进程正在使用CPU或准备使用CPU。
  • 阻塞(Blocked): 进程在等待某个事件或资源。
  • 挂起(Suspended): 进程已被暂停,等待继续执行的信号。

进程的状态与切换

  • 运行(Running):

    R (Running): 进程正在CPU上运行或准备运行。
  • 可中断睡眠(Interruptible Sleep):

    S (Sleeping): 进程正在等待某个事件(如I/O操作)完成,可以被信号中断唤醒。
  • 不可中断睡眠(Uninterruptible Sleep):

    D (Uninterruptible sleep): 进程在等待某个无法中断的事件(如设备I/O操作)完成,通常不会响应信号。
  • 停止(Stopped):

    T (Stopped): 进程已被停止,可以由用户或调试器发出信号(如SIGSTOP)造成。
  • 僵尸(Zombie):

    Z (Zombie): 进程已终止,但其进程表项仍然保留,等待父进程读取其退出状态。
  • 挂起(Suspended):

    挂起状态是停止状态的一种表现,通常是通过Ctrl+ZSIGSTOP信号实现的。

进程状态切换的方法

进程状态之间的切换是由内核根据进程的行为和系统事件进行管理的。常见的状态切换及其触发条件如下:

  • 从运行(Running)到可中断睡眠(Sleeping):

    • 进程执行阻塞I/O操作,如读写文件,等待网络数据等。
    • 调用系统调用如sleep()select()poll()或等待某个事件。
  • 从可中断睡眠(Sleeping)到运行(Running):

    • I/O操作完成或事件发生,唤醒等待的进程。
    • 进程收到一个信号,导致其从睡眠状态被中断。
  • 从运行(Running)到不可中断睡眠(Uninterruptible sleep):

    • 进程执行某些不可中断的系统调用或等待硬件设备响应。
  • 从不可中断睡眠(Uninterruptible sleep)到运行(Running):

    • 不可中断的系统调用或硬件设备操作完成,进程重新变为可运行。
  • 从运行(Running)到停止(Stopped):

    • 进程收到SIGSTOPSIGTSTP(由Ctrl+Z触发)等信号。
    • 用户在调试过程中手动暂停进程。
  • 从停止(Stopped)到运行(Running):

    • 进程收到SIGCONT信号,继续执行。
  • 从运行(Running)到僵尸(Zombie):

    • 进程正常退出(调用exit()),但其父进程尚未调用wait()waitpid()读取其退出状态。
  • 从僵尸(Zombie)到终止(Terminated):

    • 父进程调用wait()waitpid()读取僵尸进程的退出状态后,僵尸进程彻底从系统中移除。

僵尸进程

什么是僵尸进程?

僵尸进程是已经终止执行但仍然在进程表中保留的进程。它保留在进程表中的原因是为了让其父进程读取它的退出状态。这种状态的进程不会占用系统资源(如CPU和内存),但会占用一个进程表项。

僵尸进程的产生

当一个进程结束时(通过调用exit()或返回main()函数),操作系统会清理它所占用的大部分资源,但仍会保留一个记录,包括进程的退出状态。这是因为Unix-like系统采用了父子进程关系的机制,父进程需要通过调用wait()waitpid()系统调用来读取子进程的退出状态。

具体步骤如下:

  1. 子进程终止: 子进程调用exit()终止运行。
  2. 内核保留进程信息: 内核会保留子进程的退出状态和其他信息,以便父进程读取。
  3. 子进程进入僵尸状态: 子进程的状态变为僵尸状态,直到父进程读取它的退出状态。
  4. 父进程读取退出状态: 父进程调用wait()waitpid()读取子进程的退出状态,内核随即清理僵尸进程的剩余信息,从进程表中移除该进程。

为什么会有僵尸进程?

僵尸进程存在的主要原因是确保父进程能够得到子进程的退出信息。这对于进程间通信和进程管理非常重要。通过这种机制,父进程可以知道子进程是正常终止还是由于错误终止,并可以基于此信息进行相应的处理。

僵尸进程的问题

虽然僵尸进程本身不占用大量系统资源,但大量的僵尸进程会导致进程表项耗尽,从而阻止系统创建新进程。因此,管理僵尸进程非常重要。

如何处理僵尸进程?

  • 确保父进程读取子进程的退出状态: 父进程应该使用wait()waitpid()系统调用来处理子进程的退出状态。如果父进程没有执行这一步,子进程就会变成僵尸进程。
  • 孤儿进程和init进程: 如果父进程终止而没有处理子进程的退出状态,子进程会成为孤儿进程。孤儿进程会被init进程(PID为1)接管,init进程会自动处理这些子进程的退出状态,从而避免僵尸进程的产生。
  • 信号处理: 可以通过设置父进程的信号处理函数,当子进程终止时捕获SIGCHLD信号并调用waitpid()来处理退出状态。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>

void handle_sigchld(int sig) {
    // 使用waitpid处理所有已终止的子进程
    while (waitpid(-1, NULL, WNOHANG) > 0) {
        // Nothing to do here
    }
}

int main() {
    signal(SIGCHLD, handle_sigchld);  // 注册SIGCHLD信号处理程序

    pid_t pid = fork();
    if (pid < 0) {
        perror("fork failed");
        exit(1);
    } else if (pid == 0) {
        // 子进程
        printf("Child process: %d\n", getpid());
        exit(0);
    } else {
        // 父进程
        printf("Parent process: %d\n", getpid());
        sleep(10);  // 让父进程等待足够长的时间
    }

    return 0;
}

孤儿进程

孤儿进程(Orphan Process)是指其父进程已经终止,而它自身仍然在运行的进程。当一个进程终止时,其子进程不会自动终止,而是会变成孤儿进程。为了确保系统的稳定性和资源的合理利用,孤儿进程会被系统中的一个特殊进程,即init进程(PID为1)接管。

孤儿进程的处理

当孤儿进程被init进程接管后,init进程会成为这些孤儿进程的新父进程,并负责处理它们的退出状态,避免它们变成僵尸进程。

具体过程

  1. 父进程终止: 一个进程终止而其子进程仍在运行。
  2. 孤儿进程产生: 子进程因为其父进程终止而成为孤儿进程。
  3. init进程接管: 操作系统会将孤儿进程的父进程重新设置为init进程。
  4. init进程处理: 当这些孤儿进程终止时,init进程会调用wait()waitpid()读取它们的退出状态,从而防止它们变成僵尸进程。

示例

下面是一个简单的C语言示例,演示了孤儿进程的产生过程:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

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

    if (pid < 0) {
        // fork失败
        perror("fork failed");
        exit(1);
    } else if (pid == 0) {
        // 子进程
        printf("Child process, PID: %d, Parent PID: %d\n", getpid(), getppid());
        sleep(5);  // 保持子进程运行一段时间,确保父进程先终止
        printf("Child process after sleep, PID: %d, New Parent PID: %d\n", getpid(), getppid());
        exit(0);
    } else {
        // 父进程
        printf("Parent process, PID: %d\n", getpid());
        exit(0);  // 父进程立即终止
    }

    return 0;
}

在这个示例中:

  1. 父进程创建一个子进程。
  2. 父进程终止,而子进程保持运行。
  3. 子进程在睡眠5秒后醒来,并输出其新的父进程PID,此时父进程已经是init进程。
    输出示例:
    
    Parent process, PID: 12345
    Child process, PID: 12346, Parent PID: 12345
    Child process after sleep, PID: 12346, New Parent PID: 1
    

    在输出中可以看到,子进程最初的父进程PID是原父进程的PID,当原父进程终止后,子进程的父进程PID变为1,即init进程。

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

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

相关文章

ES6之数值的扩展

1. 数值的扩展 1.1. 二进制和八进制字面量表示:1.2. 数值判断方法: 1.2.1. Number.isFinite() 检查一个值是否为有限的数值。1.2.2. Number.isNaN() 更准确地检测NaN值。1.2.3. 传统的全局方法 isFinite() 和 isNaN() 的区别 1.3. 数值转换方法:1.4. 整数检查与精度: 1.4.1. Nu…

UDP多对多组播通信

广播和多播仅应用于UDP。TCP是一个面向连接的协议&#xff0c;TCP一定是点对点的&#xff0c;一点是两个主机来建立连接的&#xff0c;TCP肯定是单播。只有UDP才会使用广播和组播。 如下示例实现一个UDP多对多的组播通信&#xff0c;进程中有收、发两个线程&#xff0c;分别表…

数字水印 | 奇异值分解 SVD 的定义、原理及性质

目录 1 为什么使用 SVD&#xff1f;2 SVD 的定义是什么&#xff1f;2.1 特征值分解2.2 奇异值分解 3 如何求解奇异值 SV&#xff1f;3.1 求解过程3.2 证明过程 4 什么是 SVD 的性质&#xff1f; 参考博客&#xff1a; Python 机器学习笔记&#xff1a;奇异值分解&…

Java入门基础学习笔记23——For循环结构

1、for循环&#xff1a; 控制一段代码反复执行很多次。 2、For循环语句的基本结构&#xff1a; for(初始化表达式&#xff1b;判断表达式&#xff1b;递增&#xff08;递减&#xff09;表达式&#xff09; {循环体语句&#xff08;重复执行的代码&#xff09; } 例&#xff1…

积温空间分布数据、气温分布数据、日照数据、降雨量分布、太阳辐射数据、地表径流数据、土地利用数据、npp数据、ndvi数据

引言 积温是某一时段内逐日平均气温之和,它是研究植物生长、发育对热量的要求和评价热量资源的一种指标,是影响植物生长的重要因素之一&#xff0c;对指导农业生产和生态建设具有非常重要的意义。作为重要的气候资源&#xff0c;积温与其它资源的区别在于存在很大的地域差异和时…

【再探】设计模式—桥接模式、组合模式及享元模式

结构型设计模式描述了对象与类之间的关系。适配器模式及装饰器模式主要用于接口适配及功能增强&#xff0c;而桥接模式模式则是为了减少类的数量&#xff0c;组合模式让部分与容器能被客户端统一对待处理&#xff0c;享元模式则是用于节约系统内存&#xff0c;提高系统性能。 …

kk聊天室系统源码搭建-自适应手机电脑-秒级响应-群体消息

kk聊天室系统源码搭建-自适应手机电脑-秒级响应-群体消息-单体消息 可以无限创建聊天室&#xff0c;可以把单个聊天室链接拿出来单独使用&#xff0c;消息秒级响应&#xff0c;支持设置屏蔽词。 具体仔细看视频演示&#xff0c;不提供演示&#xff0c;因为青狐资源网会员用户太…

第25次修改留言板,修改了布局,样式和脚本分离

伤心城市 首页 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"beiwanglu" content"widthdevice-width, initial-scale1.0"><link rel"stylesheet" type&qu…

每周题解:牛的旅行

题目描述 牛的旅行 农民John的农场里有很多牧区。有的路径连接一些特定的牧区。一片所有连通的牧区称为一个牧场。但是就目前而言&#xff0c;你能看到至少有两个牧区不连通。 现在&#xff0c;John想在农场里添加一条路径 ( 注意&#xff0c;恰好一条 )。对这条路径有这样的…

宁静致远(“静”)

宁静致远是一个成语&#xff0c;读音为nng jng zh yuǎn&#xff0c;意思是只有心境平稳沉着、专心致志&#xff0c;才能厚积薄发、 有所作为。出自《淮南子:主术训》。 出处 宁静致远张铭篆刻 此句最早出自西汉初年道家刘安的《淮南子:主术训》&#xff0c;蜀汉丞相诸葛亮的…

​学者观察 | 从区块链应用创新看长安链发展——CCF区块链专委会荣誉主任斯雪明

导语 2024年1月27日&#xff0c;斯雪明教授在长安链发布三周年庆暨生态年会上发表演讲&#xff0c;认为在区块链发展过程中&#xff0c;不仅需要技术创新&#xff0c;同时需要有价值、有特色、有示范意义的应用创新。斯雪明教授介绍了国内区块链技术与应用发展的现状、趋势与挑…

C++ I/O流(一)——输出流

一、IO流概念 IO流可分为输入流和输出流,用于从设备(如键盘、文件、网络等)读取数据或向设备写入数据。C++标准库提供了丰富的IO流类,包括iostream、fstream、stringstream等,分别用于处理控制台输入输出、文件输入输出和字符串流操作。 读操作:输入流中读取数据到程序中…

CTFshow 爆破

第一题0 抓包发现输入账号密码后数据包会多一个base64编码 所有推出用户密码在传输的时候进行了加密 所以爆破时也用base64加密 设置paylod 用题目给的字典 在添加两条规则 第一个是增加前缀 admin: 第二个是使得payload进行base64编码 取消URL编码字符 因为会把号编码了 开…

C# .Net8 switch 的用法

在 .net 8中&#xff0c;switch 不需要再和传统的写法一样了&#xff0c;会更加的方便 创建一个 .net 8 控制台项目 switch 的写法没必要和以前一样 namespace SwitchTest {internal class Program{static void Main(string[] args){int day 3;var week day switch{1 > &…

SAP_ABAP-思考篇

作为一个SAP十年左右的从业者&#xff0c;其实我很清楚&#xff0c;我自身的能力&#xff0c;确实是很多东西都会一点&#xff0c;但是没有一样是精通的。坦白来说&#xff0c;我的个人简介里&#xff0c;虽然也不算夸大&#xff0c;但我估计有些新手小白看着可能会觉得还挺厉害…

21【Aseprite 作图】画白菜

1 对着参考图画轮廓 2 缩小尺寸 变成这样 3 本来是红色的描边&#xff0c;可以通过油漆桶工具&#xff08;取消 “连续”&#xff09;&#xff0c;就把红色的轮廓线&#xff0c;变成黑色的 同时用吸管工具&#xff0c;吸取绿色和白色&#xff0c;用油漆桶填充颜色 4 加上阴影…

论文阅读-《MHFormer: Multi-Hypothesis Transformer for 3D Human Pose Estimation》

目录 1 摘要 2 介绍 3 相关工作 3.1 3D HPE 3.2 ViT 3.3 多假设方法 4 MHFormer 4.1 概述 4.2 准备阶段 4.2.1 多头自注意力机制&#xff08;MSA&#xff09; 4.2.2 多层感知器&#xff08;MLP&#xff09; 4.3 MHG-多假设生成 4.3.1 概述 4.3.2 详细解释&#x…

基于Vue和uni-app的增强型多选框Checkbox组件开发

基于Vue和uni-app的增强型多选框&#xff08;Checkbox&#xff09;组件开发 摘要 随着前端技术的不断发展和用户体验要求的提升&#xff0c;传统的Checkbox组件已不能满足所有需求。本文介绍了一种基于Vue和uni-app的增强型多选框&#xff08;Checkbox&#xff09;组件的开发…

一文了解人工智能AI、大模型、AI大模型、ChatGPT、GPT-4、OpenAI、Claude 3...

AI是什么&#xff1f; 首先&#xff0c;AI是什么&#xff1f; 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。 是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 简单来说就是模拟人类行为…

Linux文件系统详解

&#x1f30e;Linux文件系统 文章目录&#xff1a; Linux文件系统 简单认识磁盘 文件系统       磁盘线性结构抽象       文件系统存储方法 inode Table         inode Bitmap         Data Block         Block Bitmap         …