万字详解普遍操作系统进程七态与Linux进程七态

作为一个称职的系统管理员,为了更熟悉进程的管理流程,我们必须要知道进程的不同状态所对应的意义。


了解进程状态

操作系统中,进程状态可以分为:运行、新建、就绪、挂起、阻塞、等待、停止、挂机、死亡等很多状态。

普遍操作系统的概念

进程这么多状态,本质上是为了满足不同的运行场景!
状态其实就是进程的内部属性,也就是PCB-task_struct里面的一个内部属性,可能是一个数字表示比如1:run、2:stop、3:hup、4:dead

操作系统中的进程状态通常包括以下几种:

  1. 就绪状态(Ready):进程已经准备好执行但是还没有被处理器调度执行的状态。

  2. 运行状态(Running):进程正在被处理器执行的状态。

  3. 阻塞状态(Blocked):进程因为等待某些事件(如I/O操作完成)而被阻塞的状态。

  4. 等待状态(Waiting):进程因为等待某些事件(如I/O操作完成、信号等)而被阻塞的状态。

  5. 暂停状态(Paused):进程被暂停执行,可以自行恢复执行。

  6. 挂起状态(Suspended):进程被操作系统挂起执行,资源被释放,进程状态被保存到磁盘上。挂起状态可以分为内存挂起状态和磁盘挂起状态两种。

  7. 终止状态(Terminated):进程执行完毕或者因为某些原因被终止的状态。

搭建一个OS(操作系统)的宏观概念图:
在这里插入图片描述

进程运行队列:CPU是有限的,而需要运行的资源却是非常多的,那么对这些需要运行的资源做管理就非常有必要了。

  • 一般来说一个CPU搭配一个运行队列
  • 让进程入队列,本质就是将该进程的task_struct结构体对象放入运行队列中
  • 进程PCB在runqueue队列中,就是R(运行状态)(不是这个进程正在运行才是运行状态)因为CPU非常快,所以在运行队列中的程序都需要装备好,因为可能马上就要运行了。
  • 进程的不同状态,本质就是进程在不同的队列中,等待某种资源

就绪状态

就绪状态(Ready):进程已经准备好执行但是还没有被处理器调度执行的状态。在就绪状态下,进程已经分配了所有需要的资源,并且满足了所有的前提条件,只要处理器调度到该进程,该进程就可以立即执行。

 就绪状态是指进程已经准备好执行,但是目前还没有被分配CPU资源。在操作系统的进程调度中,就绪状态是指进程已经完成了所有必要的准备工作(如加载代码、准备数据等),并且等待操作系统将CPU资源分配给它,以便开始执行。CPU资源可能被分配给其他正在运行的进程,或者操作系统可能会将当前正在运行的进程挂起或阻塞,以便分配更多的CPU资源给其他进程。

当一个进程处于就绪状态时,它的PCB(进程控制块)通常会被放置在操作系统维护的就绪队列。这个队列中包含了所有已经准备好执行的进程,操作系统会根据某种调度算法从队列中选择一个进程,并将CPU资源分配给它,以便开始执行。常见的调度算法包括先来先服务(FCFS)、时间片轮转、优先级调度等。

先来先服务(First-Come, First-Served,简称FCFS)是一种常见的调度算法,用于管理计算机系统中的进程或任务。在这种算法中,任务按照它们到达系统的顺序进行服务,即越早到达的任务越先得到服务。
具体来说,当一个新任务到达系统时,它会被放入一个任务队列中,等待系统资源的分配。如果此时系统中没有其他正在运行的任务,那么该任务就会被立即执行;否则,它就会等待前面的任务完成后再执行。
FCFS 调度算法的优点是实现简单,公平性较高,易于理解和预测。然而,它也存在一些缺点。例如,如果某个任务需要的时间很长,那么它会占用系统资源很长时间,导致其他任务需要等待很长时间才能得到服务,从而降低系统的吞吐量和响应时间。此外,由于 FCFS 调度算法没有考虑任务的优先级和执行时间等因素,因此可能会导致某些任务长时间等待,而其他任务则得到了过多的服务。
为了解决 FCFS 调度算法的一些缺点,人们发明了许多其他的调度算法,如时间片轮转调度算法、最短作业优先调度算法、优先级调度算法等。这些算法都具有不同的特点和适用范围,可以根据具体的应用场景进行选择和使用。

时间片轮转(Round Robin)是一种常见的调度算法,用于管理计算机系统中的进程或任务。在时间片轮转算法中,每个进程被分配一个固定长度的时间片(即时间量),当一个进程的时间片用完后,它会被暂停并放回就绪队列的末尾,而下一个进程会被选中执行。
时间片轮转算法的核心思想是公平性和均衡性。每个进程都能够以相等的时间片获得处理器的使用权,这样可以避免某个进程长时间占用处理器而导致其他进程无法获得执行的情况。当一个进程的时间片用完后,它会被放回队列的末尾,而其他等待执行的进程有机会得到处理器的使用权。
时间片的长度通常是固定的,例如10毫秒或100毫秒。当一个进程在一个时间片内无法完成执行时,它会被暂停并放回队列的末尾,等待下一个时间片再次执行。这种方式可以确保每个进程都有机会执行,并且响应时间相对较短。
时间片轮转算法的优点是实现简单,公平性较高,适用于多任务环境下的公平资源分配。然而,它也存在一些缺点。例如,如果某个进程需要的时间片较长,那么它会占用处理器较长时间,导致其他进程的响应时间延迟。此外,在一些特殊情况下,时间片轮转算法可能导致大量的上下文切换开销。
为了解决时间片轮转算法的一些缺点,人们发展了许多改进的调度算法,如多级反馈队列调度算法、最短作业优先调度算法、优先级调度算法等。这些算法考虑了任务的优先级、执行时间和资源需求等因素,以更好地满足不同任务的需求。根据具体的应用场景和系统需求,可以选择适合的调度算法来提高系统的性能和效率。

 需要注意的是,就绪状态的进程并不一定是立即可以执行的。尽管进程已经准备好执行,但是操作系统可能会将其暂时放置在就绪队列中,等待CPU资源的分配。此外,就绪状态的进程可能会消耗一些内存资源,因为它的PCB需要在内存中保留。因此,在设计和开发应用程序时,需要注意尽可能减少进程在就绪状态下的等待时间,以避免浪费系统资源和影响系统的响应能力。

运行状态

运行状态(Running):进程正在被处理器执行的状态。在运行状态下,进程正在占用CPU资源并执行任务。

 运行状态是指进程正在CPU上执行指令,也就是正在运行。在操作系统中,当操作系统将CPU资源分配给一个进程时,该进程就从就绪状态转换为运行状态,开始执行其代码和指令。在运行状态下,进程可以访问CPU和内存等系统资源,并可以与其他进程和外部设备进行通信和交互。

 在运行状态下,CPU会按照进程的代码指令逐一执行,直到进程完成其任务或被操作系统挂起或阻塞。在这个过程中,进程的PCB(进程控制块)将记录该进程的状态和执行信息,包括程序计数器、寄存器值、堆栈指针等等。如果一个进程需要与其他进程或外部设备进行通信,则需要使用系统调用等机制,以便将控制权传递给操作系统,让操作系统代表该进程执行相应的操作。

 需要注意的是,运行状态的进程通常会消耗大量的CPU时间和内存资源,并且可能会对系统的稳定性和响应能力产生影响。因此,操作系统需要对进程进行调度和管理,以确保系统资源的合理分配和使用。通常,操作系统会使用一些调度算法来决定应该将CPU资源分配给哪个进程,例如时间片轮转、优先级调度等。此外,操作系统还需要监控运行状态的进程,及时处理异常情况(如进程崩溃或死锁等),以保证系统的稳定性和可靠性。

 总之,运行状态是指进程正在CPU上执行指令,这是进程的活跃状态之一。在操作系统中,需要对运行状态的进程进行调度和管理,以确保系统资源的合理分配和使用。

等待状态

等待状态(Waiting)是操作系统中的一种进程状态,表示进程因为等待某些事件(如I/O操作完成、信号等)而被阻塞的状态。在等待状态下,进程不能继续执行,直到等待的事件发生并且操作系统再次将其转换为就绪状态。

 硬件设备也是有限的,但是如果多个进程同时需要访问这个硬件,那么这些个当时不能访问的进程的状态就是等待,不要以为,进程只会等待(占用)CPU的资源,也可能随时需要外设的资源。

 等待状态是指进程因为某些操作需要等待某些事件的发生而暂时停止执行的状态。在等待状态下,进程暂时无法继续执行,直到等待的事件发生或者等待超时,进程才能继续执行。

 在操作系统中,等待状态通常是指进程在等待某些外部事件的发生,例如等待输入/输出操作完成、等待某个信号量被释放等。当进程进入等待状态时,操作系统会将其从CPU中移除,以便让其他进程可以使用CPU资源。

 当进程进入等待状态时,它的PCB(进程控制块)将被更新,以便记录进程的状态和等待的事件。此外,操作系统可能会将进程从CPU上暂时移除,并将其状态设置为等待状态,以便将CPU资源分配给其他进程。当等待的事件发生时,操作系统会将进程从等待状态恢复到就绪状态,以便继续执行其代码和指令。

 需要注意的是,等待状态的进程可能会占用一些内存资源,因为它的PCB和其他状态信息需要保留在内存中。此外,如果等待的事件需要较长时间才能发生,进程可能会在等待状态下消耗较多的系统资源,从而影响系统的响应能力和稳定性。因此,在设计和开发应用程序时,需要尽可能减少进程在等待状态下的等待时间,以避免浪费系统资源和影响系统的性能。

 等待状态是操作系统中常见的进程状态之一,通常与阻塞状态一起出现。当进程进入等待状态时,它会释放占用的系统资源,以便其他进程可以使用这些资源。当被等待的事件发生时,操作系统会将进程唤醒,并将其状态从阻塞状态转为就绪状态,以便进程能够继续执行。

阻塞状态

进程因等待某个条件(如 I/O 完成、互斥锁释放或某个事件发生)而无法继续执行。在这种情况下,进程会进入阻塞状态,在阻塞状态下,进程不能继续执行,直到等待的事件发生并且操作系统再次将其转换为就绪状态。

 阻塞状态:在CPU的队列中就是运行状态,但是这时候你需要访问外设,操作系统就会把你移动到该外设的等待队列,而不是留在CPU的队列中,CPU不会等待你,此时你的状态就是阻塞。

阻塞状态下的进程不会占用 CPU 资源,操作系统会调度其他可执行的进程。例如,在调用 sleep 函数时,进程会进入阻塞状态,等待指定的时间间隔过去。

 比如你去银行办理业务,当你已经到了柜台,但这时要你去前台填一个表,你的业务没办理完,但是柜台不会等待你,此时你正在前台等待填表,而柜台(CPU)则继续办理下一个人的业务,这时你的状态就是阻塞。

 阻塞状态就是当前你的状态不能被CPU调度,而是在等待某种资源。我们一会把进程放在CPU等待队列中,一会放在外设的阻塞队列中,其实都是对task_struct对象放到不同队列中。

挂起状态

挂起状态(Suspended):进程被操作系统挂起执行,资源被释放,进程状态被保存到磁盘上。挂起状态可以分为内存挂起状态和磁盘挂起状态两种。在挂起状态下,进程不占用内存资源,不参与CPU调度和进程间通信,直到操作系统再次将其恢复到就绪状态。

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

上述过程中将进程的相关数据,加载或保存到磁盘中,叫做内存数据的换入换出。

  • 内存挂起状态:当一个进程处于内存挂起状态时,它的PCB仍然保存在内存中,但是进程的内存空间被释放,进程的代码和数据被保存到磁盘上。进程从内存挂起状态恢复时,需要重新将代码和数据从磁盘读入内存。

  • 磁盘挂起状态:当一个进程处于磁盘挂起状态时,它的PCB以及代码和数据都被保存在磁盘上,进程不占用内存空间。进程从磁盘挂起状态恢复时,需要将PCB以及代码和数据从磁盘读入内存。

进程进入挂起状态通常是由操作系统或进程自身发起的,例如:

  1. 操作系统可以将一些不活跃的进程挂起,以释放内存资源,并优化系统性能。
  2. 进程自身可以调用挂起函数,主动将自己挂起,等待某些条件满足后再恢复执行。
  3. 进程也可以被操作系统挂起,例如当进程等待某些资源(如I/O操作)时,操作系统会将其挂起,等待资源变为可用后再恢复执行。

进程进入挂起状态后,操作系统可以将其从就绪队列中移除,以避免进程被调度执行。当进程需要恢复执行时,操作系统会将其重新加入到就绪队列中,并根据调度策略选择下一个进程来执行。

阻塞状态与挂起状态占用内存比较:

  阻塞状态的进程通常会占用更多的内存资源,因为它们需要在等待某些事件(例如输入/输出操作完成、信号发生等)时保留一些状态信息和数据。当进程被阻塞时,它的PCB(进程控制块)仍然会保留在内存中,以便操作系统可以在资源可用时唤醒该进程。此外,操作系统可能还需要维护一些数据结构来跟踪进程的状态和等待的事件,这些数据结构也会占用一些内存资源。

  相比之下,挂起状态的进程会占用更少的内存资源。进程的代码和数据通常存储在磁盘上,而不是内存中。挂起状态中,进程的PCB(进程控制块)被保留在内存中,而进程的代码和数据则可能被换出到磁盘上,以释放内存资源。当进程被唤醒时,如果它的代码和数据被换出到磁盘上,操作系统会将它们重新加载回内存中,使进程可以继续执行。因此,挂起状态中的进程确实会占用一些内存资源,但是大部分的内存资源都可以被释放出来给其他进程使用。所以,挂起状态的进程通常会占用更少的内存资源,而阻塞状态的进程则需要占用更多的内存资源。

  总之,阻塞状态和挂起状态都会占用一定的内存资源,但是阻塞状态通常会占用更多的内存资源。

 挂起状态优点:帮助操作系统优化系统资源的利用和性能,同时也为进程提供了一些更灵活的管理方式。

暂停状态

暂停状态(Paused):进程被暂停执行,可以自行恢复执行。在暂停状态下,进程的状态被保存在内存中,不释放资源,但是不参与CPU调度和进程间通信。

“暂停状态”通常指的是用户主动暂停一个正在运行的进程,这个进程在被暂停之后,不会被操作系统挂起或阻塞,而是仍然保持在内存中,等待用户的继续操作。

 在某些操作系统或调试工具中,可以通过暂停进程的执行来查看进程当前的状态和执行信息。当用户暂停一个进程时,操作系统会停止该进程的执行,并且将该进程的执行状态和当前的CPU寄存器值等信息保存在内存中。在这种情况下,进程的PCB(进程控制块)仍然保留在内存中,以便操作系统可以在进程被恢复时恢复进程的执行状态。但与挂起状态和阻塞状态不同,暂停状态的进程在被恢复之前不会被操作系统自动唤醒或继续执行,需要用户手动恢复进程的执行。

暂停状态通常用于调试或监视程序的执行过程,例如在调试器中暂停一个进程以便查看程序的执行状态和变量值。在某些操作系统中,也可以使用暂停状态来控制进程的执行,例如在多线程程序中,暂停一个线程以等待其他线程完成某些操作。但是,暂停状态的进程仍然会占用一些内存资源,因为它的PCB和其他状态信息需要保留在内存中。因此,如果不需要查看或控制进程的执行状态,最好不要将进程暂停,以避免浪费内存资源。

暂停状态和挂起状态有什么区别?

 暂停状态通常是由进程本身发起的,表示进程主动暂停执行,等待某些条件满足后再恢复执行。暂停状态下,进程的PCB仍然保留在内存中,进程的状态仍然是就绪、运行、阻塞等状态之一,只是进程主动暂停了自己的执行。

 暂停状态通常指进程收到暂停信号(如 SIGSTOP),使其暂停执行。进程在暂停状态下不会进行任何操作,不占用 CPU 资源,但仍然占用内存资源。暂停状态的进程可以通过接收继续信号(如 SIGCONT)恢复执行。这种状态通常用于程序调试或控制进程执行。

 挂起状态(Suspended):挂起状态是当进程被操作系统或其他进程暂停执行,但仍保留在内存中。挂起的进程不会占用 CPU 资源,但仍然占用内存资源。挂起状态的进程可以在稍后被恢复,接着从上次暂停的位置开始执行。挂起进程的原因可能是为了给其他高优先级进程分配资源,或因为进程出现问题需要调试。

 阻塞状态是因为进程等待某个条件而无法执行,挂起状态是因为操作系统或其他进程暂停进程执行,而暂停状态通常是因为进程收到暂停信号。这三种状态下的进程都不会占用 CPU 资源。

 虽然暂停状态和挂起状态都表示进程的执行被暂停,但是两种状态的实现方式和目的不同,暂停状态主要是为了进程自身的需要,而挂起状态则是为了操作系统管理系统资源和进程调度的需要。

终止状态

终止状态(Terminated):进程执行完毕或者因为某些原因被终止的状态。在终止状态下,进程的资源被释放,进程的状态被从系统中删除。

 终止状态是指进程已经完成了其任务并退出,或者进程由于某些原因被操作系统强制终止,不再占用CPU和内存等系统资源。在终止状态下,进程的PCB(进程控制块)也将被释放,并从系统中移除,以便操作系统可以回收该进程所占用的内存资源。

 当一个进程完成了其任务并退出时,它会进入终止状态。在这种情况下,进程的PCB和其他系统资源都将被释放,以便其他进程可以使用它们。如果进程是由于某些错误或异常情况而被强制终止的(例如由于内存访问错误、除0错误等),则操作系统也会将其移动到终止状态,并释放其占用的所有系统资源。

 在进程进入终止状态之前,通常需要进行一些清理工作,以确保进程的资源得到适当释放并防止内存泄漏等问题的发生。例如,进程可能需要关闭打开的文件、释放申请分多条消息发送,上一条消息突然结束了。


总的来说,进程状态表示了进程在不同的执行阶段中所处的状态,是操作系统对进程管理的基础。不同的进程状态对应着不同的处理方式和调度策略,操作系统需要根据实际情况来管理和调度进程,以保证系统的高效性和稳定性。

Linux下的进程状态

Linux内核源代码的不同进程状态:
在这里插入图片描述
Linux进程状态:

  • “R (running)”, /* 0 */ 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里
  • “S (sleeping)”, /* 1 */ 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)
  • “D (disk sleep)”, /* 2 */有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
  • “T (stopped)”, /* 4 */可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
  • “t (tracing stop)”, /* 8 */在调试过程中的追踪停止
  • “X (dead)”, /* 16 */这个状态只是一个返回状态,你不会在任务列表里看到这个状态
  • “Z (zombie)”, /* 32 */当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程

R (running)运行状态

运行状态:表示进程正在运行或者正在等待CPU的时间片。

我们运行下面程序:

//Test.c
#include <stdio.h>  
int main()
{         
    int sum=1;
    while(1)  
    {       
        sum=1+1;
    }           
   	return 0;
}         

在这里插入图片描述
 此时的状态就是R (running)

S (sleeping)可中断睡眠状态

可中断睡眠状态:表示进程正在等待一个事件的发生,例如等待输入输出操作完成,等待信号量等。
进程处于S状态时,它不会占用CPU资源,而是被挂起等待事件的发生。

 进程在S状态下的等待事件是可中断的,例如当进程等待IO操作完成时,如果设备发生错误或者被卸载,进程就会被唤醒并处理错误。进程也可以收到信号并被唤醒,例如当有一个SIGTERM信号被发送给进程时,它就会被唤醒并终止。当事件发生后,进程会从S状态中醒来,根据等待的事件继续执行或者进入睡眠状态。

思考下面代码运行状态:

//Test.c
#include <stdio.h>  
int main()
{      
    int cnt=0;
    int sum=1;
    while(1)  
    {       
        sum=1+1;
        printf("我正在打印:cnt=%d\n",cnt++);
    }           
   	return 0;
}      

 你可能会认为这个代码在跑起来后还是运行状态,但是实际上:
在这里插入图片描述
 原因是:printf函数是将数据打印到显示器上是外设,所以速度很慢,要等显示器就绪,需要花费CPU很长时间,所以它的状态是睡眠状态(阻塞状态的一种)。一般的运行,99%的时间都是等IO就绪,1%的时间是在执行打印代码。

T (stopped)停止状态

处于 T 状态的进程已停止。这意味着该过程已被用户或信号暂停。处于 T 状态的进程不使用任何 CPU 资源。但是,它们可能仍在使用一些内存资源。处于 T 状态的进程使用的内存量将取决于进程的大小。

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

初识前台进程与后台进程:
 我们运行下面程序:
在这里插入图片描述
 在这种情况下我们在打印的地方输入别的指令比如ll、ls、pwd等,不会取响应这些命令而是继续执行打印。这种情况就表面这个进程是一个前台进程。
在这里插入图片描述
 如果我们先将其暂停然后再让其继续执行,那么这个进程会变成后台进程:
在这里插入图片描述
在这里插入图片描述

T状态的一些信息:

  • T 状态也称为停止状态。
  • 处于 T 状态的进程不计划由调度程序运行。
  • 处于 T 状态的进程可以由用户或信号恢复。
  • 处于 T 状态的进程可以被用户或信号杀死。
  • 处于 T 状态的进程不使用任何 CPU 资源。
  • 处于 T 状态的进程可能仍在使用某些内存资源。

t (tracing stop)跟踪停止

在 Linux 中跟踪停止是一项功能,允许您停止进程运行,然后稍后恢复它。这对于调试或解决进程问题非常有用。该信号将使进程处于停止状态。该进程不会使用任何 CPU 资源,但仍会使用一些内存资源。您可以通过向其发送信号来恢复该过程

 在 Linux 中,调试器 (如 GDB) 可以通过调用 sigpause 信号来暂停正在运行的进程。当进程接收到这个信号时,它会立即被停止,并且所有正在运行的进程将被挂起,以便调试器可以访问进程的内存和其他资源。

 当进程被追踪停止时,它的状态将显示为 “t”,同时进程的 PID 值将被标记为 “tracing stop”。此时,进程将不再执行,而是停留在执行点,以便调试器可以访问进程的内存和其他资源。如果进程正在被调度器调度,那么它将被标记为 “stopped”,并且在调度器的保护下不会被其他进程抢占。

 需要注意的是,“tracing stop” 状态只在特定条件下出现,例如在使用 GDB 调试进程时,或者在内核中启用了调试器支持。通常情况下,用户不应该在正常运行的系统中启用追踪停止功能,因为这可能会导致系统崩溃或数据丢失。
在这里插入图片描述

有关在 Linux 中跟踪停止的一些其他详细信息:

  • 跟踪停止是 Linux 内核的一个功能。
  • 要使用跟踪停止,您需要具有根权限。
  • 您可以使用该命令将信号发送到一个进程或一组进程。kill STOP
  • 该信号将使进程处于停止状态。STOP
  • 该进程不会使用任何 CPU 资源,但仍会使用一些内存资源。
  • 您可以通过向其发送信号来恢复该过程。CONT
  • 跟踪停止可用于调试或解决进程问题。
  • 谨慎使用跟踪停止非常重要,因为如果使用不当,它也可能导致问题。

D (disk sleep)不间断睡眠状态

不间断睡眠状态:处于 D 状态的进程处于不间断睡眠状态。这意味着进程正在等待事件发生,但不能被信号中断。这些进程通常正在等待硬件事件,例如磁盘读取或网络数据包到达。

 处于 D 状态的进程不使用任何 CPU 资源。但是,它们可能仍在使用一些内存资源。处于 D 状态的进程使用的内存量将取决于进程的大小和它正在等待的数据量。

 如果有大量进程处于 D 状态,则可能是出现问题的迹象。例如,如果有大量进程正在等待磁盘 I/O,则可能表明磁盘过载。

 如果担心处于 D 状态的进程数,可以使用该命令查看处于该状态的进程列表。您还可以使用该命令查看进程的实时列表,包括其状态。ps top

 如果发现有大量进程处于 D 状态,则可以尝试确定问题的原因。确定原因后,可以尝试解决问题。例如,如果有大量进程正在等待磁盘 I/O,则可以尝试提高磁盘的性能。

下面是减少处于 D 状态的进程数的一些提示:

  • 确保您的硬件配置正确。例如,确保磁盘已正确分区,并且有足够的内存。
  • 安装和使用适当的软件。例如,如果您使用的是 Web 服务器,请确保使用的是专为高流量网站设计的 Web 服务器。
  • 监控您的系统并识别任何潜在问题。例如,如果您注意到磁盘 I/O 很高,则可以尝试识别导致高 I/O 的应用程序并尝试对其进行优化。

浅度睡眠:(可以被终止)

深度睡眠:
小故事:
 进程A需要写入1万条数据进入磁盘,磁盘说可以但是它是外设比较慢让进程A等着它慢慢IO,但是这个时候操作系统的内存突然告急,然后发现这个进程A在慢悠悠等待磁盘IO,即使这个时候OS疯狂挂起进程也解决不了内存问题,那么Linux操作系统会自己杀掉这个进程来缓解内存告急。因为操作系统压力太大了扛不住了要崩溃了然后发现这个进程A占用大量资源却在原地等待所以就会直接杀掉进程A,这个时候磁盘就喊话进程A:‘不知是写完了还是异常终止了’,但是进程A没有回复磁盘,因为它被操作系统挂掉了,这个时候磁盘就很尴尬,这数据不知怎么办它也有别的事要办就给数据抛了。这个时候用户来了发现数据丢失,操作系统、进程A、磁盘都说事情不应该怪它,最后它们商量一下,管理者说给进程A一个免死金牌,给操作系统说有免死金牌的就不要杀死。这个时候进程A有免死金牌的状态就是D (disk sleep)状态。

 深度睡眠状态下,进程无法被操作系统杀掉,只能通过断电或者进程自己醒来再解决。一般这种状态只会出现在高IO的时候。

Z (zombie)僵尸状态

处于 Z 状态的进程是僵尸进程。僵尸进程是已终止,但其父进程尚未读取其退出状态的进程。僵尸进程不使用任何 CPU 或内存资源。但是,它们确实在工艺表中占用了少量空间。

僵尸进程是在子进程终止且其父进程不会立即读取其退出状态时创建的。子进程的退出状态存储在进程表中,父进程必须读取此状态才能释放子进程的资源。如果父进程未读取退出状态,则子进程将保持僵尸状态。

 父进程可能不会立即读取子进程的退出状态有几个原因。一个原因是父进程可能正忙于执行其他操作。另一个原因是父进程可能不希望子进程终止。

 僵尸进程对系统无害。但是,它们可能是问题的征兆。例如,如果存在大量僵尸进程,则可能表明父进程未正确处理子进程终止。若要删除僵尸进程,父进程必须读取其退出状态。父进程可以使用系统调用执行此操作。系统调用会将子进程的退出状态返回到父进程。父进程读取退出状态后,将从进程表中删除子进程。

看看僵尸进程:在这里插入图片描述

while :; do ps axj | head -1 && ps axj | grep Test | grep -v grep; sleep 1;done

在这里插入图片描述

在这里插入图片描述

X (dead)死亡状态

X (dead)" 状态通常表示进程已经死亡,无法再次被调度执行。当进程死亡时,它的所有资源将被释放,并且进程状态将被更新为 “X”。

进程可能由于多种原因进入 X 状态,例如:

  • 进程被用户或信号杀死。
  • 进程内存不足。
  • 该过程遇到错误,无法继续。
  • 该过程被硬件事件中断,例如磁盘读取或网络数据包到达。

 当进程死亡时,进程状态将被更新为 “X”,同时进程的 PID 值将被标记为 “dead”。此时,进程将不再被调度器调度,并且其他进程也无法抢占该进程的资源。在 Linux 中,进程死亡后会出现一些特殊情况。例如,如果进程正在被调度器调度,那么它的进程状态将被更新为 “X”,并且调度器不会再次调度该进程。此外,如果进程正在被其他进程阻塞,那么该进程也将被阻塞,直到被其他进程唤醒。

X 状态很重要,因为它允许操作系统回收进程使用的资源。这包括进程的内存、打开的文件和网络套接字。通过回收这些资源,操作系统可以使它们可用于其他进程。

X 状态也很重要,因为它允许操作系统检测和报告错误。当进程终止时,操作系统通常会记录终止的原因。此信息可用于解决进程或操作系统的问题。

有关 X(死)状态的一些其他详细信息:

  • X 状态也称为终止状态。
  • 处于 X 状态的进程不使用任何 CPU 或内存资源。
  • 无法恢复处于 X 状态的进程。
  • 处于 X 状态的进程可以被用户或信号杀死。
  • 处于 X 状态的进程可用于检测和报告错误。

孤儿进程

父进程先退出,子进程就称之为“孤儿进程”

子进程已经停止,但是其父进程没有回收子进程的资源,这时候这个子进程是僵尸状态。如果父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?

 子进程会被1号进程管理,如果不这样,那么子进程退出的时候对应的僵尸状态也就不会被回收,会导致内存泄漏。

我们将它的父进程kill ,其子进程被1号进程收养:
在这里插入图片描述
如果是前台进程创建的子进程,子进程成为孤儿进程后,会自动变为后台进程。


如有错误或者不清楚的地方欢迎私信或者评论指出🚀🚀

  • 29
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

侠客cheems

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

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

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

打赏作者

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

抵扣说明:

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

余额充值