日期:2014-05-16  浏览次数:20732 次

Linux进程管理知识整理

1、进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些?

????TASK_RUNNING(可运行状态)

????TASK_INTERRUPTIBLE(可中断等待状态)

????TASK_UNINTERRUPTIBLE(不可中断等待状态)

????TASK_STOPPED(进程被其它进程设置为暂停状态)

????TASK_TRACED(进程被调试器设置为暂停状态)

????TASK_DEAD(退出状态)

进程由于所需资源得不到满足,从而进入等待队列,但是该状态能够被信号中断。比如当一个正在运行的进程因进行磁盘I/O操作而进入可中断等待状态时,在I/O操作完成之前,用户可以向该进程发送SIGKILL,从而使该进程提前结束等待状态,进入可运行态,以便响应SIGKILL,执行进程退出代码,从而结束该进程。

当进程退出时(例如调用exit或者从main函数返回),需要向父进程发送信号,父进程进行信号处理时,需要获取子进程的信息,因此这时不能删除子进程的task_struct。另外每个进程都有一个内核态的堆栈,当进程调用exit()时,在切换到另外一个进程前,总是要使用内核态堆栈,因此当进程调用exit()时,完成必要的处理后,就把state设置为TASK_DEAD,并切换到其他进程。当顺利地切换到其他进程后,由于该进程的状态设置为TASK_DEAD,因此这个进程不会被调度,之后当调度器检查到状态为TASK_DEAD的进程时,就会删除这个进程的task_struct结构,这样这个进程就彻底的消失了。

EXIT_ZOMBIE(