Monthly Archives: 三月 2019

Linux进程状态

S(TASK_INTERRUPTIBLE),可中断的睡眠状态。处于这个状态的进程因为等待事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。
D(TASK_UNINTERRUTIBLE),不可中断的睡眠状态。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。
在进程对某些硬件进行操作时(比如进程调用read对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要使用TASK_UNINTERRUPTIBLE状态对进程进行保护,以避免进程与设备间的过程被打断,造成设备陷入不可控的状态。
Linux系统中也存在容易捕捉的TASK_UNINTERRUPTIBLE状态。执行vfork系统调用后,父进程将进入TASK_UNINTERRUPTIBLE状态,直到子进程调用exit或exec。
D状态,往往由于I/O资源得不到满足而引发等待。
du – estimate file space usage
du命令会对统计文件逐个调用fstat这个系统调用
df -report file system disk space usage
df命令使用statfs这个系统调用

关于du与df统计目录占用空间大小不同的解析

du -estimate file space usage
du命令会对统计文件逐个调用fstat这个指令(系统调用),获取文件大小。它的数据基于文件获取,可以跨多个分区操作。
df -report file system disk space usage
df命令使用statfs这个指令(系统调用),直接读取分区的超级块信息获取分区使用情况。它的数据基于分区元数据,只能针对整个分区。
导致这两个命令查看磁盘容量不一致的原因:用户删除了大量的文件后,在文件系统目录中已经不可见,所以du就不会再统计它,然而如果此时还有运行的进程持有这个已被删除的文件句柄,那这个文件并不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df仍会统计这个被删除的文件。
可通过lsof命令查下处于deleted状态的文件:
lsof | grep deleted