进程状态

众所周知,linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,这样就必然会产生很多的进。而对于一个进程而言,它可以有如下几个状态

常见进程状态:

  1. R:运行状态(running)

    并不意味着进程是一定在运行中的,它表明进程要么在运行要么在运行队列里。其实准确的说,这个状态应该叫可执行状态,也就是说,处于此状态的这些进程的task_struct结构被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。

  2. S:可中断睡眠状态(sleeping)

    处于这个状态的进程意味着在等待事件完成,这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。在大多数情况下,进程列表中的绝大多数进程都处于此状态

  3. D:不可中断睡眠状态(Disk sleep)

    运行的时候,进程会向内核请求一些服务,内核就会将程序挂起进程,并将进程放到parked队列,通常这些进程只会在parked队列中停留很短的时间,在ps(1)列表中是不会出现的。但是如果内核因为某些原因不能提供相应服务的话。例如,进程要读某一个特定的磁盘块,但是磁盘控制器坏了,这时,除非进程完成读磁盘,否则内核无法将该进程移出parked队列,此时该进程标志位就会被置为D。由于进程只有在运行的时候才能接受到signals,所以此时在parked队列上的进程也就无法接收到信号了。解决这个问题的方法要么是给资源给该进程,要么是reboot。
    通俗一点说,产生D状态的原因出现uninterruptible sleep状态的进程一般是因为在等待IO,例如磁盘IO、网络IO等。在发出的IO请求得不到相应之后,进程一般就会转入uninterruptible sleep状态

  4. T:停止状态(stopped)

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

    向进程发送一个SIGCONT信号,可以让其从TASK_STOPPED状态恢复到TASK_RUNNING状态。

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

  5. X:死亡状态

    这个状态只是一个返回状态,因为其维持时间非常短,所以不会在任务列表中看到这个状态

这里还有一种比较特殊的状态——僵尸状态(Zombies)

Z:僵尸状态(Zombies)

当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程,也就是说,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,那么此时子进程就会进入Z状态

在这个退出过程中,进程占有的所有资源将被回收,除了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)也释放掉。

在上边我们可以看出,产生僵尸进程有可能会造成内存资源的浪费,内存泄漏,需要一直维护PCB

孤儿进程

既然说到了僵尸进程,那么不得不提一提与之对应的孤儿进程——一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值