linux任务的几种状态

linux任务的几种状态

 

 

而我们用ps,top看到的线程状态还需要转一下

 

R:任务正在CPU上运行,或已获取除CPU外所有的资源,正在等待调度运行

 

当linux任务无法获取所需资源时,如通过软中断陷入内核态调用会引起阻塞的系统调用read,accept,epoll_wait,select,futex等,不能继续运行下去时会在内核态改变自己的状态为阻塞态,然后进行任务切换

 

S:当阻塞可以被信号中断如net read,net write,accept,epoll_wait,select,futex时就设状态为TASK_INTERRUPTIBLE也就是top看到的S状态

 

D:当陷入到内核态后直接等待一个硬件驱动程序完成相关操作时的阻塞不可以被信号中断,如当由于读写磁盘无法立即满足时,磁盘等待队列已经很长了,这时一个linux任务再发起一个disk read,而恰好此read所需的数据所在的磁盘block未被cache在文件系统的高速缓冲区,此linux任务就会被设为TASK_UNINTERRUPTIBLE等待磁盘驱动程序IO完成,也就是top看到的D状态,而此时iowait及系统负载也是很高的,而此状态其实并不只是包含disk sleep,disk sleep只是我们常见到的导致务状态是D一种情况,当与硬件交互无法立即得到结果时,有些情况会被设为TASK_UNINTERRUPTIBLE状态,然后进行任务切换

 

这是man vmstat中对r b 两列的介绍

介绍说r列的只包含等待CPU的任务,vmstat其实压根就无法区分那些任务正在等待调度到CPU,那些正在CPU上运行,内核根本没提供这种状态,而ps,top,vmstat,这些命令只是从/proc/pid/stat中读取这些状态展示罢了

b列就是处于D状态的任务个数,表明当前有多少任务被磁盘IO给block住了

 

r b列的任务多时伴随的是系统负载高

load average高,iowait低,说明CPU资源紧张,此时r队列大小应该是大于cpu核数

load average高,iowait也高,此时b队列一定是不为0的,如果CPU使用率高那就是CPU资源紧张 ,反之就是磁盘IO已经满载了,此时再读写磁盘就有可能被hang住

 

T:被SIGSTOP信号暂停,strace跟踪,gdb调试

 

Z:当父进程未退出,子进程退出但父进程未忽略SIGCLD信号,时子进程的状态,在父进程收尸后状态会转变为X,如果父进程不及时调用wait收尸,系统会存在僵尸进程占用进程描述符

 

X:当父进程忽略SIGCLD信号,子进程退出时的状态

 

当一个S,D状态的linux任务已获取到所需资源如read到数据,accept到新连接,获取到锁时,就会从S,D状态转变为R状态,状态R代表任务正在CPU上运行或已经获取到所有除CPU外的所有资源,万事俱备只欠东风,只待被调度器选中调度到CPU上运行了

 

同样是read write,为什么net read wirte阻塞后是TASK_INTERRUPTIBLE,而被disk read wirte阻塞后是TASK_UNINTERRUPTIBLE?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章