背景 当后端是本地磁盘或者底层是一个分布式的块存储,底层磁盘或者分布式块存储出现问题,比如mount进程处于D状态,这时候内核会什么行为?重复挂载会出现什么问题?...模式出现D状态的mount Interruptible Sleep :可中断睡眠,在 ps 命令中显示 S。处在这种睡眠状态的进程是可以通过给它发送信号来唤醒的。...Uninterruptible Sleep:不可中断睡眠,在 ps 命令中显示 D。处在这种睡眠状态的进程无法立即处理任何发送给它的信号,这也是无法用 kill 杀掉它的原因。...D状态的dd导致某些设备处于执行IO的不可中断的模式。mount进程读取超级块先关资源时候hang主了.在了解这个问题之前需要了解下外设磁盘和系统之间的通信方式。...既然IO通过方式,D状态的mount 进程设备处于做IO操作,无法被打断的状态,新的进程再次mount务必要进行一些IO操作,也必然产生中断,但是这个中断无法被响应,就一直处于D+状态。
状态对进程进行保护,以避免进程与设备交互的过程被打断,造成设备陷入不可控的状态。 ...,可能是外设本身出了故障,也可能是比如挂载的远程文件系统NFS等已经不可访问了,那么就很会不幸地被 ps 看到进程状态位已经变成D。 ...NFS 卷不可访问导致进程进入 D状态的,那么可以通过恢复该 NFS 卷的连接来使进程的 IO 请求得到满足,除此之外,要想干掉处在 D 状态进程就只能重启整个 Linux 系统了。...如果为了想要杀掉 D 状态的进程,而去杀掉它的父进程(通常是shell,在shell下允许某进程,然后某进程转入D状态),就会出现这样的状态:他们的父进程被杀掉了,但是他们的父进程 PID 都变成了1,...也就是 init 进程,D状态的进程会变成僵尸进程。
这篇文章聊聊 Linux 中 D 状态的进程与平均负载的关系,通过阅读本文,你会了解到这些东西。...D 状态的进程是什么 如何编写内核模块模拟 D 状态进程 Linus 对 D 状态进程的看法 平均负载的概念 在 top 和 uptime 命令输出中的第一行有一个 load average 字段,由三个数字表示...D 状态的进程 TASK_UNINTERRUPTIBLE 在 top 命令中显示为 D 标记,也就是大名鼎鼎的 「D 状态」进程。...如果只是这些问题,倒也平平无奇,不关我们什么事,但是需要注意的是 D 状态的进程会增加系统的平均负载。...D 状态的进程算在平均负载里也还算合理。
系统中的每个进程都必然处于以上所列进程状态中的一种。...状态 描述 TASK_RUNNING 表示进程要么正在执行,要么正要准备执行(已经就绪),正在等待cpu时间片的调度 TASK_INTERRUPTIBLE 进程因为等待一些条件而被挂起(阻塞)而所处的状态...这些条件主要包括:硬中断、资源、一些信号……,一旦等待的条件成立,进程就会从该状态(阻塞)迅速转化成为就绪状态TASK_RUNNING TASK_UNINTERRUPTIBLE 意义与TASK_INTERRUPTIBLE...进程被停止执行,当进程接收到SIGSTOP、SIGTTIN、SIGTSTP或者SIGTTOU信号之后就会进入该状态 TASK_TRACED 表示进程被debugger等进程监视,进程执行被调试程序所停止...,当一个进程被另外的进程所监视,每一个信号都会让进城进入该状态
运行 R 这一个状态,所以比较清晰 而我们今天要学习的正是 Linux 中的 进程 状态 进程是何种状态,取决于此进程的PCB在哪里排队 ️运行 R 首先来看看第一种状态 R 以我们以往的认知来说...还有一种方式终止进程:kill kill -9 PID 终止进程,当进程在后台运行时(状态不加 +),我们是无法通过 ctrl+c 终止的,但 kill 指令可以终止 ️休眠 D 还存在一种特殊睡眠状态...休眠 D,休眠 又被称为不可中断休眠,顾名思义,休眠 D 状态下的 进程 是无法终止的,kill 指令和 OS都无能为力,只能默默等待 进程阻塞 结束,拿到资源了,进程 才会停止 休眠 D 状态 终止...休眠 D 进程的一个方法就是切断电源,此时进程是结束了,但整个系统也结束了 倘若存在 休眠 D 进程长时间运行,那么此时就表示系统离宕机不远了 不可休眠状态比较少见,一般出现于IO阻塞 用途: 使操作系统无法杀死该...进程 在指定行暂停运行,此时 进程 处于 追踪暂停状态 t ️死亡 X 当进程被终止后,就处于 死亡 X 状态 死亡状态是无法在任务列表中观察到的,死亡 X 状态只是一个返回状态 ️僵尸 Z 与死亡状态相对应的还有一个
int main() { while(1) { printf("我是一个进程 pid: %d ppid: %d\n",getpid...while(1) { printf("我是子进程 pid: %d ppid: %d\n",getpid(),getppid( ))...(1) { printf("我是父进程 pid: %d ppid: %d\n",getpid(),getppid ());...stop)", /* 8 */ "X (dead)", /* 16 */ "Z (zombie)", /* 32 */ }; 这个S状态和D状态就算是阻塞状态了,S状态又叫浅度睡眠,D...下面通过一些代码演示 int main() { while(1) { printf("我是一个进程 pid: %d ppid: %d\n",getpid(),getppid
/mytest 10 10 ^C//可以被终止 在终端1中ctrl c,终止mytest运行,S状态被终止 3.D休眠状态 ——不可中断休眠 想要往磁盘写入100MB的数据,由于磁盘写入数据很慢,所以进程把自己设置成阻塞状态...,若内存资源特别紧张,操作系统就想要把这个阻塞状态的进程干掉,可是此时磁盘依旧还在写入数据,这样做就会使磁盘写入数据失败,最终就会使100MB的数据丢失 若该进程的休眠状态为D状态,使操作系统无法干掉进程...while(1) 10 { 11 printf("我是子进程,我在运行,pid:%d,ppid:%d",getpid(),getppid()); 12...19 { 20 printf("我是父进程,我在运行,pid:%d,ppid:%d",getpid(),getppid()); 21 sleep(1);...S+ 当使用 kill - 9 +PID值将子进程干掉后,再次使用指令查询进程,发现子进程为僵尸状态,父进程为S+ 僵尸状态危害 在父子进程中,若父进程一直不读取,子进程就会处于Z状态 在父子进程中,若子进程一直处于僵尸状态
进程状态 为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有多个状态,在Linux内核中,进程也可以叫做任务。...D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。...僵尸进程会终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。 所以,只要子进程退出,父进程还在运行,但是父进程没有读取子进程的状态,子进程进入僵尸状态。...\n",getpid()); sleep(30); } else { printf("child[%d] is begin Z......\n",getpid()); sleep(3); exit(-1); } else { printf("child[%d] is begin Z...
//scanf("%d",&count); // printf("hello world,cnt : %d \n",count); //sleep(1); } return 0;...S状态 S状态是可被中断的休眠状态,类似于浅睡眠 D状态 D状态是不可被中断的休眠状态,类似于深睡眠 如何暂停进程 18和19, 18进程继续,19是进程暂停。...x状态 x状态是死亡状态,当一个进程已经终止并且已经中系统中完全清除。 Z状态 z状态是僵尸状态,与死亡状态不同,z状态是指进程已经终止但父进程还没有还没有读取其退出信息的一种状态。...总结 通过对进程状态转换和 Linux 进程状态的分析,我们了解了操作系统如何通过不同的状态管理进程的执行。...进程的三种基本状态转换解释了进程从创建到结束的生命周期,而 Linux 系统中常见的 R、S、D 等状态则细化了进程在运行、等待以及阻塞中的具体表现。
D磁盘休眠状态(Disk sleep):有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。...其他状态 ✈️D状态 D状态,英文叫做:Disk Sleep,即 深度睡眠,但是今天我们没有办法从Shell上演示,所以我就描述一下D状态的作用。...在还没有D状态的时候,如果一个进程在向磁盘中写入200M的数据,这时,进程将200M数据丢给磁盘,接下来就等待磁盘的信号。...这一定是一个大问题,所以操作系统就引入了一种D状态,那么当进程再对磁盘进行写入的时候,OS再过来检查,发现是D状态,便不会出现误判的问题了。 ...由以上的例子,我们也大概了解了D状态的作用,那么现在又有新的疑问了,D状态是阻塞状态吗? 其实,上面进程等待硬件资源的过程也是阻塞过程,所以D状态也是阻塞状态!
什么是进程状态 进程状态是指操作系统对进程的运行状态进行的描述。操作系统通过跟踪进程的状态来控制和管理它们的执行。...当该进程准备就绪,可以被CPU调用时,与此同时,可能会有多个进程同时处于准备就绪状态,这些进程所属状态就是运行状态(R状态),操作系统为了管理和有效这些处于运行状态的进程,就创建了一个运行队列, 这里有如下几个问题需要说明...*/ static const char * const task_state_array[] = { "R (running)", /* 0 */ "S (sleeping)", /* 1 */ "D...S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠状态(interruptible sleep)) D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态...深度睡眠状态(D状态) 这种状态我们平时很难见到,多出现在高并发,高IO的情况下 下面,我们简单了解一下这个状态,为了方便描述,我用第一人称视角来叙述。
23 while(cnt) 24 { 25 printf("I'm child process, pid=%d\n", getpid())...这个就是我们今天要说的——进程状态。 运行队列 进程的状态,一定是与CPU如何执行有关的,所以在了解进程状态之前,有必要先了解CPU如何执行进程。 ...当然,有些情况下进程也许是在等待某些硬件资源,所以并不会一直执行,比如: #include int main() { int ind = 0; scanf("%d", &ind)...; printf("%d", ind); return 0; } 这个时候,程序此时就在等待我们硬件资源,也就是键盘的写入。 ...✈️运行状态 进程有一个状态叫做 运行状态,很多人以为只有当CPU执行到当前进程时,才能称为当前进程为运行状态,实则不然。
进程状态变迁 进程自创建以后,状态可能发生一系列的变化,直到进程退出。...而尽管进程状态有好几种,但是进程状态的变迁却只有两个方向——从TASK_RUNNING状态变为非TASK_RUNNING状态、或者从非TASK_RUNNING状态变为TASK_RUNNING状态。...D-不可中断睡眠 Linux进程状态:D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态。...用在不可中断睡眠的内核线程上硬件交互导致的不可中断进程用 D 表示,但对某些内核线程,它们有可能实际上并没有任何负载,用Idle 正是为了区分这种情况。...要注意,D 状态的进程会导致平均负载升高,I 状态的进程却不会。 T-暂停或跟踪 Linux进程状态:T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态。
D Uninterruptible sleep (usually IO) R Running or runnable (on run queue) S Interruptible
在Linux系统中,进程的“不可中断状态”就像是这位员工在专心等待一个非常重要的快递包裹——里面可能是他完成工作的关键文件。...不可中断的等待时刻 当进程发起一个磁盘读写请求或等待其他类似的硬件操作时,它会进入“不可中断的睡眠”状态,用字母“D”表示。...僵尸进程与D状态的区别 有时候,不可中断状态的进程会被误解为“僵尸进程”。实际上,两者是不同的。僵尸进程是指已经完成但其父进程未进行资源回收的进程,状态标识为“Z”。...而D状态的进程则是正在活跃等待某些操作完成,它仍然占用着一定的系统资源,只是暂时“冻结”了而已。...总之,不可中断状态是Linux系统中进程生命周期中的一个特殊阶段,它确保了在进行关键性操作时的连续性和完整性,虽然看起来像是在“偷懒”,但实际上是在为后续工作的顺利进行打下坚实的基础。
,我的ID是:%d,我的父进程ID是:%d\n", getpid(), getppid()); sleep(1); } return 0; } 可以看到,我们通过 getpid...= fork(); if(id == 0) { while(1) { printf("子进程,pid:%d, ppid:%d, id:%d\n"...,pid:%d, ppid:%d, id:%d\n", getpid(), getppid(), id); sleep(1); } } else...深度睡眠状态 (D) 上面我们提到,当内存空间不足的时候,操作系统会将一部分进程挂起来节省资源;但是如果内存空间严重不足,挂起已经解决不了问题的时候,操作系统就会主动杀掉某些进程; 那么这里就出现了一个问题...为了防止这种情况的发生,Linux设计出了深度睡眠 (D) 状态,处于深度睡眠状态的进程既不能被用户杀掉,也不能被操作系统杀掉,只能通过断电,或者等待进程自己醒来。
进程通常有下图所示的三种状态。它们之间是可以转换的。 ? 第一种情形:运行的进程挂起是其自身的原因,比如等待输入。 第二种情形:等待CPU,就绪状态是指除了CPU以外的资源它都有了。...只等待进程调度程序将CPU分配给它。 第三种情形:就绪状态的进程获得了CPU,转入运行状态。 第四种情形:阻塞的进程获得了有效的输入,转入就绪状态,等待CPU。...运行态和就绪态之间的转换是由进程调度程序引起的,进程调度程序是操作系统的一部分。
运行态:该进程正在执行; 就绪态:进程做好了准备,只要有机会就开始执行; 阻塞态:进程在某些事件发生前不能执行,如I/O 操作完成; 新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中。...通常是进程控制块已经创建但还没有加载到内存中的新进程; 退出态:操作系统从可执行进程组中释放出的进程,或者是因为它自身停止了,或者是因为某种原因被取消。 ? 进程的三态转换 ?
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。...让进程结束暂停状态,继续运行:kill -18 进程pid 当我们使用gdb调试打断点时,遇到断点处就暂停,此时是t状态,这种场景是被追踪暂停。 D状态 D状态:Linux系统比较特有的一种进程状态。...这么一看,操作系统、进程、磁盘好像都没有错,是制度的问题,当进程在向磁盘中写入数据时谁都不能将该进程干掉。于是D状态就诞生了。...当一个进程处于D状态时,它不会响应任何请求,任何人和操作系统都无法干掉这个进程。 结束D状态方式: 等待某个条件,比如数据读入完毕 直接断电 僵尸进程 僵死状态(Zombies)是一个比较特殊的状态。...处于Z状态的进程的相关资源不能被释放。只有当父进程把子进程的相关资源回收后,子进程才能变成死亡状态(X状态)。
一、进程状态 1.创建状态 进程由创建而产生。...2.就绪状态 这是指进程已经准备好运行的状态,即进程已分配到除CPU以外所有的必要资源后,只要再获得CPU,便可立即执行。...如果系统中有许多处于就绪状态的进程,通常将它们按照一定的策略排成一个队列,该队列称为就绪队列。有执行资格,没有执行权的进程。 3.运行状态 这里指进程已经获取CPU,其进程处于正在执行的状态。...对任何一个时刻而言,在单处理机的系统中,只有一个进程处于执行状态而在多处理机系统中,有多个进程处于执行状态。既有执行资格,又有执行权的进程。...此时引起进程调度,操作系统把处理机分配给另外一个就绪的进程,而让受阻的进程处于暂停的状态,一般将这个暂停状态称为阻塞状态 5.终止状态 进程的终止也要通过两个步骤:首先,是等待操作系统进行善后处理,
领取专属 10元无门槛券
手把手带您无忧上云