当以交互方式运行 top 时,我可以在状态列中看到各种单词:
- nanslp、biord、select、uwait、lockf、暂停、kqread、piperd、sbwait...
有些像 nanslp 或 kqread 是不言自明的,其他的则不是。
尝试了 Mr 手册页:
STATE 是当前状态(“START”、“RUN”(在 SMP 系统上显示为“CPUn”),“SLEEP”、“STOP”、“ZOMB”、“WAIT”、“LOCK”或进程等待的事件之一),C 是进程正在执行的处理器编号(仅在 SMP 系统上可见)
尝试过的搜索引擎:
在哪里可以获得 FreeBSD 9 下可能的进程状态的完整列表及其含义?
答案1
top
在手册页中还有以下内容:
If a process is in the "SLEEP" or "LOCK" state, the state column will report the name of the event or lock on which the process is waiting. Lock names are prefixed with an asterisk "*" while sleep events are not
因此基本上,所有非大写的“STATE”、非以星号为前缀的都是睡眠事件名称。
这些标签是在 FreeBSD 内核中设置的,因此您应该在这里找到它们的含义。遗憾的是,没有很好的总结,因为事件名称是由调用设置的sleep
。
例如,在函数/usr/src/sys/kern/sys_pipe.c
中的某处pipe_read
:
error = msleep(rpipe, PIPE_MTX(rpipe), PRIBIO | PCATCH, "piperd", 0);
或者在函数/usr/src/sys/kern/sys_pipe.c
中kern_nanosleep
:
error = tsleep(&nanowait, PWAIT | PCATCH, "nanslp", tvtohz(&tv));
答案2
从man 1 ps
:
......
mwchan The event name if the process is blocked normally, or the
lock name if the process is blocked on a lock. See the wchan
and lockname keywords for details.
......
所以我现在引用https://wiki.freebsd.org/WaitChannels来自谷歌搜索结果:
等待通道 | 描述 |
---|---|
比奥德 | 等待磁盘读取操作完成 |
生物写作 | 等待磁盘写入操作完成 |
nfsreq | 等待 NFS 请求的回复 |
排水量 | 等待文件写入磁盘 |
刷新缓冲区 | 等待将待处理的文件写入磁盘,以便可以通过 posix_fadvise(2) 将页面从 RAM 中刷新出来 |
等待 | 等待数据到达套接字,例如套接字上的阻塞读取(2) |
读取 | 等待事件到达 kqueue |
选择 | 通过 select(2) 或 poll(2) 等待文件描述符上触发事件,通常是套接字 |
派珀德 | 等待数据到达管道,即阻塞读取(2) |
管道工 | 等待空间将数据写入管道,即阻塞写入(2) |
菲福尔 | 等待 FIFO 的阻塞只读打开(O_RDONLY)以便另一个进程打开此 FIFO 上的可写描述符(O_RDWR 或 O_WRONLY) |
流速 | 等待 FIFO 的阻塞只写打开(O_WRONLY)以便另一个进程在此 FIFO 上打开可读描述符(O_RDWR 或 O_RDONLY) |
等待 | 等待子进程退出,例如 shell 等待命令完成 |
泰因 | 等待从终端读取数据,例如 ssh 会话的空闲 shell 或 xterm |
输出 | 等待将数据写入终端 |
暂停 | 等待信号(tcsh 使用这个而不是“wait”) |
南斯拉普 | 等待指定的时间过去,例如“sleep 1” |
优康 | 等待用户空间条件变量(pthread_cond_wait()) |
取得黑块 | 等待访问另一个线程正在访问的文件数据 |
优福 | 等待读取另一个线程正在写入的 UFS 文件系统上的文件或目录,或等待写入另一个线程正在读取或写入的本地文件或目录 |
网络文件系统 | 与“ufs”相同,但适用于 NFS 文件或目录。通常,如果您看到此信息,那是因为其他线程在“nfsreq”中被阻止。 |
文件系统 | 与“ufs”相同,但用于 ZFS 文件或目录。 |
^T 与 sysctl kern.tty_info_kstacks=1 可能会显示比此等待通道更有用的信息。例如区分 poll() 和 select()。