当前位置:   article > 正文

Linux进程睡眠状态disk sleep

disk sleep


Linux进程睡眠状态disk sleep

Linux-进程管理

1. Linux进程状态

  • Running(R):运行或将要运行
  • Interruptible(S):被阻断而等待一个事件,可能会被一个信号激活
  • Uninterruptible(D):被阻断而等待一个事件,不会被信号激活
  • Stopped(T):由于任务的控制或者外部的追踪而被终止,比如:strace
  • Zombie(Z):僵死,但是它的父进程尚未调用wait函数.
  • Deal(X):这个永远看不见

2. 睡眠状态disk sleep

Linux进程有两种睡眠状态,一种interruptible sleep,处在这种睡眠状态的进程是可以通过给它发信号来唤醒的,也是可以kill的,进程状态如下

#cat /proc/[pid]/status
Name:   sysmgt
State:  S (sleeping)
  • 1
  • 2
  • 3

另外一种睡眠状态是uninterruptible sleep,处在这种状态的进程不接受外来的任何信号,这也是为什么之前我无法用kill杀掉这些处于D状态的进程,无论是”kill”, “kill -9″还是”kill -15″,因为它们压根儿就不受这些信号的支配。

#cat /proc/[pid]/status
Name:   sysmgt
State:  D (disk sleeping)
  • 1
  • 2
  • 3

进程为什么会被置于uninterruptible sleep状态呢?处于uninterruptible sleep状态的进程通常是在等待IO,比如磁盘IO,网络IO,其他外设IO,如果进程正在等待的IO在较长的时间内都没有响应,那么就很会不幸地被 ps看到了,同时也就意味着很有可能有IO出了问题,可能是外设本身出了故障,也可能是比如挂载的远程文件系统已经不可访问了,我这里遇到的问题就是由互斥锁引起的,比如说我开了8个进程同时访问一个io,访问的时候势必会加锁来保护资源,那么,当一个进程正在访问的时候,其他进程如果在等待锁,那么就会进入disk sleep,当你执行kill,它不会立即响应,当锁满足条件的时候才可能响应信号。https://blog.csdn.net/davion_zhang/article/details/48268319

3. 场景重现

# ps -ef | grep vpp
root     252610      1  0 11:37 ?        00:00:00 vpp -c startup-iperf3.conf
root     252913      1  0 11:39 ?        00:00:00 vpp
root     271022 252936  0 14:15 pts/8    00:00:00 grep --color=auto vpp

# cd /proc/252610/task/252610/
# cat status 
Name:	vpp
Umask:	0022
State:	D (disk sleep)
Tgid:	252610
Ngid:	0
Pid:	252610
PPid:	1
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

以上内容由RToax编写,或翻译、整理自网络。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/1013807
推荐阅读
相关标签
  

闽ICP备14008679号