进程状态——Linux

目录

进程状态

运行状态

排队状态

阻塞状态

挂起状态

前台进程与后台进程 

补充Kill

Linux下具体进程状态:

R运行状态

S睡眠状态

D磁盘休眠状态

T停止状态

t停止状态

X死亡状态

Z僵尸状态

孤儿进程


声明:目前我们可以将进程理解为:PCB+可执行程序

进程状态

        进程在系统中主流的四个主要状态:运行状态、排队状态、阻塞状态、挂起状态。 

运行状态

        进程只要在运行队列里或正在被CUP正在执行时,此进程就处于运行状态。

排队状态

        首先,要说明,系统内部的所有进程不是一次性执行完毕的,而是在内部排队等待某种资源。由于大部分计算机中只有一个 CPU,而一个 CPU 在任一时刻只能运行一个进程,因此在 Linux 系统内核中,所有需要运行的进程必须依次“排队”等待 CPU 的调度。这里的“排队”并不是进程本身实际排队等待,而是进程对应的 task_struct 结构体被组织到调度队列中,等待被 CPU 调度执行。

        不仅在等待 CPU 时需要加入调度队列,进程在等待某种资源(例如外设、I/O 等)时,也会处于等待队列中。这里的“排队”不同于传统数据结构中的线性排队,而是通过将 task_struct 结构体嵌入到特定的内核队列(如运行队列或等待队列)中,并通过指针和地址偏移的方式快速访问其属性数据(简而言之就是通过队列的某一个节点确定这个节点所属于的PCB(地址),从而该PCB里进程的其他属性数据具体如下图)。

        总的来说,进程的排队状态是指进程在等待被执行或等待获取资源时所处的一种状态。在排队状态下,进程会被放入相应的队列中,等待其前面的进程释放资源或完成其任务,当多个进程同时请求系统资源时,操作系统会根据一定的调度算法将这些进程按照一定的顺序排列,以便按照一定的优先级逐个分配资源。

        进程也不是一直在运行的,可能由于需要硬件资源而被迫等待(当你调用scanf函数等待键盘输入时,就相当于调用函数的程序所在的进程处于阻塞状态)

阻塞状态

        阻塞状态是进程的执行过程中一种暂停状态,此时进程放弃处理机而处于暂停状态。当进程处于阻塞状态时会排成一个队列,形成这种情况通常是因为进程在等待某个事件的发生。如,当我们的进程在进行等待软硬件资源的时候,资源如果没有就绪,我们的进程task_struct 只能将自己设置为阻塞状态,并将自己的pcb连入等待的资源提供的等待队列。

挂起状态

        进程的挂起状态是指一个进程由于某些原因暂时不能执行,而被系统挂起来,等待以后执行。在这种状态下,进程不会占用内存空间,也不会被调度执行,进程只是被存储在磁盘上。这种状态通常发生在系统资源不足或者进程等待某些事件时发生。当条件允许时,被挂起的进程就会被操作系统再次调回内存,重新进入等待被执行的状态,即就绪态。

前台进程与后台进程 

        前台进程和后台进程是操作系统中的两种进程类型,它们在运行状态和行为上存在显著差异。一般情况下,进程中的可执行程序直接运行是前台进程,当在执行可执行程序时,在后面加上“ & ”符号,就变成了后台进程。前台进程和后台进程在进程状态符观察出。当查看进程状态时,若状态符后面有“ + ”号,此进程表示前台进程,若状态符后面没有“ + ”号,此进程表示后台进程。   

        通常情况下,前台进程可以直接使用键盘上的 Ctrl+C 来终止,但后台进程则需要使用特定的命令,如“ kill -9 [PID] ”来终止。因此,当我们设为后台进程时,用户必须要获取该进程的PID。

可以看到Ctrl+c没有杀死进程

补充Kill

          `kill -l` 命令用于查看系统中定义的所有信号及其对应的编号。这些信号可以用于 `kill` 命令来向进程发送特定的信号控制其状态。例如,`kill -9` 命令会向进程发送 `SIGKILL` 信号,强制终止进程;`kill -19` 命令会向进程发送 `SIGSTOP` 信号,使进程进入暂停状态;`kill -18` 命令用于向进程发送 `SIGCONT` 信号,使进程从暂停状态恢复执行。需要注意,`SIGSTOP` 和 `Ctrl+Z` 的效果类似,但不完全相同,`Ctrl+Z` 发送的是 `SIGTSTP` 信号,而 `kill -18` 发送的 `SIGCONT` 信号并不等同于 `Ctrl+C`,后者发送的是 `SIGINT` 信号。

Linux下具体进程状态:

R运行状态

        表示进程正在处于系统的运行状态,与上面的运行状态效果一样,并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里

S睡眠状态

        进程在等待某件事件完成而进入睡眠。这种睡眠状态如同阻塞状态,有时候也叫做可中断睡眠,可直接用键盘进行中断。

D磁盘休眠状态

        这种状态有时候也叫不可中断睡眠状态,它用于资源管理。当进程的PCB指针放入磁盘结构体的队列中时,如果内存紧张,操作系统可能需要终止一些后台进程来缓解内存压力。但是,如果正在写入磁盘的数据很重要,直接终止可能会导致不良后果。此时将进程置于D状态可以确保即使在内存紧张的情况下,操作系统也不会终止它,直到IO操作完成。

T停止状态

        表示进程被暂定,如同 kill -19 命令停止运行进程。此状态也可理解为阻塞状态的分支。

t停止状态

        表示进程处于跟踪状态而暂定,通常用于调试目的。

注意:状态T和状态t都是表示进程被停止,其中,状态T停止是常规控制停止,而状态t停止是因为深入跟踪导致进程停止,通常用于调试。

X死亡状态

        此状态表示进程已经结束,并且可以被回收的状态。当一个进程完全结束执行,并且系统已经回收了其资源时,该进程就会进入X状态,因此,这个状态只是一个返回状态,我们不会在任务列表里看到这个状态。

Z僵尸状态

        表示一个进程已经结束执行,但其父进程还没有读取它的退出状态信息。在这种情况下,该进程会以终止状态保持在进程表中,等待父进程读取其退出状态代码。

        当一个进程退出时,它会将退出信息保存在task_struct中,供父进程或操作系统读取。如果父进程在子进程退出后仍然存在,但没有读取子进程的退出状态信息,子进程就会进入Z状态。处于Z状态的进程不会占用CPU资源,但会占用进程表中的一个槽位和内存,直到其父进程读取了其退出状态信息并对其进行回收,因此,僵尸进程可能会造成内存资源的浪费,有一定的危害。

孤儿进程

        孤儿进程是指一个进程的父进程已经终止,而该进程还在运行。由于孤儿进程原有的父进程已不存在,所以,孤儿进程通常由init进程(进程号为1,是 Linux 系统中的第一个用户级进程,由内核在完成系统启动后启动,它的主要职责是初始化系统,启动其他进程,并维持系统的运行状态。init 进程的 PID 永远为 1,是所有其他用户进程的父进程。)收养,并由init进程对它们完成状态收集工作。因此,孤儿进程并不会有什么危害。

用途:在多进程任务执行中,当父进程需要循环向多个子进程派发任务时,由于无法预知子进程何时完成任务,可能导致以下问题

  1. 父进程必须阻塞式等待,以便在子进程完成任务后进行回收。这种方式会导致父进程无法继续向其他子进程派发任务,严重影响并行效率。
  2. 如果父进程选择不回收子进程,已完成任务的子进程将变为僵尸进程,占用系统资源,可能最终导致资源耗尽或系统性能下降。

        为了解决这些问题,可以采用以下优化方案:在任务派发时,让子进程进一步派生孙子进程,由孙子进程负责执行具体任务,而子进程在任务派发完成后立即退出。这样,父进程无需等待子进程完成,即可继续派发其他任务。孙子进程在任务执行过程中成为孤儿进程,系统会自动将其交由 PID 为 1 的 init 进程(或类似进程管理系统)接管并回收资源。这种方式避免了父进程阻塞、避免了僵尸进程的产生,并实现了父进程、子进程和孙子进程之间的高效协作,从而显著提升任务的并行执行效率。(大概理解知道孤儿进程有用就行,知识不全不必深究) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值