什么是进程的“等待通道”?

812*_*128 37 process system-monitor

在 GNOME 系统监视器的进程选项卡中有一个“等待通道”列。到目前为止,我在这里看到的最常见的值是poll_schedule_timeout,但我也看到了其他值:0do_exitdo_waitfutex_wait_queue_mepipe_wait__skb_recv_datagramunix_stream_data_wait

那么这个“等待频道”栏是什么意思呢?也许其中的一些价值观是什么意思?

截屏

Ste*_*zzo 44

等待通道是内核中任务当前正在等待的地方。任务必须等待资源,资源可以是数据或处理时间。这两个包括网络套接字、硬件、文件等;因为它们中的大多数只是文件,在类 Unix 系统中。

  • 0: 过程不是等待

  • poll_schedule_timeout

    poll()是用于处理 I/O的系统调用1。它类似于select(). 2

    使用非阻塞 I/O 的应用程序使用这些调用来查看它们是否可以读取或写入文件,而不必阻塞它。它们通常用于输入/输出流,可能不会被阻止(否则,您的鼠标可能会停止移动)。

    等待通道poll_schedule_timeout表示任务正在等待 I/O,无论是键盘和鼠标等硬件、声音设备还是网络套接字。

    1. 内核中的一个函数
    2. 它们在 中定义<linux/poll.h>poll是在 System V 中首次出现的实现,select是 BSD UNIX 等价物。
  • futex_wait_queue_me

    为了解释这一点,我们必须看看锁。锁是系统中保存的状态,表示任务与资源一起工作。例如,可能只有一个任务读取文件。此任务将锁定文件,任何其他尝试读取文件的任务1都会知道它已被锁定,并等待锁定消失,然后才能访问它。处理器时间也会发生同样的事情。

    现代版本的 Linux(在大多数架构上)在内核中使用 Futex(快速用户空间互斥锁)锁。Mutex,互斥,指的是公共资源在任何时候都只能被一个任务访问的想法。为此,设置了系统中的标志。

    如果进程正在等待锁定的资源,这称为忙等待 或“自旋”,指的是它会一遍又一遍地尝试访问它,直到可以访问为止。任务在旋转时被称为阻塞

    如果您能阅读本文,则您有义务纠正此答案中的至少一个错误:P

    futex的锁可以被认为是在用户空间的一个数字,可通过任务递增或递减(在资源情况下可以被多个任务访问,这个数量能够比一个变得更大)。这是图4 中所示的数字。

    这些任务将自己排入等待队列,这是一个简单的需要做一些工作的任务队列,一旦有可用的处理时间,这些任务就会完成它们的工作并从队列中删除。

    futex_wait_queue_me排队一个任务。然后等待信号、超时或唤醒。在这个等待通道中的任务不是在等待队列中等待,而是等待入队。


    1. 任务可以是进程3或线程2
    2. 线程是进程的子部分。许多线程可以并行运行
    3. 进程是一个成熟的程序,它由一个或多个线程组成,但一个程序也可以由多个进程组成。
    4. 请记住,这仍然是一个非常高级的事物视图,它没有考虑实现细节
  • __skb_recv_datagram

    在锁定的网络套接字上等待一些数据。

  • sk_wait_data

    等待网络套接字上的一些数据。

  • do_exit

    这是退出进程的最后一部分。do_exit()调用schedule()next 来安排另一个进程。当do_exit()被调用时,进程是一个ZOMBIE.

  • do_wait

    一个进程被添加到调度程序等待队列中。

  • pipe_wait, unix_stream_data_wait

    进程正在等待来自子进程的数据。例如,当您运行此类代码时,就会发生这种情况:

    echo | sleep 10 && echo hallo              # pipe
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    cat < hello.c                              # unix data stream
    
    Run Code Online (Sandbox Code Playgroud)
  • hrtimer_nanosleep

    进程正在休眠,使用hrtimer_nanosleep()方法。此方法可用于程序在特定时间间隔内休眠,精度为纳秒。

这些还不是全部,但我没有观察到其他任何情况。如果我错过了什么,请发表评论。


Max*_* R. 12

等待通道值是进程当前被阻塞的内核函数的名称。

该名称通常与系统调用相关,系统调用会有一个手册页。

  • futex_wait_queue_mefutex相关。它指的是一种互斥(快速用户空间互斥),用于调度多个进程在一个处理器上工作。该状态表明您的进程已排队接收锁。2
  • do_waitwait相关。
  • 等等。

如果你真的想要更详细的信息,你可以查看内核源代码

如果你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
Run Code Online (Sandbox Code Playgroud)

在第一行,您会看到系统监视器上显示的内容。据我所知,poll_schedule_timeout表示您的进程正在等待某事。

它处理异步 I/O轮询

来源:1.进程等待通道(WCHAN)和警报?- 2. AskUbuntu 的回答

  • 你的评论足以让我高兴:) 如果你想了解归因的工作原理,有一个很好的 [SO 博客文章](http://blog.stackoverflow.com/2009/06/attribution-required /) 就此主题而言。不过不要太担心,我希望人们尽可能多地重复使用我的作品。 (2认同)