进程的状态 —— Linux系统编程

进程状态(R、S、D、T、Z、X)

一、进程概念: 


1)正在执行的程序 
2)正在计算机上执行的程序实例 
3)能分配处理器并由处理器执行的实体 
进程的两个基本元素是程序代码和代码相关联的数据集。进程是一种动态描述,但并不代表所有的进程都在运行。这就可以引入‘进程状态’。 
进程在内存中因策会略或调度需求,会处于各种状态。

二、Linux下的进程状态:

static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
  1. R- -可执行状态(运行状态) 
    只有在运行状态的进程才有可能在CPU上运行,注意是可能,并不意味着进程一定在运行中。同一时刻可能有多个进程处在可执行状态,这些进程的PCB(进程控制块)被放入对应CPU的可执行队列中。然后进程调度器从各个可执行队列中分别选择一个进程在CPU上运行。 
    另外如果计算机只有一个处理器,那么一次最对只有一个进程处于这种状态。
  2. S- -可中断睡眠状态(sleeping) 
    处在这个状态意味着进程在等待事件完成。这些进程的PCB(task_struct结构)被放入对应时间的等待队列中。然后等待的事件发生时,对应的进程将被唤醒。
  3. D- -不可中断睡眠(disk sleep) 
    在这个状态的进程通常会等待IO的结束。 
    这个状态与sleeping状态相似,处于睡眠状态,但是此刻进程是不可中断的,意思是不响应异步信号。 
    另外你会发现处在D状态的进程kill -9竟然也杀不死。这就相当于我们怎么也叫不醒一个装睡的人。
  4. T- -暂停状态 
    给进程发送一个SIGSTOP信号,进程就会响应信号进入T状态,除非该进程正处在D状态。 
    再通过发送SIGCONT信号让进程继续运行。 
    kill -SIGSTOP 
    kill -SIGCONT
  5. Z- -僵死状态 
    僵死状态是一个比较特殊的状态。进程在退出的过程中,处于TASK_DEAD状态。 
    在这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸。
  6. X- -死亡状态或退出状态(dead) 
    死亡状态是内核运⾏ kernel/exit.c ⾥的 do_exit() 函数返回的状态。这个状态只是⼀个返回状态,你不会在任务列表⾥看到这个状态

三、状态切换 

进程在运行中不断的改变运行状态; 
1)就绪状态 
当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。 
2)执行(Running)状态 
当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态 
3) 阻塞(Blocked)状态 
正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

就绪–>执行 
处在就绪状态的进程,当调度器为其分配了处理机后,就变成了执行状态。

执行–>就绪 
执行状态的进程在其执行过程中,时间片跑完了不得不让出处理机,于是从执行变成就绪状态。

执行–>阻塞 
正在执行的进程等待某种事件而无法继续执行时,便从执行状态变成阻塞状态。

阻塞–>就绪 
处在阻塞状态的进程,如果等待的时间发生,则从阻塞状态转变成就绪状态。

ä¸ç§ç¶æ转æ¢

猜你喜欢

转载自blog.csdn.net/u011285208/article/details/81704776