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

    万次阅读 2016-10-10 21:02:47
    三态模型:在多道程序系统中,进程在处理器上交替运行,状态也不断地发生变化。进程一般有3种基本状态:运行、就绪和阻塞。 (1)运行:当一个进程在处理机上运行时,则称该进程处于运行状态。处于此状态进程的...

    三态模型:在多道程序系统中,进程在处理器上交替运行,状态也不断地发生变化。进程一般有3种基本状态:运行、就绪和阻塞。
    (1)运行:当一个进程在处理机上运行时,则称该进程处于运行状态。处于此状态的进程的数目小于等于处理器的数目,对于单处理机系统,处于运行状态的进程只有一个。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
    (2)就绪:当一个进程获得了除处理机以外的一切所需资源,一旦得到处理机即可运行,则称此进程处于就绪状态。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。
    (3)阻塞:也称为等待或睡眠状态,一个进程正在等待某一事件发生(例如请求I/O而等待I/O完成等)而暂时停止运行,这时即使把处理机分配给进程也无法运行,故称该进程处于阻塞状态。
    这里写图片描述
    五态模型:对于一个实际的系统,进程的状态及其转换更为复杂。引入新建态和终止态构成了进程的五态模型。
    新建态: 对应于进程刚刚被创建时没有被提交的状态,并等待系统完成创建进程的所有必要信息。 进程正在创建过程中,还不能运行。操作系统在创建状态要进行的工作包括分配和建立进程控制块表项、建立资源表格(如打开文件表)并分配资源、加载程序并建立地址空间表等。创建进程时分为两个阶段,第一个阶段为一个新进程创建必要的管理信息,第二个阶段让该进程进入就绪状态。由于有了新建态,操作系统往往可以根据系统的性能和主存容量的限制推迟新建态进程的提交。
    终止态: 进程已结束运行,回收除进程控制块之外的其他资源,并让其他进程从进程控制块中收集有关信息(如记帐和将退出代码传递给父进程)。类似的,进程的终止也可分为两个阶段,第一个阶段等待操作系统进行善后处理,第二个阶段释放主存。
    这里写图片描述
    由于进程的不断创建,系统资源特别是主存资源已不能满足所有进程运行的要求。这时,就必须将某些进程挂起,放到磁盘对换区,暂时不参加调度,以平衡系统负载;进程挂起的原因可能是系统故障,或者是用户调试程序,也可能是需要检查问题。
    活跃就绪:是指进程在主存并且可被调度的状态。
    静止就绪(挂起就绪): 是指进程被对换到辅存时的就绪状态,是不能被直接调度的状态,只有当主存中没有活跃就绪态进程,或者是挂起就绪态进程具有更高的优先级,系统将把挂起就绪态进程调回主存并转换为活跃就绪。
    活跃阻塞:是指进程已在主存,一旦等待的事件产生便进入活跃就绪状态。
    静止阻塞:是指进程对换到辅存时的阻塞状态,一旦等待的事件产生便进入静止就绪状态。
    这里写图片描述
    转自:http://blog.sina.com.cn/s/blog_7c03bb1f0100wcco.html

    展开全文
  • Linux中查看进程状态信息

    万次阅读 多人点赞 2018-10-24 22:00:21
    Linux中查看进程状态信息 一、常用命令总结 ps -l 列出与本次登录有关的进程信息; ps -aux 查询内存中进程信息; ps -aux | grep *** 查询***进程的详细信息; top 查看内存...

                                                                           Linux中查看进程状态信息

    一、常用命令总结 

       ps -l   列出与本次登录有关的进程信息;
       ps -aux   查询内存中进程信息;
       ps -aux | grep ***   查询***进程的详细信息;
       top   查看内存中进程的动态信息;
       kill -9 pid   杀死进程。

       (更好的阅读体验,请移步我的个人博客)

    二、进程简述及查看方式

            进程是运行的程序在系统中的存在形式,通过查看进程的状态信息,我们可以了解进程占用的系统资源情况,对系统的运行状态进行分析、调整,从而让系统保持在一个平稳的状态下运行。

             Linux中查看进程信息的基本命令有ps、top,其中ps(Process Status)查看的是进程信息的一个快照,显示的我们执行ps这个命令时进程的信息,top显示的是进程的动态信息,使用这个命令会看到进程信息的动态变化。

    三、进程信息的查看

    3.1  列出与 本次登录系统 有关的进程信息
          ps  ( ps -l, 列出的是详细信息 ) 

    F 代表这个程序的旗标 (flag), 4 代表使用者为 superuser;
    S 代表这个程序的状态 (STAT);
    (  常见的进程的 STAT 如下:
    R 运行 Runnable (on run queue) 正在运行或在运行队列中等待,
    S 睡眠 Sleeping 休眠中, 受阻, 在等待某个条件的形成或接受到信号, 
      空闲 Idle ,
    Z 僵死 Zombie(a defunct process) 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放,
    D 不可中断 Uninterruptible sleep (ususally IO) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生,
    T 终止 Terminate 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行,
    P 等待交换页 ,
    W 无驻留页 has no resident pages 没有足够的记忆体分页可分配,
    X 死掉的进程 ,
    < 高优先级进程 高优先序的进程 ,
    N 低优先 级进程 低优先序的进程 ,
    L 内存锁页 Lock 有记忆体分页分配并缩在记忆体内 ,
    s 进程的领导者(在它之下有子进程),
    l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)。 )

    3.2  列出在内存中运行的  全部进程信息
          ps  -aux ( ps -aux | grep ***,  列出 *** 进程的详细信息) 

     USER :进程的所属用户,
    PID :进程的进程ID号, 
    %CPU :进程占用的 CPU资源 百分比,
    %MEM :进程占用的 物理内存 百分比, 
    VSZ :进程使用掉的虚拟内存量 (Kbytes) ,
    RSS :进程占用的固定的内存量 (Kbytes) ,
    TTY :与进程相关联的终端(tty),?代表无关,tty1-tty6是本机上面的登入者程序,pts/0表示为由网络连接进主机的程序。
    STAT :进程的状态,具体见2.1列出来的部分 ,
    START :进程开始创建的时间 ,
    TIME :进程使用的总cpu时间,
    COMMAND : 进程对应的实际程序。

    3.3  动态显示内存中的进程信息(top)

    四、进程的清除

       kill -9 -pid (pid通过上面的命令可以查到)

    注:有些进程是不允许停止的,因为停止会造成系统的不稳定,甚至崩溃。(网上搜索进程知识了解更多)

     


     

    展开全文
  • linux进程状态详解

    千次阅读 2016-12-08 15:45:14
    Linux进程状态:R (TASK_RUNNING),可执行状态只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多...

    Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。

    Linux进程状态:R (TASK_RUNNING),可执行状态

    只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。
    多数操作系统的书籍都将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为 TASK_RUNNING状态。

    Linux进程状态:S (TASK_INTERRUPTIBLE),可中断的睡眠状态

    处于这个状态的进程因为等待某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。
    通过ps命令我们会看到,一般情况下,进程列表中的绝大多数进程都处于TASK_INTERRUPTIBLE状态(除非机器的负载很高)。

    Linux进程状态:D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态

    与TASK_INTERRUPTIBLE状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。
    绝大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。否则你将惊奇的发现,kill -9竟然杀不死一个正在睡眠的进程了!于是我们也很好理解,为什么ps命令看到的进程几乎不会出现TASK_UNINTERRUPTIBLE状态,而总是TASK_INTERRUPTIBLE状态。
    而TASK_UNINTERRUPTIBLE状态存在的意义就在于,内核的某些处理流程是不能被打断的。如果响应异步信号,程序的执行流程中就会被插入一段用于处理异步信号的流程(这个插入的流程可能只存在于内核态,也可能延伸到用户态),于是原有的流程就被中断了。
    在进程对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要使用TASK_UNINTERRUPTIBLE状态对进程进行保护,以避免进程与设备交互的过程被打断,造成设备陷入不可控的状态。这种情况下的TASK_UNINTERRUPTIBLE状态总是非常短暂的,通过ps命令基本上不可能捕捉到。
    linux系统中也存在容易捕捉的TASK_UNINTERRUPTIBLE状态。执行vfork系统调用后,父进程将进入TASK_UNINTERRUPTIBLE状态,直到子进程调用exit或exec。
    通过下面的代码就能得到处于TASK_UNINTERRUPTIBLE状态的进程:

    #include
    void main() {
    if (!vfork()) sleep(100);
    }

    编译运行,然后ps一下:

    wsl@wsl-one:~/test$ ps -ax | grep a\.out
    4371 pts/0    D+     0:00 ./a.out
    4372 pts/0    S+     0:00 ./a.out
    4374 pts/1    S+     0:00 grep a.out

    然后我们可以试验一下TASK_UNINTERRUPTIBLE状态的威力。不管kill还是kill -9,这个TASK_UNINTERRUPTIBLE状态的父进程依然屹立不倒。

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

    向进程发送一个SIGSTOP信号,它就会因响应该信号而进入TASK_STOPPED状态。
    向进程发送一个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一下:

    wsl@wsl-one:~/test$ ps -ax | grep a\.out
    10410 pts/0    S+     0:00 ./a.out
    10411 pts/0    Z+     0:00 [a.out]
    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过的进程。或者父进程通过设置SIGCHLD信号的handler为SIG_IGN,显式的忽略了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系统调用)。

    展开全文
  • 操作系统进程状态和状态转换详解

    千次阅读 多人点赞 2019-11-01 10:28:55
    进程状态的转换与PCB详解 ​ 返回主目录 ​ 之前的有博文对进程和线程的区别进行了详细的介绍,并且说明了引入进程的目的是为了能够使程序并发的执行,并且可以对并发执行的程序加以描述和控制。这篇博文,我们...

    主目录

    ​ 之前的有博文对进程和线程的区别进行了详细的介绍,并且说明了引入进程的目的是为了能够使程序并发的执行,并且可以对并发执行的程序加以描述和控制。这篇博文,我们就来对进程的状态转换来进行详细的分析。本文除了进程的状态转换,还穿插着对进程的控制的说明。

    ​ 注意:本博文中进程均是在传统操作系统中的进程,既是OS进行资源分配的基本单位,也是OS进行调度的一个独立单位。

    ​ 在开始之前,我们对进程和程序来进行一个对比:

    1. 程序是静态的,而进程是动态的。
    2. 程序可以作为一种软件资源长期存在,而进程是有一定生命周期的。程序是永久的,进程是暂时的。
    3. 进程更能真实地描述并发,而程序不能;
    4. 进程具有创建其他进程的功能,而程序没有;
    5. 同一程序可以对应多个进程;
    6. 进程是系统分配资源和调度的独立单位,而程序不是。

    因此,从上面我们可以得到进程的一些特征:

    1. 动态性(进程由创建而产生,由调度而执行,由撤销而消亡);
    2. 并发性(多个进程同存于内存中,可以并发的执行);
    3. 独立性(资源分派和调度的独立单位);
    4. 异步性(进程的执行以一种不可预知的速度向前推进)。

    三种基本状态

    ​ 上面我们讲到了,进程是具有生命周期的,由创建而产生,由调度而执行,由撤销而消亡,并且内存中可以同时存在多个进程,多个进程在并发执行的过程中共享系统资源,因为资源的争用或者其他原因,导致进程在运行的过程中呈现间断性(异步),因此,进程在其生命周期内就具有多种状态。

    ​ 首先我们讲的是三种基本状态:就绪态、执行态、阻塞态。这三种基本状态是每个OS中都会有的,因此也称之为基本状态,下面先给出三种基本状态的定义:

    1. 就绪(Ready)状态:通过Ready我们可以看到,处于此状态的进程已经处于准备好要运行了,此时进程已经分配好除CPU外的所有必要资源,只需获得CPU(CPU如何进行分配,请关注后续有关处理机调度的博文),便可立即执行。用一句话来描述处于就绪态的进程:万事俱备,只欠CPU。另外还有一个就绪队列的概念,处于就绪态的进程都在此队列中,等待着调度程序的调度(分配CPU)。
    2. 执行(Running)状态:Running,运行中的,处于此状态的进程是已经获得CPU并且正在执行中。对于这一状态,在单CPU OS中,同一时刻只能有一个进程处于此状态,而在多CPU OS中,则可以有多个(不超过CPU的数量)进程同时处于执行状态。
    3. 阻塞(Block)状态:阻塞,百度释义为:障碍而不能通过,无法畅通。处于此状态的进程是因为在执行的过程中由于发生某种需要等待的事件(I/O请求、申请缓存失败、等待接收数据等),而暂时无法继续执行。我们知道在多道批处理系统中,此时需要进程把处理机释放,并选取新的就绪进程执行。与就绪队列相对应的,处于阻塞状态的进程都在阻塞队列中,某些OS中,出于提高效率的目的,根据阻塞的原因,会有多个阻塞队列。

    进程三种基本状态转换图
    ​ 上图是进程的三种基本状态的转换图,进程在运行的过程中会经常的发生状态的转换。从图中我们可以看到,就绪态和执行态是可以互相转换的,但是执行态到阻塞态是单向的,这是因为就算阻塞的进程"通畅"了,但是因为处理机已经分配给了别的进程,因此进程的状态也只能切换到就绪态,并且也是单项的,因为等待事件也只可以在执行中才能发生,下面说明下各个状态切换发生的原因:

    1. 就绪态—>执行态:进程获得CPU(被调度程序选中);
    2. 执行态—>阻塞态:向OS请求共享资源(互斥、同步)失败、等待某种操作完成、新数据尚未到达(I/O操作)、等待新任务的到达;
    3. 阻塞态—>阻塞态:上述的四类等待事件发生;
    4. 执行态—>就绪态:分配给进程的时间片执行完成(轮转调度算法)、高优先级的进程到达(抢占式调度)。

    创建状态和终止状态

    ​ 我们知道,进程创建时,需要对其分配除CPU外的所有的必要资源,但是,如果此时OS因为资源不足无法给进程分配资源,那么进程应该处于什么状态呢?为了满足上述问题,满足进程状态的完整性以及增强管理的灵活性,通常会在OS中为进程新增两种常见的状态:创建状态和终止状态。下面给出两种状态的定义:

    1. 创建状态:进程创建的过程中,所需的资源尚不能得到满足,此时创建工作尚未完成,进程无法被调度执行,进程此时就处于创建状态。
    2. 终止状态:进程正常运行结束或者出现导致进程终止的错误,或是被OS所终结,或是被父进程终结,则进入终止状态。进入终止状态的进程将不能再执行,但是在OS中依然保持一个记录,其中保存着状态码和计时统计数据,等待别的进程收集,一旦资源被收集完成,OS会立刻删除该进程。

    进程五种基本状态转换

    ​ 包含创建状态和终止状态之后,进程的状态转换如上图所示。从图中我们可以看到,状态的转换多了创建态到就绪态,执行态到终止态,下面给出两种状态切换的原因:

    1. 创建态—>就绪态:进程所需的资源得到分配;
    2. 执行态—>终止态:进程正常运行结束或者出现导致进程终止的错误,或是被OS所终结,或是被父进程(或其他有终止权的进程)终结。

    ​ 下面对进程创建和终止的过程来进行一下说明。首先是进程的创建,进程的创建是一个较为复杂的过程,首先需要由进程申请一个空白的进程控制块(Process Control Block, PCB,后面会详细的讲),并向PCB中填写用于控制和管理进程的信息;然后为该进程分配运行时必要的资源;最后把该进程转为就绪态并插入到就绪队列中。其次是进程的终止,进程的终止分为两个步骤:首先是等待OS进行善后处理(停止执行、终止子孙进程、归还资源等),然后将其PCB清零,并将PCB空间返还给系统

    ​ 从上述进程的创建和终止的过程中,我们可以得知,创建态就是处于进程创建的第一步完成时的状态,终止态就是进程无法被调度或执行,但是还需等待别的进程来收集信息,也就是终止态同样处于第一步完成的状态,只有当进程归还了PCB后,才算是真正的被OS删除,生命周期才算结束。

    挂起、激活操作

    ​ 在部分OS中,为了系统和用户观察和分析进程的需要,还引入了一个对进程的重要操作—挂起(Suspend),当对某个进程执行此操作是时,该进程将会被挂起,此时意味着该进程需要释放内存,调至到硬盘中(外存),也意味着此时该进程处于静止状态无法接受调度或者执行。当该进程被执行激活(Active)操作时,才可将该进程从外存中重新导入到内存中。

    ​ 首先我们来分析下进程被挂起的原因:

    1. 终端用户的请求:当终端用户在自己的程序运行期间发现有可疑问题时,希望暂停自己的程序的运行,使之停止下来,以便用户研究其执行情况或对程序进行修改;
    2. 父进程的请求:有时父进程希望挂起自己的某个子进程,以便考察和修改子进程,或者协调各子进程间的活动;
    3. 负荷调节的需要:当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行;
    4. 操作系统的需要:操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账。

    ​ 引入挂起之后,系统中的就绪状态和阻塞状态分别变为两种状态,这四种状态为:活动就绪、静止就绪、活动阻塞、静止阻塞,下面分别对这四种状态进行说明:

    1. 活动就绪(Readya):等价于就绪态,此时进程可以接受调度,获得处理机后可直接转为执行态;
    2. 静止就绪(Readys):进程被调至外存,无法接受调度;
    3. 活动阻塞(Blockeda):等价于阻塞态,当等待的事件发生后可以由活动阻塞变为活动就绪状态;
    4. 静止阻塞(Blockeds):进程仍然可以等待事件,当事件发生后,状态由静止阻塞变为静止就绪状态。

    引入挂起后进程七种状态转换
    ​ 引入挂起操作后,OS中的状态变为7种,其中部分进程状态的变化如下:

    1. 活动就绪—>静止就绪:该进程被执行挂起原语Suspend;
    2. 活动阻塞—>静止阻塞:该进程被执行挂起原语Suspend;
    3. 执行态—>静止就绪:该进程被执行挂起原语Suspend;
    4. 静止就绪—>活动就绪:该进程被执行挂起原语Active;
    5. 静止阻塞—>活动阻塞:该进程被执行激活原语Active;
    6. 静止阻塞—>静止就绪:进程等待的事件发生;
    7. 活动阻塞—>活动就绪:进程等待的事件发生;
    8. 创建态—>活动就绪:在当前OS的性能和内存的容量均允许的情况下,完成进程的创建工作(三步);
    9. 创建态—>静止就绪:当前OS的当前资源状况和性能不允许,不分配给新建进程所需的资源(创建工作只完成第一步),此时进程处于静止就绪状态,被调至到外存中,不参与调度,此时创建工作尚未完成。

    ​ 从上面的状态我们可以看到,处于执行态的进程一样会被挂起,而且引入了挂起操作后,进程不会长期的处于创建状态,如果能分配到资源,状态会变为活动就绪态,如果无法分配资源,则进入静止就绪状态,当资源充足后,在将进程调入内存并为之分配资源,完成创建工作。

    进程控制块PCB

    ​ 上面讲了这么多的进程的状态的切换,那么OS到底是根据什么来进行进程的控制和管理呢?比如进程的状态信息保存在哪里、进程对应的程序和数据是如何保存的、进程是如何保存和恢复CPU现场信息(上下文切换)的,还有其他等等操作是如何实现的?其实这些操作都需要依托于一种数据结构—进程控制块PCB。PCB是OS为了系统的描述和管理进程的运行,在内核中为每个进程专门定义的一个数据结构。PCB作为进程实体(程序、数据、PCB)的一部分,记录了OS所需的用于描述进程当前情况以及管理进程运行的全部信息,是OS中最重要的记录型数据结构。

    ​ **PCB的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。**因此PCB的作用非常重要,我们讲进程的状态切换是必须要讲PCB的。首先,我们对PCB中存储的信息进行介绍:

    1. 进程标识符:用于唯一地标识进程。一个进程通常包含两种标识符:外部标识符和内部标识符。外部标识符一般由创建者(用户)提供,用来方便记忆;内部标识是为了方便OS对进程的使用,通常是Linux系统中查看到的Pid;
    2. CPU状态:CPU状态信息也称处理机的上下文,主要由CPU的各种寄存器(通用寄存器、指令计数器、程序状态字PSW、用户栈指针)中的内容组成的。进程在执行的过程中,正在处理的许多信息都放在寄存器中,如果需要发生切换,这些信息就需要保存在该进程的PCB中,以便可以再次执行时可以快速的恢复CPU的状态;
    3. 进程调度信息:在OS进行调度(从就绪队列中选取进程分配CPU)时,必须要知道进程的状态和相关的调度信息,主要包括:进程状态、优先级、进程调度所需的其他信息(等待时间、已经执行的时间等)、事件(等待发生的时间,即阻塞的原因);
    4. 进程的控制信息:只用于进程控制所必需的信息,主要包括:程序和数据的地址(所在内存或外存的首地址)、进程同步和通信机制、资源清单(进程运行期间所需的全部资源,CPU除外,还有一张已经分配给该进程的资源清单,主要用于避免死锁)、链接指针(指向本PCB所在队列中的下一个进程的PCB的首地址)。

    ​ 通过PCB所保存的信息,我们是不是也就知道了上面讲到的问题(进程如何进行控制、程序和数据如何保存、CPU上下文如何切换和恢复)的答案了,都是需要使用PCB中保存的信息。下面我们根据PCB中存储的信息,来对PCB作用做一个具体的分析:

    1. 作为独立运行基本单位的标志:当一个程序(包含数据)配置了PCB后,就表示他成为了一个进程,一个能在多道程序环境下独立运行并合法的一个基本单位,也就具有了取得OS服务的权利。这也是为什么当系统创建一个进程时,需要为之创建一个PCB,并与进程一对一的绑定,系统是根据PCB来感知进程的,PCB被撤销归还给OS时,进程也就随之消亡了;
    2. 能实现间断运行的方式:这也是进程的一个基本特性—异步性,因为PCB中保存着进程在CPU上执行时的上下文信息,因此在进程再次被调度执行时,可以快速的恢复其CPU的现场信息。
    3. 提供进程管理所需要的信息:在进程的整个生命周期中,OS都是根据PCB实施对进程的控制和管理。
    4. 提供进程调度所需要的信息:OS根据PCB中存储的进程的状态信息来将继承插入到对应的队列中,并根据PCB中保存的优先级、等待事件等来进行调度的;
    5. 实现与其他进程的同步与通信:PCB中具有用与实现进程通信的区域或通信队列指针等。

    ​ 通过上面的描述,我们也看到了PCB的重要之处,虽然一个进程中的PCB保存了如此多的信息,但是一个PCB的大小大约是1KB左右,体量小也可以保证内核中可以存放一定数量的PCB。


    ​ 又到了分隔符以下,本文到此就结束了,本文内容全部都是由博主自己进行整理并结合自身的理解进行总结,如果有什么错误,还请批评指正,当然,如果有什么疑惑可以评论留言。

    ​ 全文又是4700多字,原创不易,在写这篇博客的时候,真的是投入了大量的心血,翻看了许多的文档,如果本文对你有所帮助,还请留下个赞,以表支持。

    展开全文
  • Linux进程状态

    千次阅读 2013-03-20 10:04:41
    进程状态 在linux下,通过ps命令我们能够查看到系统中存在的进程,以及它们的状态: R (TASK_RUNNING),可执行状态。 只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,...
  • 一.linux系统进程类型有 :交互进程 ;批处理进程 ;监控进程(守护进程); 交互进程:由一个shell启动的进程。...进程状态有: linux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) ...
  • linux进程状态及僵尸进程

    千次阅读 2018-05-12 22:50:59
    1.Linux进程状态: 2.深、浅睡眠状态及无效唤醒问题: Linux中的进程睡眠状态有两种: 一种是可中断的睡眠状态,其状态标志位TASK_INTERRUPTIBLE。 另一种是不可中断的睡眠状态,其状态标志位为TASK_...
  • 进程状态

    千次阅读 2016-07-30 10:11:45
    三态模型运行状态当一个进程在处理机上运行时,则该进程处于运行状态。处于次状态进程的数目小于等于处理器的数目,在单处理系统中,处于运行态的进程只有一个。就绪状态当一个进程获得了除CPU以外的任何资源,...
  • 进程状态(含状态变迁图)

    万次阅读 多人点赞 2017-08-20 10:49:31
    一、三态模型:三态模型:在多道程序系统中,进程在处理器上交替运行,状态也不断地发生变化。进程一般有3种基本状态:运行、就绪和阻塞。(1)就绪:当一个进程获得了除处理机以外的一切所需资源,一旦得到处理机...
  • linux进程状态

    千次阅读 2017-01-16 21:38:54
    一、进程状态 进程描述符(task_struct)中的state变量描述进程的当前状态。常见的状态如下: 1、TASK_RUNNING(运行状态):表示进程是可执行的,它正在执行,或者在运行队列中等待执行。 2、TASK_INTERRUPTIBLE...
  • ◆运行状态(TASK_RUNNING) 指正在被CPU运行或者就绪的状态。这样的进程被成为runnning进程。运行态的进程可以分为3种情况:内核运行态、用户运行态、就绪态。...处于等待状态中的进程,一旦被该进程等待的
  • 操作系统进程相关知识学习
  • 进程的几种状态

    万次阅读 2016-07-28 19:53:57
    进程状态:一个进程的生命周期可以划分为一组状态,这些状态刻画了整个进程。进程状态即体现一个进程的生命状态。 进程状态: 一般来说,进程有三个状态,即就绪状态,运行状态,阻塞状态。 运行态:进程占用CPU,并...
  • ps命令查看进程状态

    万次阅读 2018-03-26 20:47:22
    在Linux下进程有5种状态: 运行状态(R) 正在运行或在运行队列中等待 睡眠状态(S) 休眠中, 进程在等待事件的完成 不可中断睡眠状态(D) 指的并不是CPU不影响外部硬件中断,而是指进程不影响异步信号。...
  • 进程状态,状态转换图,状态转换条件
  • 进程状态 导言 在上篇说到,进程是程序的一次执行。在这个执行过程中,有时进程正在被CPU处理,有时又需要等待CPU的服务,可见,进程存在多种状态。为了方便对各个进程的管理,操作系统需要将进程合理地划分为几种...
  • 操作系统进程状态模型

    千次阅读 2019-02-23 13:22:13
    这三个状态合起来,就是操作系统的“三状态进程模型”,如下图: 然后我们可能会疑惑,进程难道天生就是就绪态吗?而且进程执行完后又是什么态呢? 实际上,进程还具有创建态和终止态。 创建态:系统已经为该进程...
  • 查询linux进程状态

    千次阅读 2017-11-04 13:38:10
    linux上进程有5种状态:  1. 运行(正在运行或在运行队列中等待)  2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)  3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)  4. 僵死...
  • 进程状态与种类

    千次阅读 2018-09-19 11:43:45
    ● 新状态:一个进程刚刚建立,但还未将它送入就绪队列时的状态。  ● 终止状态:当一个进程已经正常结束或异常结束,系统已将它从就绪队列中移出,但尚未将它撤消时的状态状态 英文全称 注释 R (TASK_...
  • 进程的三种基本状态

    万次阅读 2015-10-29 22:45:04
     当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。  执行(Running)状态  当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态...
  • linux进程的七种状态

    千次阅读 2019-03-10 18:14:21
    但是查了linux的进程状态之后,发现并不是那么回事,linux进程状态分为7种,分别如下: 1、R (TASK_RUNNING):运行状态,即包括了上图中的就绪状态和运行状态 2、S (TASK_INTERRUPTIBLE):可中断的睡眠状态,即上...
  • 通常我们通过 ...查看特定进程[pthread]的状态信息; 在Linux中,可能状态如下: D 不可中断 Uninterruptible sleep (usually IO) R 正在运行,或在队列中的进程 S 处于休眠状态 T 停止或被追踪 Z 僵尸
  • 进程状态转换

    千次阅读 2012-10-12 10:14:05
    进程的状态转换图 1.就绪–>执行 2....当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。 执行(Running)状态 当进程已获得处理机,其程序正在处
  • [进程]进程状态转换

    千次阅读 2013-04-28 18:57:58
    进程在执行过程中的不同情况至少要定义三种状态: 运行(running)态:进程占有处理器正在运行的状态进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态; 在多处理机系统中,则有...
  • 进程状态及转换

    千次阅读 2018-07-27 17:27:29
    进程是计算机中已运行程序的实体。 程序本身只是指令的集合,进程才是程序的真正运行。用户下达运行程序的命令后,就会产生进程。...进程通常有如下5种状态,其中前3种是进程的基本状态: 就绪...
  • 进程的disk sleep状态与僵尸进程

    万次阅读 2015-09-08 09:25:03
    Linux进程有两种睡眠状态,一种interruptible sleep,处在这种睡眠状态的进程是可以通过给它发信号来唤醒的,也是可以kill的,进程状态如下 [root@lmxe:/home]#cat /proc/949/status Name: sysmgt State: S ...
  • 由图可知,最开始,操作系统只有三种状态,运行态,就绪态,等待态,运行态就是指CPU正在执行该段代码的状态,而就绪态则是指,万事具备只欠东风的状态,这个东风就是指CPU的时间轮片将CPU资源分到该处时,就可以...
  • linux进程状态D

    千次阅读 2015-10-16 18:29:07
    运行在KVM虚拟机里的一些进程突然出了问题,这些出了问题的进程无法用kill杀掉,使用ps可以看到这些进程处于D状态: [build@kbuild-john ~]$ ps -a -ubuild -o pid,ppid,stat,command  PID PPID STA

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,091,650
精华内容 436,660
关键字:

哪些状态属于进程的状态