Что такое & ldquo; канал ожидания & rdquo; процесса?

На вкладке «Процессы» системного монитора GNOME имеется столбец «Канал ожидания». Наиболее часто встречающиеся значения, которые я здесь вижу, это poll_schedule_timeout , но я также вижу и другие значения: 0 , do_exit , do_wait , futex_wait_queue_me , pipe_wait , __ skb_recv_datagram и unix_stream_data_wait .

Так что же означает этот столбец «Канал ожидания»? И, возможно, что означают некоторые из этих значений в нем?

Screenshot

36
задан 30 December 2010 в 19:51

2 ответа

Канал ожидания является местом в Ядре, где задача в настоящее время ожидает. Задача должна ожидать Ресурса, который может быть данными или время обработки. Эти два включают сетевые сокеты, аппаратные средства, файлы, и так далее; так как большинство из них является просто файлами в подобных Unix системах.

  • 0: Процесс не ожидает

  • poll_schedule_timeout

    poll() система call1, раньше обрабатывал ввод-вывод. Это подобно select().2

    Приложения, которые используют не блокирующийся ввод-вывод, используют эти вызовы, чтобы видеть, могут ли они читать из или записать в файл, withouth имеющий необходимость заблокировать его. Они часто используются для потоков ввода/вывода, которые не могут быть заблокированы (иначе, возможно, Ваша мышь остановилась бы для перемещения).

    Канал ожидания poll_schedule_timeout указывает, что задача ожидает ввода-вывода, или аппаратные средства как клавиатуры и мыши, звуковые устройства или даже сетевые сокеты.

    1. Функция в Ядре
    2. Они определяются в <linux/poll.h>. poll была реализация, увиденная в первый раз в System V, select эквивалентный UNIX BSD.
  • futex_wait_queue_me:

    Для объяснения этого мы должны посмотреть на Блокировки. Блокировка является сохраненным состоянием в системе, которая указывает, что задача работает с ресурсом. Может быть, например, только одна задача, которая читает файл. Эта задача заблокировала бы файл, любой другой task1, который пытается считать файл, знал бы, что это заблокировано, и ожидайте блокировки, чтобы уйти, прежде чем это сможет получить доступ к нему. То же самое происходит в течение процессорного времени.

    Современная версия Linux (на большей части архитектуры) использует Futex (быстрое взаимное исключение пространства пользователя) привязывают ядро. Взаимное исключение, взаимное исключение, относится к идее, что к общему ресурсу может только получить доступ одна задача в любое время. Для этого установлены флаги в системе.

    Если процесс ожидает заблокированного ресурса, это называют Активным ожиданием или "Вращением", относясь к тому, что это пытается получить доступ к нему много раз, пока это не может. Задача, как говорят, заблокирована, когда она вращается.

    If you can read this, you are obligated to correct at least one mistake in this answer :P

    Блокировки Futex могут считаться числом в пространстве пользователя, которое может быть увеличено или постепенно уменьшено задачей (в случаях, где к ресурсу могут получить доступ несколько задач, это число может стать больше, чем одно). Это - число, показанное в diagram4.

    Эти задачи ставят в очередь себя в очереди ожидания, простой очереди задач, которые должны сделать некоторую работу, после того как время обработки доступно, задачи делают свою работу и удалены из очереди.

    futex_wait_queue_me ставит в очередь задачи. Это затем ожидает сигнала, время или пробуждение. Задача, которые находятся в этом канале ожидания, ожидает не на очереди ожидания, они ожидают, чтобы ставиться в очередь.


    1. Задачей может быть или Process3 или Thread2
    2. Поток является подразделом Процесса. Много потоков могут идти параллельно
    3. Процесс является полноценной программой, он состоит из одного или нескольких потоков, хотя программа может состоять из нескольких процессов также.
    4. Помните, это - все еще представление очень высокого уровня вещей, оно не рассматривает детали реализации
  • __skb_recv_datagram

    Ожидайте некоторых данных по заблокированному сетевому сокету.

  • sk_wait_data

    Ожидайте некоторых данных по сетевому сокету.

  • do_exit

    Это - последняя часть выхода из процесса. do_exit() вызовы schedule() затем, для планирования другого процесса. Когда do_exit() назван, процесс является a 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() метод. Этот метод может использоваться, чтобы программа спала в течение определенных интервалов времени с точностью наносекунды.

Они не все, но я не наблюдал других. Добавьте комментарий, если я пропустил что-нибудь.

42
ответ дан 30 December 2010 в 19:51

Значение ожидающего канала - это имя функции ядра, в которой процесс в настоящее время заблокирован.

Имя обычно связано с системным вызовом, который будет иметь справочную страницу.

  • futex_wait_queue_me относится к futex . Он относится к типу блокировки мьютекса (быстрое взаимное исключение в пространстве пользователя), который используется для планирования работы многих процессов на одном процессоре. Состояние указывает, что ваш процесс поставлен в очередь для получения блокировки. 2
  • do_wait относится к wait .
  • и т. Д.

Если вам действительно нужна более подробная информация, вы можете проверить ядро ​​, источник .

Если вы введете 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 указывает, что ваш процесс чего-то ждет.

Он имеет дело с асинхронным вводом / выводом и опросом .

Источник (и): 1. Обрабатывать канал ожидания (WCHAN) и аварийный сигнал? - 2. Ответ AskUbuntu [ 1125]

0
ответ дан 30 December 2010 в 19:51

Другие вопросы по тегам:

Похожие вопросы: