• Linux进程之进程的状态简述


    1.百度搜索

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.对进程状态的认识

    一个进程所具有的状态为操作系统的进程状态设计提供了理论依据。实际上不同的操作系统设计不同的进程状态

    2.0创建状态

    当一个进程被创建但没有入队列,即代码和数据被拷贝➕建立PCB结构体➕ 为其分配一个唯一的进程标识符(PID)[不是不就绪的状态]实际上 linux内核不存在这种状态 这种状态只是为了更好的理解而描述的 在实际中 一个进程被创建后就会入运行队列

    2.1就绪状态

    进程已经满足运行条件,PCB进入CPU运行队列,排队等待系统分配CPU资源

    2.2运行状态

    PCB被调度到CPU运行队列中且已被分配CPU资源。只有运行状态下的进程才能占用CPU资源

    2.3阻塞状态

    阻塞状态

    1. 当一个进程因需要等待某些非CPU资源就绪无法继续执行时,就会进入阻塞状态。如: 等待用户输入、等待磁盘IO操作完成等。在阻塞状态下,进程会被调度到阻塞队列,不会占用CPU资源。只有当进程所等待的非CPU资源就绪后,进程才会从阻塞队列调度到运行队列(就绪状态)。
    2. 系统中存在各种资源: CPU 网卡 磁盘 显卡 等
    3. 系统中不只是存在一种队列 : CPU配套的运行队列 阻塞队列等
    4. 当运行队列某一进程需要使用磁盘资源比如要向磁盘写数据或必须使用磁盘进行操作 此时处于运行队列的这个进程会被安排到磁盘配套队列的后面排队
    5. 当磁盘配套的进程的第一个轮到访问进程时 此进程会插队到CPU的运行队列 CPU会执行当前进程对应的代码 这段代码的目的就是向磁盘写数据
    6. 当一个本处于CPU运行队列的进程因需要访问磁盘而去磁盘配套进程排队时 此时CPU会执行后面的其他进程 而此时等待磁盘资源就绪的那些进程 组成的队列叫阻塞队列
    7. 阻塞队列中的进程不是在等待CPU 所以无法称他们处于运行态 我们称他们处于 阻塞状态
    8. CPU被很多进程占满了资源或者 进程等待某种资源 长时间等不到调度
      在这里插入图片描述
      在这里插入图片描述

    2.4挂起状态

    1. 当内存快不足时,操作系统会将长时间不执行或者处于低优先级状态的进程的代码和数据置换出内存并存储到磁盘上的SWAP分区中。
    2. PCB(进程控制块)仍存在进程表中。
    3. 被置换到磁盘中的进程的状态就叫做挂起。
    4. 挂起状态只是进程的一种状态,表示进程暂时无法执行,仍然需要保留进程的信息以便后续恢复执行。

    目的意义作用

    释放内存资源,给其他进程提供执行机会。

    挂起状态

    1. 和进程访问某种资源关系不大
    2. 是内核和操作系统需要维护的状态

    挂起状态的认识

    在这里插入图片描述

    1. 由于进程太多 内存快被占满时 操作系统会将长时间不执行/无法执行(等待资源) 的进程的代码和数据 移到磁盘 (一个专门的分区[SWAP分区])
    2. 此时内存中只有一个PCB在
    3. 被移出的进程的状态就是挂起状态
    4. 处于挂起状态的进程需要运行时 不是把PCB放到运行队列 而是先把此进程的代码和数据从磁盘移回内存
    5. 挂起状态/阻塞状态和CPU无关

    磁盘的SWAP分区会满吗?

    1. OS进行置换有成本: 进行IO工作 会影响效率 OS不太喜欢进行置换 除非迫不得已
    2. 如果磁盘趋于满 此时OS为了让进程得以执行 置换工作极为频繁 OS效率大幅下降 --> 宕机

    3.认识LinuxOS下的进程

    在这里插入图片描述

    3.0进程状态的简述

    1. R运行状态(running): 进程正在运行或者在运行队列中等待
    2. S睡眠状态(sleeping) /可中断睡眠(interruptible sleep): 即阻塞状态 进程在等待某事件完成 (可被唤醒/中断 如程序中在执行sleep(10); 时 发送kill -19 PID信号)[(阻塞、挂起)]
    3. D休眠状态(Disk sleep)/不可中断睡眠状态(uninterruptible sleep): 磁盘休眠/进程休眠 进程通常会等待IO的结束(不可被中断 不可被唤醒)[(IO阻塞、IO挂起)]
    4. T信号暂停状态(stopped): 发送 SIGSTOP 信号来暂停进程。可以发送 SIGCONT 信号让进程继续运行。
    5. t调试暂停状态(tracing stop):进程被调试器(如gdb)跟踪调试,暂停了进程的执行。调试器设置了断点或执行了单步调试操作
    6. X死亡/终止状态(dead):多个进程终止 OS需要一个一个回收 但也是一瞬间的 瞬时性很强 只是一个返回状态,无法在任务列表看到这个状态。
    7. Z僵尸状态(zombie):一个已经终止的子进程,但其 父进程/OS 尚未检测到子进程的退出状态。
    • 不允许OS释放 处于一个被检测的状态]
    • 维持该状态 让父进程/OS识别并回收
    • 僵尸进程不会占用系统资源,已经终止并释放了大部分资源。
    • 僵尸进程只在进程表中保留一条记录,以便父进程在需要时获取子进程的退出状态。

    3.1了解R/S状态

    以下代码执行时 状态是S+

    while(1)
    {
       printf("hello linux!\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    1. 向显示器(外设)输出数据 显示器不一定准备好 即便准备好 也要等待数据 进程在阻塞队列中待的时间比运行队列长 表现为当前进程为阻塞状态
    2. 如果注释掉printf("hello linux!\n"); 进程的状态变为R+ 不需要访问外设 只运行代码 : 运行状态(可能在运行队列中等待可能正在被CPU调度/执行)

    以下代码执行时 状态是S+

    int a = 0;
    sacnf("%d", &a);
    while(1)
    {
       printf("hello linux!\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    等待输入 – 阻塞状态 S+

    +号: 当前进程处于前台进程: 无法执行命令cmd 命令行解释器无法解释命令 可以ctrl+c终止 如何让他在后台执行?

    ./ test &.

    如何杀死这个进程?

    kill -9 PID

    3.2D深度睡眠状态

    在这里插入图片描述
    为了省电省钱 企业会在午夜将磁盘转速降低 但是如果此时有大量进程需要访问磁盘 (状态为D) 而磁盘IO效率低下 将有更多的进程处于D状态 此时服务器压力过大 而OS又无法杀死他们 有可能造成OS昏迷或宕机

    那么就需要了解以下DD命令

    Linux DD命令是一种用于复制和转换文件的命令行工具。它可以从一个文件或设备复制数据,并将其写入另一个文件或设备。DD命令可以用于创建磁盘映像,备份和还原硬盘分区,以及在不同的数据存储格式之间进行转换。以下是一些DD命令的常见用法:

    1. 复制文件或设备
    dd if=/dev/sda of=/dev/sdb
    
    • 1

    上述命令将/dev/sda设备的内容复制到/dev/sdb设备中。

    1. 创建磁盘映像
    dd if=/dev/sda of=/path/to/image.img
    
    • 1

    上述命令将/dev/sda设备的内容复制到名为image.img的文件中。

    1. 转换数据格式
    dd if=/path/to/input.img of=/dev/sda bs=512 conv=notrunc
    
    • 1

    上述命令将名为input.img的文件中的数据写入到/dev/sda设备中,并将块大小设置为512字节。"conv=notrunc"选项表示不截断输出文件。

    3.3信号/调试暂停状态

    1. 当执行死循环时状态为R 发送kill -19 PID 进程暂停 状态为T(不是因为要访问某种资源而主动暂停 而是向他发信号 它被动暂停 ) 发送 kill -18 PID 进程继续 状态变为R
    2. 对test.c 打开gdb 设置断点 当执行./test 进程开始执行 遇到断点暂停 此时进程状态为t gdb进程状态为S (可以理解为gdb向test发送了kill- 19 PID )

    3.4僵尸状态

    int main()
    {
        pid_t id = fork();
        if(id < 0)
        {
            //创建失败
            perror("fork");
            return 1;
        }
        else if(id == 0)
        {
            //child process(task)
            while(1)
            {
                printf("I am child, pid: %d, ppid: %d\n", getpid(), getppid());
                sleep(3);
                break;
            }
            exit(0);
        }
        else 
        {
            //parent process
            while(1)
            {
                printf("I am father, pid: %d, ppid: %d\n", getpid(), getppid());
                sleep(1);
            }
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

  • 相关阅读:
    简单但好用:4种Selenium截图方法了解一下!
    【人体骨骼点】算法综述
    Advanced Installer使用(亲测可用)
    Python 位运算的操作
    十四、数据库的导出和导入的两种方法
    【Maven教程】(八):使用 Nexus 创建私服 ~
    2022年最富有的科技亿万富翁前二十名,中国占3位
    【附源码】计算机毕业设计SSM网络求职招聘系统
    怎么查看证书里是不是包含私钥和公钥
    基于Servlet+jsp+mysql开发javaWeb学生管理系统(学生信息、学生选课、学生成绩、学生签到考勤)
  • 原文地址:https://blog.csdn.net/LHRan_ran_/article/details/134378838