• 【linux进程(三)】进程有哪些状态?--Linux下常见的三种进程状态


    💓博主CSDN主页:杭电码农-NEO💓

    ⏩专栏分类:Linux从入门到精通

    🚚代码仓库:NEO的学习日记🚚

    🌹关注我🫵带你学更多操作系统知识
      🔝🔝


    在这里插入图片描述

    1. 前言

    很明显,进程状态的本质就是进程
    PCB结构体中的一个变量,它可能
    是用宏定义来实现的,也可能是其他方式

    #define NEW 1
    #define RUNNING 2
    #define BLOCK 3
    strcut PCB
    {
    	...其他信息
    	int state;//进程状态
    }
    if(PCB->state==NEW)
    {将进程放入运行队列}
    else if(PCB->state==BLOCK)
    {将进程放入阻塞队列}
    ......
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    本章重点:

    本篇文章着重讲究操作系统中的
    三种进程状态:运行状态,阻塞状态
    挂起状态.并且讲解Linux操作系统
    中具体的进程状态,其中R状态(运行状态)
    和S状态(睡眠状态)最常见!

    Linux中常见的六种状态:

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

    还有一种状态就是z状态(僵尸状态)


    2. 操作系统中进程的运行状态

    现在我们使用的电脑,手机有四核的
    有八核,十二核的,也就是有多个CPU
    然而不管有多少个CPU,每一个CPU
    都有一个对应的运行队列,CPU会去
    此队列中寻找数据来做处理

    在这里插入图片描述

    只要一个进程在运行队列中,它就是运行状态

    不管一个进程是否正在被处理,只要它在
    运行队列中,那么它就是处于运行状态!


    3. 操作系统中进程的阻塞状态

    我先来描述一下进程会阻塞的情况:

    当CPU处理一个PCB时,我们写的
    代码中或多或少会去访问操作系统
    里的某些资源,比如:磁盘,键盘,网卡

    最简单的例子,当代码出现scanf
    或者cin时,系统会等待用户输入,只要
    不输入,要访问的资源就没有就绪
    此时代码就无法运行!

    在这里插入图片描述

    此时进程就处于阻塞状态了吗?
    对!但是不完全对!
    我想给大家阐述的更细致一点

    我们知道,系统中的硬件是通过
    管理硬件数据来间接被操作系统
    管理起来的,所以操作系统是很清楚
    硬件现在是否具备访问条件,那么
    操作系统是怎样知道的呢?
    其实每一个设备的结构体中,都有
    变量:PCB* wait_queue,也就是
    等待队列,请看下图仔细分析:

    在这里插入图片描述

    将一个进程从运行队列移动至设备
    的等待队列中,再将状态改为阻塞
    此时这个进程就处于阻塞状态

    每个CPU或是设备都有自己的队列
    进程状态变化的本质就是:

    1. 更改PCB中status的整数变量
    2. 将PCB链接到不同的队列中!

    4. 操作系统中进程的挂起状态

    想象一下以下情况

    如果现在有很多进程被阻塞(不同设备)
    注定了这些进程在它所等待的资源没有
    就绪的时候,该进程是无法被调度的,如果
    此时,恰好操作系统的内存资源已经严重不足
    那么现在应该这样做才能拯救操作系统呢?

    答案是,因为此时进程处于阻塞
    状态,并且内存已严重不足,所以
    OS会将PCB对应的数据和代码
    弄到磁盘,为内存腾出一部分空间
    此时,进程就被挂起了!

    在这里插入图片描述

    注意,将内存数据换到外设上
    这一操作是针对所有阻塞进程的
    不用担心与外设频繁交互会降低
    操作系统的效率,因为此时要关心
    的是操作系统还能不能存活下去!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    注意,swap分区是磁盘中真实存在的
    它的大小往往是很小的,这个部分专门
    用于内存严重不足时和内存进行交互
    并且当内存情况缓解后,曾经被置换
    出去的代码和数据又会重新加载进来!
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5. Linux下特定的进程状态

    先来看看我在库中找的状态的定义:

    在这里插入图片描述

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

    今天的主角是R和S状态
    先来写一段程序来看看效果:

    #include     
    #include     
    int main()    
    {    
        while(1)    
        {    
            sleep(1);    
            printf("hello hdu\n");    
        }                                                                                                                                                                   
        return 0;    
    }  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行此程序后查看进程状态:

    在这里插入图片描述

    按照常理来说,一个正在运行的程序
    应该是处于R状态的,但是这个程序
    为什么处于S状态呢(+号先不管,后面会讲)

    这是因为循环打印时,IO输出是很慢的
    打印字符会和外设屏幕交互,所以大
    部分时间进程都处于阻塞状态,可能
    只有百分之1的时间在打印,所以查看
    进程状态时,大部分都是S状态,只有很少
    一部分是R状态但是如果while(1)中
    什么代码都没有,则程序一直处于R状态


    6. 前台进程和后台进程的区别

    我先给出概念再来解释:

    • 前台进程:运行时无法使用bash外壳的指令
      并且可以被CTRL C强制终止掉

    • 后台进程:运行时可输入指令,不能被CTRL C掉
      只能使用kill指令来杀掉进程.

    将程序变成后台程序:

    运行进程时加上: &
    如: ./mybin &

    先来对比观察一下前后台进程:

    前台进程和后台进程区别


    7. 休眠状态和磁盘休眠状态

    细心的同学可能已经发现了
    这几种状态中有两个很相似的状态:
    在这里插入图片描述
    S被称为浅度睡眠
    D被称为深度睡眠

    想象一下下面的这种情况:

    我们从QQ,微信上下载一个文件
    本质上就是将数据拷贝至磁盘,但是
    目前这个文件很大,需要拷贝很久
    但是此时操作系统的内存恰恰不足了
    需要干掉一些进程来保证操作系统存活
    此时若恰好将正在拷贝到磁盘的进程杀掉
    了,那么也就是拷贝失败了,如果文件非常
    的重要,那么操作系统就要背锅了,所以
    OS创造了D状态:磁盘休眠状态!

    所以我们得出一个重要的结论:

    1. S(sleeping):浅度休眠,浅度睡眠,可以被终止
    2. D(disk sleep):深度休眠,为了防止向磁盘写入
      重要资源时被杀掉而专门创建的一个分类!

    8. 总结以及拓展

    了解Linux中进程的分类可以更进一步
    的了解进程在操作系统中的运行关系
    所以进程状态是学习进程中必不可少的
    一课!我们和进程的故事还远远没有结束!

    拓展阅读:什么是僵尸进程?

    什么是僵尸进程


  • 相关阅读:
    MySQL基本知识点梳理和查询优化
    RabbitMQ里的几个重要概念
    Responder
    docker使用Inbucket搭建邮件服务器用于接受邮件
    springboot注解之@ConfigurationProperties注解
    在Bat To Exe Converter,修改为当异常结束或终止时,程序重新启动执行
    day52 django的下载与安装
    Amazon MSK 基于 S3 的数据导出、导入、备份、还原、迁移方案
    使用pypcd读取pcd时ValueError: field ‘__0000‘ occurs more than once错误
    SpringBoot核心知识点总结【Spring Boot 复习】
  • 原文地址:https://blog.csdn.net/m0_61982936/article/details/133619044