在 GNOME System Monitor 的 Processes 选项卡中有一个“Waiting Channel”列。到目前为止,我在这里看到的最常见的值是poll_schedule_timeout,但我也看到了其他值:0、do_exit、do_wait、futex_wait_queue_me、pipe_wait、__skb_recv_datagram和unix_stream_data_wait。
那么这个“等待频道”栏是什么意思呢?也许其中的一些价值观是什么意思?
在 GNOME System Monitor 的 Processes 选项卡中有一个“Waiting Channel”列。到目前为止,我在这里看到的最常见的值是poll_schedule_timeout,但我也看到了其他值:0、do_exit、do_wait、futex_wait_queue_me、pipe_wait、__skb_recv_datagram和unix_stream_data_wait。
那么这个“等待频道”栏是什么意思呢?也许其中的一些价值观是什么意思?
等待通道是内核中任务当前等待的地方。任务必须等待资源,可以是数据或处理时间。这两个包括网络套接字、硬件、文件等;因为它们中的大多数只是文件,在类 Unix 系统中。
0
: 进程没有等待poll_schedule_timeout
poll()
是用于处理 I/O的系统调用1 。它类似于select()
。2使用非阻塞 I/O 的应用程序使用这些调用来查看它们是否可以读取或写入文件,而不必阻塞它。它们通常用于输入/输出流,可能不会被阻塞(否则,您的鼠标可能会停止移动)。
等待通道
poll_schedule_timeout
表示任务正在等待 I/O,无论是键盘和鼠标等硬件、声音设备还是网络套接字。<linux/poll.h>
.poll
是在 System V 中首次出现的实现,select
是 BSD UNIX 等价物。futex_wait_queue_me
:为了解释这一点,我们必须看看锁。锁是系统中的一种保存状态,表示任务与资源一起工作。例如,可能只有一个任务读取文件。此任务将锁定文件,任何其他尝试读取文件的任务1都会知道它已被锁定,并等待锁定消失,然后才能访问它。处理器时间也会发生同样的事情。
现代版本的 Linux(在大多数架构上)在内核中使用 Futex(快速用户空间互斥锁)锁。互斥,互斥,指的是一个公共资源在任何时候都只能被一个任务访问。为此,设置了系统中的标志。
如果一个进程正在等待一个锁定的资源,这称为忙等待 或“旋转”,指的是它试图一遍又一遍地访问它,直到它可以。任务在旋转时被称为阻塞。
Futex 锁可以被认为是用户空间中的一个数字,它可以被一个任务递增或递减(在资源可以被多个任务访问的情况下,这个数字可以大于一)。这是图4中显示的数字。
这些任务将自己排入等待队列,这是一个需要做一些工作的简单任务队列,一旦处理时间可用,这些任务就会完成它们的工作并从队列中删除。
futex_wait_queue_me
将任务排入队列。然后它等待信号、超时或唤醒。在此等待通道中的任务不在等待队列中等待,它们正在等待入队。__skb_recv_datagram
在锁定的网络套接字上等待一些数据。
sk_wait_data
等待网络套接字上的一些数据。
do_exit
这是退出进程的最后一部分。
do_exit()
调用schedule()
下一个,以安排另一个进程。当do_exit()
被调用时,进程是一个ZOMBIE
.do_wait
一个进程被添加到调度程序等待队列中。
pipe_wait
,unix_stream_data_wait
进程正在等待来自子进程的数据。例如,当您运行此类代码时,就会发生这种情况:
或者
hrtimer_nanosleep
进程正在休眠,使用
hrtimer_nanosleep()
方法。此方法可用于程序休眠特定时间间隔,精度为纳秒级。这些还不是全部,但我没有观察到其他任何人。如果我错过了什么,请发表评论。
等待通道值是进程当前被阻塞在其中的内核函数的名称。
该名称通常与系统调用相关,该系统调用将具有手册页。
如果您真的想要更详细的信息,您可以查看内核源代码。
如果你输入
cat /proc/some_pid/stack
一个终端,你会得到一些类似的输出:在第一行,您可以看到系统监视器上显示的内容。据我所知,poll_schedule_timeout表明您的进程正在等待某些东西。
它处理异步 I/O和轮询。
来源:1.进程等待通道(WCHAN)和警报?- 2. AskUbuntu 答案