精华内容
下载资源
问答
  • 进程运行状态

    2017-09-07 10:12:19
    进程是一个动态实体,所以他是有生命。...这种情况下,称进程处于就绪态。阻塞态。指进程因为需要等待所需资源而放弃处理器,或者进程本不拥有处理器,且其他资源也没有满足,从而即使得到处理器也不

    进程是一个动态的实体,所以他是有生命的。从创建到消亡,是一个进程的整个生命周期。在这个周期中,进程可能会经历各种不同的状态。一般来说,所有进程都要经历以下的3个状态:

    1. 就绪态。指进程已经获得所有所需的其他资源,正在申请处理处理器资源,准备开始执行。这种情况下,称进程处于就绪态。
    2. 阻塞态。指进程因为需要等待所需资源而放弃处理器,或者进程本不拥有处理器,且其他资源也没有满足,从而即使得到处理器也不能开始运行。这种情况下,进程处于阻塞态。阻塞状态也称休眠状态或者等待状态。
    3. 运行态。进程得到了处理器,并不需要等待其他任何资源,正在执行的状态,称之为运行态。只有在运行态时,进程才可以使用所申请到的资源。

    在Linux系统中,将各种状态进行了重新组织,由此得到了Linux进程的几个状态:

    • RUNNING:正在运行或者在就绪队列中等待运行的进程。也就是上面提到的运行态和就绪态进程的综合。一个进程处于RUNNING状态,并不代表他一定在被执行。由于在多任务系统中,各个就绪进程需要并发执行,所以在某个特定时刻,这些处于RUNNING状态的进程之中,只有一个能得到处理器,而其他进程必须在一个就绪队列中等待。即使是在多处理器的系统中,Linux也只能同时让一个处理器执行任务。
    • UNINTERRUPTABLE:不可中断阻塞状态。处于这种状态的进程正在等待队列中,当资源有效时,可由操作系统进行唤醒,否则,将一直处于等待状态。
    • INTERRUPTABLE:可中断阻塞状态。与不可中断阻塞状态一样,处于这种状态的进程在等待队列中,当资源有效时,可以有操作系统进行唤醒。与不可中断阻塞状态有所区别的是,处于此状态中的进程亦可被其他进程的信号唤醒。
    • STOPPED:挂起状态。进程被暂停,需要通过其它进程的信号才能被唤醒。导致这种状态的原因有两种。其一是受到相关信号(SIGSTOP,SIGSTP,SIGTTIN或SIGTTOU)的反应。其二是受到父进程ptrace调用的控制,而暂时将处理器交给控制进程。
    • ZOMBIE:僵尸状态。表示进程结束但尚未消亡的一种状态。此时进程已经结束运行并释放掉大部分资源,但尚未释放进程控制块。

    image


     

     

    ◆运行状态(TASK_RUNNING)
    当进程正在被CPU执行,或已经准备就绪随时可由调度程序执行,则称该进程为处于运行状态(running)。进程可以在内核态运行,也可以在用户态运行。当系统资源已经可用时,进程就被唤醒而进入准备运行状态,该状态称为就绪态。这些状态(图中中间一列)在内核中表示方法相同,都被成为处于TASK_RUNNING状态。


    ◆可中断睡眠状态(TASK_INTERRUPTIBLE)
    当进程处于可中断等待状态时,系统不会调度该进行执行。当系统产生一个中断或者释放了进程正在等待的资源,或者进程收到一个信号,都可以唤醒进程转换到就绪状态(运行状态)。

    ◆暂停状态(TASK_STOPPED)
    当进程收到信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU时就会进入暂停状态。可向其发送SIGCONT信号让进程转换到可运行状态。


    ◆僵死状态(TASK_ZOMBIE)
    当进程已停止运行,但其父进程还没有询问其状态时,则称该进程处于僵死状态。


    ◆不可中断睡眠状态(TASK_UNINTERRUPTIBLE)
    与可中断睡眠状态类似。但处于该状态的进程只有被使用wake_up()函数明确唤醒时才能转换到可运行的就绪状态。

     

    当一个进程的运行时间片用完,系统就会使用调度程序强制切换到其它的进程去执行。另外,如果进程在内核态执行时需要等待系统的某个资源,此时该进程就会调用
    sleep_on()或sleep_on_interruptible()自愿地放弃CPU的使用权,而让调度程序去执行其它进程。进程则进入睡眠状
    态(TASK_UNINTERRUPTIBLE或TASK_INTERRUPTIBLE)。


    只有当进程从“内核运行态”转移到“睡眠状态”时,内核才会进行进程切换操作。在内核态下运行的进程不能被其它进程抢占,而且一个进程不能改变另一个进程的状态。为了避免进程切换时造成内核数据错误,内核在执行临界区代码时会禁止一切中断。

    展开全文
  • linux 常见进程状态的调度及算法

    千次阅读 2016-06-10 09:55:40
    一、进程的状态: 1、操作系统中: 进程是一个动态实体,所以他是有生命。从创建到消亡,是一个进程...这种情况下,称进程处于就绪态。 (2)阻塞态。指进程因为需要等待所需资源而放弃处理器,或者进程本不拥有

    一、进程的状态:

    1、操作系统中:

    进程是一个动态的实体,所以他是有生命的。从创建到消亡,是一个进程的整个生命周期。在这个周期中,进程可能会经历各种不同的状态。一般来说,所有进程都要经历以下的3个状态:

    (1)就绪态。指进程已经获得所有所需的其他资源,正在申请处理处理器资源,准备开始执行。这种情况下,称进程处于就绪态。

    (2)阻塞态。指进程因为需要等待所需资源而放弃处理器,或者进程本不拥有处理器,且其他资源也没有满足,从而即使得到处理器也不能开始运行。这种情况下,进程处于阻塞态。阻塞状态也称休眠状态或者等待状态。

    (3)运行态。进程得到了处理器,并不需要等待其他任何资源,正在执行的状态,称之为运行态。只有在运行态时,进程才可以使用所申请到的资源。

                                                 

    2、在Linux系统中,将各种状态进行了重新组织,由此得到了Linux进程的几个状态:

    • R(runing):进程处于运行或就绪状态。也就是上面提到的运行态和就绪态进程的综合。一个进程处于RUNNING状态,并不代表他一定在被执行。由于在多任务系统中,各个就绪进程需要并发执行,所以在某个特定时刻,这些处于RUNNING状态的进程之中,只有一个能得到处理器,而其他进程必须在一个就绪队列中等待。即使是在多处理器的系统中,Linux也只能同时让一个处理器执行任务。
    • D(disk sleep)UNINTERRUPTABLE:不可中断阻塞状态。被阻断而等待一个事件,不会被信号激活,除了I/O信号,处于这种状态的进程正在等待队列中,当资源有效时,可由操作系统进行唤醒,否则,将一直处于等待状态。
    • S(sleeping)INTERRUPTABLE:可中断阻塞状态。被阻断而等待一个事件,可能会被一个信号激活,与不可中断阻塞状态一样,处于这种状态的进程在等待队列中,当资源有效时,可以有操作系统进行唤醒。与不可中断阻塞状态有所区别的是,处于此状态中的进程亦可被其他进程的信号唤醒。
    • T(stopped):挂起状态。进程被暂停,需要通过其它进程的信号才能被唤醒。导致这种状态的原因有两种。其一是受到相关信号(SIGSTOP,SIGSTP,SIGTTIN或SIGTTOU)的反应。其二是受到父进程ptrace调用的控制,而暂时将处理器交给控制进程。
    • t(tracing stop):追踪停止
    • X(dead) :进程已经完全死掉,这个永远看不见
    • Z(zombie):僵尸状态。表示进程结束但尚未消亡的一种状态。此时进程已经结束运行并释放掉大部分资源,但尚未释放进程控制块。

    3、每个进程都把它的信息放在 task_struct 这个数据结构里,task_struct 包含了这些内容:

    • 状态(任务状态,退出代码,退出信号。。。)
    • 优先级
    • 进程id(PID)
    • 父进程id(PPID)
    • 子进程
    • 使用情况(cpu时间,打开的文件。。。)
    • 跟踪信息
    • 调度信息
    • 内存管理信息

    保存进程信息的数据结构叫做 task_struct,并且可以在 include/linux/sched.h 里找到它。所有运行在系统里的进程都以 task_struct 链表的形式存在内核里。


                               

    微笑乐一乐,haha~:

    关于D和Z一段有趣的解释:
     
        有一类垃圾却并非这么容易打扫,那就是我们常见的状态为 D (Uninterruptible sleep) ,以及状态为 Z (Zombie) 的垃圾进程。这些垃圾进程要么是求而不得,像怨妇一般等待资源(D),要么是僵而不死,像冤魂一样等待超度(Z),它们在 CPU run_queue 里滞留不去,把 Load Average 弄的老高老高,没看过我前一篇blog的国际友人还以为这儿民怨沸腾又出了什么大事呢。怎么办?开枪!kill -9!看你们走是不走。但这两种垃圾进程偏偏是刀枪不入的,不管换哪种枪法都杀不掉它们。无奈,只好reboot,像剿灭禽流感那样不分青红皂白地一律扑杀!
     
        怨妇 D,往往是由于 I/O 资源得不到满足,而引发等待,在内核源码 fs/proc/array.c 里,其文字定义为“ "D (disk sleep)", /* 2 */ ”(由此可知 D 原是Disk的打头字母),对应着 include/linux/sched.h 里的“ #define TASK_UNINTERRUPTIBLE 2 ”。举个例子,当 NFS 服务端关闭之时,若未事先 umount 相关目录,在 NFS 客户端执行 df 就会挂住整个登录会话,按 Ctrl+C 、Ctrl+Z 都无济于事。断开连接再登录,执行 ps axf 则看到刚才的 df 进程状态位已变成了 D ,kill -9 无法杀灭。正确的处理方式,是马上恢复 NFS 服务端,再度提供服务,刚才挂起的 df 进程发现了其苦苦等待的资源,便完成任务,自动消亡。若 NFS 服务端无法恢复服务,在 reboot 之前也应将 /etc/mtab 里的相关 NFS mount 项删除,以免 reboot 过程例行调用 netfs stop 时再次发生等待资源,导致系统重启过程挂起。

      冤魂 Z 之所以杀不死,是因为它已经死了,否则怎么叫 Zombie(僵尸)呢?冤魂不散,自然是生前有结未解之故。在UNIX/Linux中,每个进程都有一个父进程,进程号叫PID(Process ID),相应地,父进程号就叫PPID(Parent PID)。当进程死亡时,它会自动关闭已打开的文件,舍弃已占用的内存、交换空间等等系统资源,然后向其父进程返回一个退出状态值,报告死讯。如果程序有 bug,就会在这最后一步出问题。儿子说我死了,老子却没听见,没有及时收棺入殓,儿子便成了僵尸。在UNIX/Linux中消灭僵尸的手段比较残忍,执行 ps axjf 找出僵尸进程的父进程号(PPID,第一列),先杀其父,然后再由进程天子 init(其PID为1,PPID为0)来一起收拾父子僵尸,超度亡魂,往生极乐。注意,子进程变成僵尸只是碍眼而已,并不碍事,如果僵尸的父进程当前有要务在身,则千万不可贸然杀之。


    二、进程调度的算法

    1、进程调度的基本状态

    1.等待态:等待某个事件的完成;
    2.就绪态:等待系统分配处理器以便运行;
    3.运行态:占有处理器正在运行。
    运行态→等待态 往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的。
    等待态→就绪态 则是等待的条件已满足,只需分配到处理器后就能运行
    运行态→就绪态 不是由于自身原因,而是由外界原因使运行状态的进程让出处理器,这时候就变成就绪态。例如时间片用完,或有更高优先级的进程来抢占处理器等。
    就绪态→运行态 系统按某种策略选中就绪队列中的一个进程占用处理器,此时就变成了运行态
    2、处理机
    高级、中级和低级调度作业从提交开始直到完成,往往要经历下述三级调度:
    高级调度:(High-Level Scheduling)又称为作业调度,它决定把后备作业调入内存运行;
    低级调度:(Low-Level Scheduling)又称为进程调度,它决定把就绪队列的某进程获得CPU;
    中级调度:(Intermediate-Level Scheduling)又称为在虚拟存储器中引入,在内、外存对换区进行进程对换。
    3、方式

    非剥夺方式

    分派程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生某事件而阻塞时,才把处理机分配给另一个进程。

    剥夺方式

    当一个进程正在运行时,系统可以基于某种原则,剥夺已分配给它的处理机,将之分配给其它进程。剥夺原则有:优先权原则、短进程优先原则、时间片原则。
    4、算法
       
    衡量进程调度性能的指标有:周转时间、响应时间、CPU-I/O执行期。

    <1>先来先服务和短作业(进程)优先调度算法

    1.先来先服务调度算法(FCFS)

    先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。(评价:)FIFO算法服务质量不佳,容易引起作业用户不满,常作为一种辅助调度算法

    如下:



    特点:(1)有利于长作业,不利于短作业;

       (2)有利于处理机繁忙的作业,不利于I/O繁忙的作业;


    2.短作业(进程)优先调度算法SJ(P)F

    短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。它们可以分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。(评价:)该算法虽可获得较好的调度性能,但难以准确地知道下一个CPU执行期,而只能根据每一个进程的执行历史来预测。

    如下:



    <2>高优先权优先调度算法

    1.优先权调度算法的类型(FPF)

    为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入了最高优先权优先(FPF)调度算法。此算法常被用于批处理系统中,作为作业调度算法,也作为多种操作系统中的进程调度算法,还可用于实时系统中。当把该算法用于作业调度时,系统将从后备队列中选择若干个优先权最高的作业装入内存。当用于进程调度时,该算法是把处理机分配给就绪队列中优先权最高的进程,这时,又可进一步把该算法分成如下两种。

    1) 非抢占式优先权算法

    在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。这种调度算法主要用于批处理系统中;也可用于某些对实时性要求不严的实时系统中。

    2) 抢占式优先权调度算法

    在这种方式下,系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。因此,在采用这种调度算法时,是每当系统中出现一个新的就绪进程i 时,就将其优先权Pi与正在执行的进程j 的优先权Pj进行比较。如果Pi≤Pj,原进程Pj便继续执行;但如果是Pi>Pj,则立即停止Pj的执行,做进程切换,使i 进程投入执行。显然,这种抢占式的优先权调度算法能更好地满足紧迫作业的要求,故而常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。


    2.高响应比优先调度算法

    在批处理系统中,短作业优先算法是一种比较好的算法,其主要的不足之处是长作业的运行得不到保证。如果我们能为每个作业引入前面所述的动态优先权,并使作业的优先级随着等待时间的增加而以速率a 提高,则长作业在等待一定的时间后,必然有机会分配到处理机。该优先权的变化规律可描述为:
    操作系统
    由于等待时间与服务时间之和就是系统对该作业的响应时间,故该优先权又相当于响应比RP。据此,又可表示为:
    操作系统
    由上式可以看出:

    (1) 如果作业的等待时间相同,则要求服务的时间愈短,其优先权愈高,因而该算法有利于短作业。

    (2) 当要求服务的时间相同时,作业的优先权决定于其等待时间,等待时间愈长,其优先权愈高,因而它实现的是先来先服务。

    (3) 对于长作业,作业的优先级可以随等待时间的增加而提高,当其等待时间足够长时,其优先级便可升到很高,从而也可获得处理机。简言之,该算法既照顾了短作业,又考虑了作业到达的先后次序,不会使长作业长期得不到服务。因此,该算法实现了一种较好的折衷。当然,在利用该算法时,每要进行调度之前,都须先做响应比的计算,这会增加系统开销。


    <3>基于时间片的轮转调度算法

    1.时间片轮转法

         (评价:)  前几种算法主要用于批处理系统中,不能作为分时系统中的主调度算法,在分时系统中,都采用时间片轮转法。

    1) 基本原理

    在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU 分配给队首进程,并令其执行一个时间片。时间片的大小从几ms 到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。换言之,系统能在给定的时间内响应所有用户的请求。

    如下:


    2.多级反馈队列调度算法

    <4>各种算法的比较:

    (1)


                                                 

                                              




    展开全文
  • 进程是一个动态实体,所以他是有生命。...这种情况下,称进程处于就绪态。 阻塞态。指进程因为需要等待所需资源而放弃处理器,或者进程本不拥有处理器,且其他资源也没有满足,从而即使得到处理器也不...

    进程是一个动态的实体,所以他是有生命的。从创建到消亡,是一个进程的整个生命周期。在这个周期中,进程可能会经历各种不同的状态。一般来说,所有进程都要经历以下的3个状态:

    1. 就绪态。指进程已经获得所有所需的其他资源,正在申请处理处理器资源,准备开始执行。这种情况下,称进程处于就绪态。
    2. 阻塞态。指进程因为需要等待所需资源而放弃处理器,或者进程本不拥有处理器,且其他资源也没有满足,从而即使得到处理器也不能开始运行。这种情况下,进程处于阻塞态。阻塞状态也称休眠状态或者等待状态。
    3. 运行态。进程得到了处理器,并不需要等待其他任何资源,正在执行的状态,称之为运行态。只有在运行态时,进程才可以使用所申请到的资源。

    在Linux系统中,将各种状态进行了重新组织,由此得到了Linux进程的几个状态:

    • RUNNING:正在运行或者在就绪队列中等待运行的进程。也就是上面提到的运行态和就绪态进程的综合。一个进程处于RUNNING状态,并不代表他一定在被执行。由于在多任务系统中,各个就绪进程需要并发执行,所以在某个特定时刻,这些处于RUNNING状态的进程之中,只有一个能得到处理器,而其他进程必须在一个就绪队列中等待。即使是在多处理器的系统中,Linux也只能同时让一个处理器执行任务。
    • UNINTERRUPTABLE:不可中断阻塞状态。处于这种状态的进程正在等待队列中,当资源有效时,可由操作系统进行唤醒,否则,将一直处于等待状态。
    • INTERRUPTABLE:可中断阻塞状态。与不可中断阻塞状态一样,处于这种状态的进程在等待队列中,当资源有效时,可以有操作系统进行唤醒。与不可中断阻塞状态有所区别的是,处于此状态中的进程亦可被其他进程的信号唤醒。
    • STOPPED:挂起状态。进程被暂停,需要通过其它进程的信号才能被唤醒。导致这种状态的原因有两种。其一是受到相关信号(SIGSTOP,SIGSTP,SIGTTIN或SIGTTOU)的反应。其二是受到父进程ptrace调用的控制,而暂时将处理器交给控制进程。
    • ZOMBIE:僵尸状态。表示进程结束但尚未消亡的一种状态。此时进程已经结束运行并释放掉大部分资源,但尚未释放进程控制块。

    image

    转载于:https://www.cnblogs.com/chenglei/archive/2009/11/20/1606881.html

    展开全文
  • 二、进程生命周期 进程是一个动态实体,所以他是有生命。...这种情况下,称进程处于就绪态。 阻塞态。指进程因为需要等待所需资源而放弃处理器,或者进程本不拥有处理器,且其他资源也没有满...

    二、进程的生命周期

    进程是一个动态的实体,所以他是有生命的。从创建到消亡,是一个进程的整个生命周期。在这个周期中,进程可能会经历各种不同的状态。一般来说,所有进程都要经历以下的3个状态:

    1. 就绪态。指进程已经获得所有所需的其他资源,正在申请处理处理器资源,准备开始执行。这种情况下,称进程处于就绪态。
    2. 阻塞态。指进程因为需要等待所需资源而放弃处理器,或者进程本不拥有处理器,且其他资源也没有满足,从而即使得到处理器也不能开始运行。这种情况下,进程处于阻塞态。阻塞状态也称休眠状态或者等待状态。
    3. 运行态。进程得到了处理器,并不需要等待其他任何资源,正在执行的状态,称之为运行态。只有在运行态时,进程才可以使用所申请到的资源。

    在Linux系统中,将各种状态进行了重新组织,由此得到了Linux进程的几个状态:

    • RUNNING:正在运行或者在就绪队列中等待运行的进程。也就是上面提到的运行态和就绪态进程的综合。一个进程处于RUNNING状态,并不代表他一定在被执行。由于在多任务系统中,各个就绪进程需要并发执行,所以在某个特定时刻,这些处于RUNNING状态的进程之中,只有一个能得到处理器,而其他进程必须在一个就绪队列中等待。即使是在多处理器的系统中,Linux也只能同时让一个处理器执行任务。
    • UNINTERRUPTABLE:不可中断阻塞状态。处于这种状态的进程正在等待队列中,当资源有效时,可由操作系统进行唤醒,否则,将一直处于等待状态。
    • INTERRUPTABLE:可中断阻塞状态。与不可中断阻塞状态一样,处于这种状态的进程在等待队列中,当资源有效时,可以有操作系统进行唤醒。与不可中断阻塞状态有所区别的是,处于此状态中的进程亦可被其他进程的信号唤醒。
    • STOPPED:挂起状态。进程被暂停,需要通过其它进程的信号才能被唤醒。导致这种状态的原因有两种。其一是受到相关信号(SIGSTOP,SIGSTP,SIGTTIN或SIGTTOU)的反应。其二是受到父进程ptrace调用的控制,而暂时将处理器交给控制进程。
    • ZOMBIE:僵尸状态。表示进程结束但尚未消亡的一种状态。此时进程已经结束运行并释放掉大部分资源,但尚未释放进程控制块。

      image

    Linux进程状态:T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态。

             向进程发送一个SIGSTOP信号,它就会因响应该信号而进入TASK_STOPPED状态(除非该进程本身处于TASK_UNINTERRUPTIBLE状态而不响应信号)。(SIGSTOP与SIGKILL信号一样,是非常强制的。不允许用户进程通过signal系列的系统调用重新设置对应的信号处理函数。)          向进程发送一个SIGCONT信号,可以让其从TASK_STOPPED状态恢复到TASK_RUNNING状态。

             当进程正在被跟踪时,它处于TASK_TRACED这个特殊的状态。“正在被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。比如在gdb中对被跟踪的进程下一个断点,进程在断点处停下来的时候就处于TASK_TRACED状态。而在其他时候,被跟踪的进程还是处于前面提到的那些状态。

             对于进程本身来说,TASK_STOPPED和TASK_TRACED状态很类似,都是表示进程暂停下来。 而TASK_TRACED状态相当于在TASK_STOPPED之上多了一层保护,处于TASK_TRACED状态的进程不能响应SIGCONT信号而被唤醒。只能等到调试进程通过ptrace系统调用执行PTRACE_CONT、PTRACE_DETACH等操作(通过ptrace系统调用的参数指定操作),或调试进程退出,被调试的进程才能恢复TASK_RUNNING状态。

             Linux进程状态:Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程。

             进程在退出的过程中,处于TASK_DEAD状态。

             在这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸。          之所以保留task_struct,是因为task_struct里面保存了进程的退出码、以及一些统计信息。而其父进程很可能会关心这些信息。比如在shell中,$?变量就保存了最后一个退出的前台进程的退出码,而这个退出码往往被作为if语句的判断条件。          当然,内核也可以将这些信息保存在别的地方,而将task_struct结构释放掉,以节省一些空间。但是使用task_struct结构更为方便,因为在内核中已经建立了从pid到task_struct查找关系,还有进程间的父子关系。释放掉task_struct,则需要建立一些新的数据结构,以便让父进程找到它的子进程的退出信息。

             父进程可以通过wait系列的系统调用(如wait4、waitid)来等待某个或某些子进程的退出,并获取它的退出信息。然后wait系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉。          子进程在退出的过程中,内核会给其父进程发送一个信号,通知父进程来“收尸”。这个信号默认是SIGCHLD,但是在通过clone系统调用创建子进程时,可以设置这个信号。

             通过下面的代码能够制造一个EXIT_ZOMBIE状态的进程:

    
    
    #include     
    void main() {    
    if (fork())    
    while(1) sleep(100);    
    } 
    
    

    编译运行,然后ps一下:

    1. kouu@kouu-one:~/test$ ps -ax | grep a\.out 
    2. 10410 pts/0    S+     0:00 ./a.out 
    3. 10411 pts/0    Z+     0:00 [a.out]  
    4. 10413 pts/1    S+     0:00 grep a.out

             只要父进程不退出,这个僵尸状态的子进程就一直存在。那么如果父进程退出了呢,谁又来给子进程“收尸”? 当进程退出的时候,会将它的所有子进程都托管给别的进程(使之成为别的进程的子进程)。托管给谁呢?可能是退出进程所在进程组的下一个进程(如果存在的话),或者是1号进程。所以每个进程、每时每刻都有父进程存在。除非它是1号进程。

    1号进程,pid为1的进程,又称init进程。 linux系统启动后,第一个被创建的用户态进程就是init进程。它有两项使命: 1、执行系统初始化脚本,创建一系列的进程(它们都是init进程的子孙); 2、在一个死循环中等待其子进程的退出事件,并调用waitid系统调用来完成“收尸”工作; init进程不会被暂停、也不会被杀死(这是由内核来保证的)。它在等待子进程退出的过程中处于TASK_INTERRUPTIBLE状态,“收尸”过程中则处于TASK_RUNNING状态。

             Linux进程状态:X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁。

             而进程在退出过程中也可能不会保留它的task_struct。比如这个进程是多线程程序中被detach过的进程(进程?线程?参见《linux线程浅析》)。或者父进程通过设置SIGCHLD信号的handler为SIG_IGN,显式的忽略了SIGCHLD信号。(这是posix的规定,尽管子进程的退出信号可以被设置为SIGCHLD以外的其他信号。)          此时,进程将被置于EXIT_DEAD退出状态,这意味着接下来的代码立即就会将该进程彻底释放。所以EXIT_DEAD状态是非常短暂的,几乎不可能通过ps命令捕捉到。

             进程的初始状态

             进程是通过fork系列的系统调用(fork、clone、vfork)来创建的,内核(或内核模块)也可以通过kernel_thread函数创建内核进程。这些创建子进程的函数本质上都完成了相同的功能——将调用进程复制一份,得到子进程。(可以通过选项参数来决定各种资源是共享、还是私有。)          那么既然调用进程处于TASK_RUNNING状态(否则,它若不是正在运行,又怎么进行调用?),则子进程默认也处于TASK_RUNNING状态。          另外,在系统调用调用clone和内核函数kernel_thread也接受CLONE_STOPPED选项,从而将子进程的初始状态置为 TASK_STOPPED。

             进程状态变迁

             进程自创建以后,状态可能发生一系列的变化,直到进程退出。而尽管进程状态有好几种,但是进程状态的变迁却只有两个方向——从TASK_RUNNING状态变为非TASK_RUNNING状态、或者从非TASK_RUNNING状态变为TASK_RUNNING状态。          也就是说,如果给一个TASK_INTERRUPTIBLE状态的进程发送SIGKILL信号,这个进程将先被唤醒(进入TASK_RUNNING状态),然后再响应SIGKILL信号而退出(变为TASK_DEAD状态)。并不会从TASK_INTERRUPTIBLE状态直接退出。

             进程从非TASK_RUNNING状态变为TASK_RUNNING状态,是由别的进程(也可能是中断处理程序)执行唤醒操作来实现的。执行唤醒的进程设置被唤醒进程的状态为TASK_RUNNING,然后将其task_struct结构加入到某个CPU的可执行队列中。于是被唤醒的进程将有机会被调度执行。

             而进程从TASK_RUNNING状态变为非TASK_RUNNING状态,则有两种途径: 1、响应信号而进入TASK_STOPED状态、或TASK_DEAD状态; 2、执行系统调用主动进入TASK_INTERRUPTIBLE状态(如nanosleep系统调用)、或TASK_DEAD状态(如exit系统调用);或由于执行系统调用需要的资源得不到满足,而进入TASK_INTERRUPTIBLE状态或TASK_UNINTERRUPTIBLE状态(如select系统调用)。          显然,这两种情况都只能发生在进程正在CPU上执行的情况下。

     

    引自:

    https://www.cnblogs.com/youngerchina/p/5624580.html

    https://www.cnblogs.com/chenglei/archive/2009/11/20/1606881.html

    转载于:https://www.cnblogs.com/zzdbullet/p/9809691.html

    展开全文
  • Linux进程运行状态

    千次阅读 2015-07-11 18:02:27
    进程是一个动态实体,所以他是有生命。...这种情况下,称进程处于就绪态。阻塞态。指进程因为需要等待所需资源而放弃处理器,或者进程本不拥有处理器,且其他资源也没有满足,从而即使得到处理器也不
  • 进程是有以下状态的:就绪态(指进程分配到除处理机以外的必需的资源的状态,进程被创建后处于就绪状态,处于就绪状态的进程可以有多个)、执行态(指进程占用处理机正在CPU上执行的状态,在单CPU系统中,每一时刻...
  • 2019-02-02_193524.png实际上系统中的进程可以处于以下五种状态之一:TASK_RUNNING(运行)——进程是可执行;其正在执行或在运行队列中等待执行。TASK_INTERRUPTIBLE(可中断)——进程阻塞处于睡眠状态,...
  • linux进程调度算法

    2017-02-20 20:27:30
    一、进程的状态: 1、操作系统中: 进程是一个动态实体,所以他是有生命。从创建到消亡,是一个进程整个生命...这种情况下,称进程处于就绪态。 (2)阻塞态。指进程因为需要等待所需资源而放弃处理器,
  • 1.当一个进程处于(   )状态时, 称为就绪状态。 编号 选项 ...2.当一个进程处于下述(  ...3.以下关于进程和线程的描述,错误的是(    )。 编号 选项 A 同一进程内的线程共享进程
  • 可以通过调用sigpending函数来判定哪些信号是设置为阻塞处于未决状态的。 如果信号在被解除之前,发送了很多次,系统是如果处理呢? POSIX.1允许系统递送该信号一次或多次。如果递送该信号多次,则称对这些信号...
  • 关于线程学习

    2019-09-03 23:20:55
    关于线程学习多线程概念运行状态使用方法Thread.sleep()方法分批处理数据线程安全 多线程 ...新建状态、就绪状态、运行状态、阻塞状态、死亡状态 例如: 当程序创建一个线程即 new xxxThread...
  • Hamming Distance

    2017-03-28 21:18:53
    每个进程的状态可能是以下五种状态之一: TASK_RUNNING 运行 表示进程是可执行,即进程正在运行活处于就绪状态等待运行。 TASK_INTERRUPTIBLE 可中断 表示进程阻塞,等待某些条件达成(例如,等待某事件发生)...
  • 尾部都有答案第九章练习题(多线程机制)(1)线程由以下哪些部分组成?(选三项)A. 虚拟的CPUB. CPu执行的代码C. 支持代码工作的数据D. 进程(2)创建线程的时候必须实现哪项... sleep()(4)当一个处于阻塞状态的线程解除阻...
  • 尾部都有答案第九章练习题(多线程机制)(1)线程由以下哪些部分组成?(选三项)A. 虚拟的CPUB. CPu执行的代码C. 支持代码工作的数据D. 进程(2)创建线程的时候必须实现哪项... sleep()(4)当一个处于阻塞状态的线程解除阻...
  • 操作系统作业二

    2019-06-12 13:34:52
    一、单项选择 1.以下关于进程的描述中,正确的是A 。...在单CPU的系统中,任意时刻都有一个进程处于运行状态 D.进程申请CPU得不到满足时,其状态变为阻塞 2.一个进程是 C。 A.由处理机执行的一个程序 ...
  • Thread详解

    2021-02-02 20:03:14
    线程概述 线程是现代操作系统调度最小单元,一个进程可以创建多个线程来提高系统吞吐量和执行效率。(进程是操作系统资源分配和调度基本单位,它可以创建多... * BLOCKED:被阻塞等待监视器锁定线程处于状态
  • 阻塞和非阻塞 阻塞和非阻塞这是指的的对象...(1)就绪状态(Ready):是指进程处于准备好运行的状态,即进程已分配到除CPU以外所有必要资源,只要拿到CPU就可以马上执行。如果系统中存在许多处于“就绪状态...
  • 【Nginx】事件驱动框架和异步处理

    千次阅读 2014-07-04 20:52:22
    Nginx对请求处理是通过事件触发,模块作为事件消费者,只能被事件收集、分发器调用。这与传统Web服务器是不同。...当某个进程要等待事件发生而处于阻塞状态时,该进程仍然占用内存资源直到该请求结束,造成资源
  •   在编写调试scull设备驱动代码时,以下代码会造成空指针错误,将之注释掉后可以顺利实现设备功能,但也会出现系统被锁住,无响应情况,网上查询资料对其有了一点了解,因其涉及到系统进程与信号的阻塞等问题...
  • 银行家算法---------概念&举例

    万次阅读 多人点赞 2018-04-24 20:14:21
    银行家算法是一种用来避免操作系统死锁出现...此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。死锁发生必须具备以下四个必要条件:1)互斥条件:指进程对所分配到资源进行排...
  • 如果看到有许多进程处于Locked状态,可能是MyISAM用于高并发工作负载上了。如何找出有哪几个连接长时间地持有着某个锁呢?没有SQL命令可以用来显示那些持有着表锁从而阻塞了你查询线程,使用SHOW PROCESSLIST...
  • java多线程 [1]

    2011-03-06 23:21:00
    <br /> 线程是在操作系统中是一个非常常见词 <br /> 线程具有非常多的进程所具有特征,所以又称为轻型进程进程元,相应把传统进程...阻塞状态,指线程在执行中因某事儿受阻,处于暂停执行
  • 死锁核心概念

    2020-05-29 09:14:30
    此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程 产生条件 如果在一个系统中以下四个条件同时成立,那么就能引起死锁: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) ...
  • 死锁及其预防

    2017-08-22 09:59:40
    此时称系统处于死锁状态,而这些永远在互相等待的进程称为死锁进程。 死锁产生条件死锁出现必须同时满足以下四个条件,缺一不可。 互斥:所谓互斥就是进程在某一时间内独占资源(更准确得说,对于某个资源访问有...
  • 死锁问题整理

    2017-10-26 15:56:21
    此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 产生条件 虽然进程在运行过程中,可能发生死锁,但死锁发生也必须具备一定条件,死锁发生必须...
  • Linux:关于死锁

    2021-04-14 23:39:19
      死锁是至在一组进程各个进程都占有不会释放资源,但因为它们都在申请被其他进程所占用不会释放资源,就将处于一种永久等待的状态。 原因 产生原因可以主要分为以下两点: 竞争资源 系统中资源大致...
  • 如果看到有许多进程处于Locked状态,可能是MyISAM用于高并发工作负载上了。如何找出 有哪几个连接长时间地持有着某个锁呢? 没有SQL命令可以用来显示那些持有着表锁从而阻塞了你查询线程,使用SHOW ...
  • 银行家算法是一种用来避免操作系统死锁出现有效算法,...此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 死锁发生必须具备以下四个必要条件: 1)互斥条件:指进程对所分...

空空如也

空空如也

1 2 3
收藏数 52
精华内容 20
关键字:

以下进程处于阻塞状态的是