Linux 进程(三)

Linux进程状态的查看:

        这是Linux内核源代码对于进程状态的定义:

Linux 进程(三)_第1张图片

         R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
        S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠,也叫浅度睡眠(interruptible sleep))。

        D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
        T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
        X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

         注意:状态后面有无+ 号说明这个进程是否为前台进程,有+就是前台进程可以通过ctrl+c终止掉,没有就需要通过 指令(kill -9 pid) 来杀死进程。

 R运行状态、 S睡眠状态(浅度睡眠)

        

        写一段简单的代码:

Linux 进程(三)_第2张图片

Linux 进程(三)_第3张图片

        这是一个死循环,但是我们经过多次的命令来查看该进程的状态发现,其都是s+ 的状态,难道是因为sleep的原因吗?但是经过实验发现即使是把sleep去掉,查看进程也是处于s+状态,原因是,cpu的处理速度极快(相对于外设来说,可能cpu已经处理完进程了,但是还没有打印在屏幕上),加上还有时间片的概念,导致一个进程在cpu上可能运行几毫秒就结束了,所以说即使查看死循环,也是s+的状态。

        那么怎么样才能查看到死循环,只有跑一个什么都不干的死循环!!

Linux 进程(三)_第4张图片

        只有这样的死循环才会出现R状态。

        D磁盘休眠状态

        当内存内存吃紧时,操作系统会杀死一些进程,避免操作系统挂掉,那么有些进程正在和设备之间互动,或者等待设备的反馈信息,或者等待设备的资源,如果杀死该进程,就会造成一些损失,那么D状态就是避免操作系统在内存吃紧的情况下“滥杀无辜”给予进程的“免死金牌”。

        但是系统一旦出现D的情况,说明操作系统距离挂掉也就不远了,说明当前磁盘反应的速度十分缓慢,缓慢到还被操作系统察觉到!!

        所以说一般情况下D状态是不会出现的。

         T、t停止状态(stopped)

Linux 进程(三)_第5张图片

                以上两个命令就是停止和重新运行进程:

Linux 进程(三)_第6张图片

        注意:ctrl + z 也是停止进程,ctrl+ c是中断程序,注意区别! 

Linux 进程(三)_第7张图片

        gdb调试模式下会出下 “t”。

        在系统中有时也会出现 T 大部分原因是 操作系统为了保护某些有害的进程对硬件的访问,而停止了进程。

          X死亡状态(dead):

Linux 进程(三)_第8张图片

Linux 进程(三)_第9张图片

        运行五秒后子进程显示出defunct(失效的;死人)转台!

        僵尸进程

        僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
        僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
        所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

        还是上面的代码!

Linux 进程(三)_第10张图片

为什么会有僵尸进程呢?

        创建进程是给用户完成工作的,进程结束时需要有数据结果!保存到pcb中,只有父进程读取了之后,拿到数据后,该进程才能销毁。

        如果父进程不读取子进程,那么子进程会一直处于僵尸状态,pcb也是一直会存在的,会占据内存,造成内存泄露!!!

Linux 进程(三)_第11张图片

        孤儿进程:

        父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
        父进程先退出,子进程就称之为“孤儿进程”
        孤儿进程被1号init进程领养,当然要有init进程回收喽。

        代码:

Linux 进程(三)_第12张图片

Linux 进程(三)_第13张图片

        1号进程也可以是操作系统。同时子进程变成后台进程,只能通过指令来杀死。

你可能感兴趣的:(linux,linux)