进程状态究竟是什么?在Linux操作系统中具体存在哪些进程状态?

前言

 进程状态就是PCB中的一个字段(通俗来讲,就是PCB中的一个变量),进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。
 进程状态在操作系统中分为为:新建状态、就绪状态、阻塞状态、挂起状态以及结束状态。但在每一款具体的操作系统中,进程状态多存在差异,并非完全对应。
 为此本篇博客将分别介绍理论进程状态、在Linux操作系统中的进程状态有哪些!

一、操作系统中的进程状态

 在操作系统层面上,进程状态分为以下5类:新建状态、就绪状态、运行(执行)状态、阻塞状态、以及终止状态(还有挂起状态)
 在操作系统中存在运行队列、等待设备的等待队列等等队列。而进程的状态的本质就是更改进程中pcb -> status指向的整型变量、并将进程的pcb链入不同的队列中

在这里插入图片描述

1.1 运行状态

 在计算机中,为了更好的进行进程调度,操作系统会为每一个CPU维护一个运行队列。所有将来需要被CPU调度的进程都会被链入该运行队列中。对于早期的计算机而言,只有进程被加载到CPU中时,进程状态才被称为运行状态。但在现在的计算机中,只有进程在CPU的运行队列中,此时进程的状态就被称为运行状态。(现代计算机中创建状态、就绪状态、执行状态以及区分不大了)
在这里插入图片描述

1.2 阻塞状态和唤醒

 当CPU在运行进程时,有些程序需要访问其他资源(比如:网卡、显卡、键盘等等)。以键盘为例,当程序中存在scanfcin等操作时,程序需要从键盘上读取我们输入的数据。如果我们此时不输入任何东西,此时表明设备中的数据没有就绪(更直接的说,当前进程要访问的数据没有就绪)。此时操作系统会将该进程的PCB从运行队列中移到该设备队列的等待队列中,此时进程的状态称为阻塞状态。
 当设备中的数据就绪后,OS会将等待队列中的进程重新移会运行队列中,该过程被称为进程唤醒!!

在这里插入图片描述

1.3 挂起状态

 当一个进程被堵塞时,该进程无法被调度。如果此时操作系统的资源以及严重不足时,操作系统会将该进程的代码和数据都转移到磁盘的Swap分区。当进程被转移到磁盘中时,此时进程的状态称为挂起状态!当进程杯调度时,操作系统会将对应的代码和数据重新加载到内存中。

  1. Swap分区的大小普遍为内存的1~2倍左右。不能设置过大,否则当系统内存不足时,OS会过度依赖Swap分区,导致大量内存和磁盘间的IO操作,大大降低计算机的运行速度!!
  2. 当内存不足时,所有进程状态为阻塞状态的进程都有可能会置换到磁盘Swap分区。

二、Linux操作系统中具体进程状态

Linux中的进程状态种类

下面时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[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"T (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

下面我们来一一介绍每种进程状态究竟是什么!

2.1 R运行状态(running)

R运行状态并不意味着进程一定在CPU中运行,进程只需在CPU中或运行队列中即可。
 下面我们在code.c源文件中写入一个死循环,然后通过Makefile/make编译后,通过脚本监视该进程看看进程的状态变化!

【code,c源文件】:

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

【进程监控脚本】:博主源文件编译形成的目标文件为mybin,各位可将脚本中的mybin替换成各自的目标二进制文件。

while :; do ps axj | head -1 && ps axj | grep mybin | grep -v "grep"; sleep 1; echo "################################################"; done

【动画展示】:
请添加图片描述
在动画展示中,我们发现进程运行时,进程状态尽然是S+(其实还有个别情况中会出现R+,博主试不出就只剪了一小段)。至于为啥绝大部分进程状态为S+,原因在于S状态是一种阻塞状态,在源文件中存在向外设输出信息的过程,此时外设不一定装备好了,因此进程切换到堵塞。(+表示为前台进程,后续介绍)

如果我们将源文件code.c中向外设输出的语句去掉即可看到进程状态为R+
【code.c源文件】:

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

【动画展示】:
请添加图片描述

2.2 前台进程、后台进程

 在2.1中我们在动画展示中发现进程状态后面带+,该符号表示当前进程为前台进程,前台进程在程序运行时无法执行其他指令,并且可以通过ctrl c来结束进程
 在运行文件后&,此时进程为后台进程。后台进程可以在程序运行时执行其他指令,但操作系统无法将该进程杀掉(即无法通过ctrl c来结束进程)。只能通过kill -9 进程PID来杀掉该进程!

【前台进程动画展示】:
请添加图片描述
【后台进程动画展示】:
请添加图片描述
 实际上,编译器调式就是18) SIGCONT19) SIGSTOP两者信号间相互转化来控制的。

2.3 S睡眠状态 、D磁盘休眠状态

 睡眠状态,是意味着进程在等待事件完成。S时一种浅度睡眠,可以被终止。(即上面动画展示中通过Ctrl c终止进程)
 磁盘休眠状态,有时候也叫不可中断睡眠状态,是一种深度睡眠。该状态主要体现在操作系统向磁盘中写入重要关键数据时,防止数据丢失,在这个状态的进程通常会等待IO的结束。(如果此时操作系统内存不足,并且当前进程正在向磁盘写入数据;此时该进程的状态改为堵塞状态,操作系统可能会将该进程直接杀掉,找出数据丢失)

2.4 Z 僵尸状态

2.5 T停止状态

 在Linux中存在很多进程信号,可以通过kill -l指令查看!

在这里插入图片描述

 T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程;这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行

tips:前台进程被stopped停止后会变成后台进程!!

【动画展示】:
请添加图片描述

2.6 X死亡状态

 X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

  • 59
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 31
    评论
### 回答1: Linux系统进程的状态包括: 1. 运行状态(Running):进程正在执行或等待CPU资源。 2. 就绪状态(Ready):进程已经准备好执行,但是还没有得到CPU资源。 3. 阻塞状态(Blocked):进程因为等待某些事件(如I/O操作)而被挂起,无法执行。 4. 停止状态(Stopped):进程被暂停执行,但是仍然存在系统,可以被恢复执行。 5. 僵尸状态(Zombie):进程已经执行完毕,但是其父进程还没有处理完该进程的退出状态信息,导致该进程成为僵尸进程。 ### 回答2: Linux系统进程的状态可以分为五类,包括新建状态、就绪状态、运行状态、等待状态和终止状态。 1. 新建状态:当操作系统创建一个新的进程时,该进程就处于新建状态。此时,进程还未被加载到内存,而是被放置在进程控制块等待操作系统的下一步处理。 2. 就绪状态:当进程被调度程序选并准备好运行时,它就会进入就绪状态。此时,该进程已被加载到内存,但仍在等待CPU资源分配的过程。 3. 运行状态:当进程获得CPU资源并开始执行时,它就进入了运行状态。此时,进程已经开始运行它的指令,直到进程调度算法决定将CPU分配给其他进程。 4. 等待状态:当进程在执行过程需要等待某些资源或事件时,它就进入了等待状态。例如,输入/输出操作、信号量等待、锁等待等场景都可能导致进程进入等待状态,此时该进程将暂时被挂起。 5.终止状态:当进程执行完毕或被强制终止时,它就进入了终止状态。此时,该进程所占用的系统资源被回收并释放。 总得来说,进程状态Linux系统具有非常重要的意义,操作系统通过进程状态的变化来完成进程的调度、资源分配、进程终止等一系列操作。掌握进程状态的含义和变化规律对于系统管理员和开发人员都是至关重要的。 ### 回答3: Linux系统进程的状态共有5种,分别为: 1. 运行状态(Running):表示进程正在执行或准备执行。在CPU上执行的进程被称为运行状态。 2. 就绪状态(Ready):表示进程已经准备好在CPU执行任务,但是由于系统调度等原因尚未获得CPU资源。 3. 阻塞状态(Blocked):表示进程由于某些原因无法执行,等待着某个事件的发生,例如等待用户输入、等待硬件I/O的完成或等待其他进程的信号等。 4. 停止状态(Stopped):表示进程已经被暂停执行,通常是由于调试器的介入或收到SIGSTOP信号。 5. 僵死状态(Zombie):表示进程的执行已经结束,但它的父进程还未调用处理子进程结束的系统调用(例如wait())获取它的终止状态,此时该进程会处于僵死状态。 进程的状态转换一般有三种方式: 1. 进程主动转换状态:例如主动调用sleep()函数将自己挂起或执行fork()函数创建子进程时,父进程被阻塞,子进程变成就绪状态; 2. 系统断转换状态:例如硬件I/O完成或用户输入等待时间结束时,被阻塞的进程就会转换为就绪状态; 3. 调度器转换状态:例如等待的进程被调度器分配CPU资源时,就会从就绪状态变为运行状态。 在Linux系统,每个进程都有唯一的PID标识符,可以通过ps命令或top命令查看系统所有进程的状态进程状态的了解对于理解系统的运行机制和调优非常重要,也是系统管理员进行故障排除和优化的重要依据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独享你的盛夏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值