什么是流程的“等待渠道”?
在GNOME系统监视器的进程选项卡中,有一个“等待通道”列。 到目前为止,我在这里看到的最常见的值是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,硬件如键盘和鼠标,声音设备甚至网络套接字。- 内核中的一个函数
- 它们在
中定义。poll
是一个在System V中首次出现的实现,select
是BSD UNIX的等价物。
-
futex_wait_queue_me
:为了解释这一点,我们必须看一下Locks。 锁是系统中保存的状态,表示任务使用资源。 例如,可以只有一个任务读取文件。 此任务将锁定文件,尝试读取文件的任何其他任务1将知道它已被锁定,并等待锁定消失,然后才能访问它。 处理器时间也会发生同样的事情。
现代版Linux(在大多数架构上)在内核中使用Futex(快速用户空间互斥锁)锁。 Mutex,互斥,指的是公共资源只能由一个任务随时访问。 为此,设置系统中的标志。
如果一个进程正在等待一个锁定的资源,这称为忙等待或“旋转”,指的是它试图反复访问它,直到它可以。 据说任务在旋转时被阻止 。
可以将Futex锁定为用户空间中的数字,可以通过任务递增或递减(在多个任务可以访问资源的情况下,此数字可以变为大于1)。 这是图4中显示的数字。
这些任务将自己排列在等待队列中 ,这是一个需要完成某项工作的简单任务队列,一旦处理时间可用,任务就会完成工作并从队列中删除。
futex_wait_queue_me
将任务排入队列。 然后等待信号,超时或唤醒。 此等待通道中的任务不等待等待队列,它们等待排队。
- 任务可以是进程3或线程2
- 线程是进程的子部分。 许multithreading可以并行运行
- 进程是一个完整的程序,它由一个或多个线程组成,尽管程序也可以包含多个进程。
- 请记住,这仍然是一个非常高级别的事物视图,它没有考虑实现细节
-
__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
进程正在hibernate,使用
hrtimer_nanosleep()
方法。 该方法可用于程序以特定的时间间隔睡眠,精确到纳秒。
这些并非全部,但我没有观察到任何其他人。 如果我错过任何内容,发表评论。
等待通道值是当前阻止进程的内核函数的名称。
该名称通常与系统调用相关,系统调用将具有手动页面。
- futex_wait_queue_me与futex有关。 它指的是一种互斥锁 (快速用户空间互斥),用于在一个处理器上调度许多进程。 状态表示您的进程已加入队列以接收锁定。 2
- do_wait与wait有关。
- 等等
如果您真的想要更详细的信息,可以查看内核源代码 。
如果你在终端中输入cat /proc/some_pid/stack
,你会得到一些像这样的输出:
[] poll_schedule_timeout+0x3e/0x60 [] do_select+0x55f/0x670 [] core_sys_select+0x140/0x240 [] sys_select+0x31/0xc0 [] syscall_call+0x7/0xb [] 0xffffffff
在第一行,您将获得系统监视器上显示的内容。 据我所知, poll_schedule_timeout表示您的进程正在等待某事。
它处理异步I / O和轮询 。
来源:1。 处理等待通道(WCHAN)和报警? – 2. AskUbuntu回答