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


36

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

那么,“等待频道”列是什么意思?也许其中的一些价值观意味着什么?

屏幕截图

Answers:


42

等待通道是内核中当前正在等待任务的位置。任务必须等待资源,该资源可以是数据或处理时间。这两个包括网络套接字,硬件,文件等。因为它们大多数只是文件,所以在类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

    为了解释这一点,我们必须看一下Locks。锁是系统中的已保存状态,指示任务正在使用资源。例如,只能有一个读取文件的任务。此任务将锁定文件,任何其他尝试读取文件的任务1都会知道该文件已被锁定,并等待该锁消失,然后才能访问该文件。处理器时间也一样。

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

    如果进程正在等待锁定的资源,则称为“ 忙等待” 或“旋转”,指的是它试图一遍又一遍地访问它直到可以访问的事实。据说任务在旋转时被阻止

    如果您能读懂此说明,则必须纠正此答案中的至少一个错误:P

    Futex锁可以认为是用户空间中的一个数字,可以由一个任务递增或递减(在可以由多个任务访问资源的情况下,该数字可以大于1)。这是图4中显示的数字。

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

    futex_wait_queue_me排队任务。然后,它等待信号,超时或唤醒。在此等待通道中的任务正在等待,不在等待队列中,它们正在等待排队。


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

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

  • sk_wait_data

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

  • do_exit

    这是退出流程的最后一部分。do_exit()调用schedule()下一个,以计划另一个进程。当do_exit()被调用时,这个过程是一个ZOMBIE

  • do_wait

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

  • pipe_waitunix_stream_data_wait

    流程正在等待子流程中的数据。例如,当您运行以下类型的代码时,就会发生这种情况:

    echo | sleep 10 && echo hallo              # pipe
    

    要么

    cat < hello.c                              # unix data stream
    
  • hrtimer_nanosleep

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

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


我遇到过sleep_on_page_killable吗?
Axilus先生2012年

sleep_on_page_killable的最可能原因是该进程试图加载不在内存中的页面,因此会导致页面错误,并且必须使该进程进入休眠状态,直到加载该页面为止。如果I / O子系统超载(可能是因为您要执行大量I / O),这可能会经常出现。
tsuna

signal呢?我碰到了。这个过程死了吗?僵尸?或者是什么?该过程将发生什么?
itsnotmyrealname18年

11

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

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

  • 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

在第一行,您将获得系统监视器上显示的内容。据我所知,poll_schedule_timeout表示您的进程正在等待某些东西。

它处理异步I / O轮询

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


一下。:P
Stefano Palazzo

似乎您注意到了我重复使用您的答案来改善这一点;-)您希望拥有什么样的归因?
Maxime R.

2
您的评论足以让我高兴:)如果您想了解归因的工作原理,那么有一篇不错的SO博客文章。不过,不必太担心,我希望人们尽可能多地重用我的作品。
Stefano Palazzo

1
好吧,我只是在meta上就这个话题写了一个问题。(已经阅读了博客文章)
Maxime R.

这是在这里。我敢打赌,您的答案最终会在我的某件事上结束^^
Maxime R.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.