在 GNOME 系统监视器的进程选项卡中,有一个“等待通道”列。到目前为止,我在这里看到的最常见的值是poll_schedule_timeout,但我还看到其他值:0,退出,等待,futex_wait_queue_me,pipe_wait,__skb_recv_datagram和unix_stream_data_wait。
那么“等待频道”这一列是什么意思呢?其中的一些值又是什么意思呢?
答案1
等待通道是内核中任务当前正在等待的地方。任务必须等待资源,可以是数据或处理时间。这两者包括网络套接字、硬件、文件等;因为在类 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
将任务加入队列。然后等待信号、超时或唤醒。处于此状态的任务等候通道不在等待队列中等待,而是在等待入队。
- 任务可以是进程3或线程2
- 线程是进程的一个子部分。许多线程可以并行运行
- 进程是一个完整的程序,它由一个或多个线程组成,但一个程序也可以由多个进程组成。
- 请记住,这仍然是一个非常高层次的观点,它没有考虑实施细节
__skb_recv_datagram
在锁定的网络套接字上等待一些数据。
sk_wait_data
等待网络套接字上的一些数据。
do_exit
这是退出进程的最后一部分。
do_exit()
调用schedule()
下一个,以调度另一个进程。 当do_exit()
被调用时,进程是ZOMBIE
。do_wait
一个进程被添加到调度程序的等待队列中。
pipe_wait
,unix_stream_data_wait
进程正在等待来自子进程的数据。例如,当您运行以下代码时,就会发生这种情况:
echo | sleep 10 && echo hallo # pipe
或者
cat < hello.c # unix data stream
hrtimer_nanosleep
进程正在休眠,使用
hrtimer_nanosleep()
方法。此方法可用于让程序休眠特定时间间隔,精度达到纳秒级。
这些还不是全部,但我没有发现其他的。如果我遗漏了什么,请发表评论。
答案2
等待通道值是进程当前被阻塞的内核函数的名称。
该名称通常与系统调用相关,系统调用会有手册页。
- futex_wait_queue_me与...有关futex。 它指的是互斥锁类型锁(快速用户空间互斥)用于在一个处理器上调度多个进程。状态表示您的进程已入队以接收锁。2
- 等待与...有关等待。
- ETC。
如果你真的想要更详细的信息,你可以检查内核来源。
如果你cat /proc/some_pid/stack
在终端中输入,你会得到类似这样的输出:
[<c0227f4e>] poll_schedule_timeout+0x3e/0x60
[<c022879f>] do_select+0x55f/0x670
[<c0228f40>] core_sys_select+0x140/0x240
[<c0229241>] sys_select+0x31/0xc0
[<c05c9cc4>] syscall_call+0x7/0xb
[<ffffffff>] 0xffffffff
第一行显示的是系统监视器上显示的内容。据我所知,poll_schedule_timeout表示你的进程正在等待某事。