Что такое «канал ожидания» процесса?

36

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

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

Скриншот

8128
источник

Ответы:

42

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

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

  • poll_schedule_timeout

    poll()системный вызов 1, используемый для обработки ввода / вывода. Это похоже на select(). 2

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

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

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

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

Стефано Палаццо
источник
Я сталкивался с sleep_on_page_killable?
Эммануэль М. Смит
Наиболее вероятная причина для sleep_on_page_killable состоит в том, что процесс пытается загрузить страницу, которая не находится в памяти, поэтому он вызывает ошибку страницы, и процесс должен быть переведен в спящий режим до загрузки страницы. Если подсистема ввода-вывода перегружена (возможно, из-за большого количества операций ввода-вывода), это может часто появляться.
Цуна
о чем signal? Я столкнулся с этим. Процесс мертв? живой мертвец? или что? что будет с процессом?
свое настоящее имя
11

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

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

  • futex_wait_queue_me связан с futex . Это относится к типу взаимной блокировки замка (быстрое пользовательское приложение взаимного исключения) , который используется для планирования работы многих процессов на одном процессоре. Состояние указывает, что ваш процесс поставлен в очередь для получения блокировки. 2
  • do_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 ответ

Максим Р.
источник
Перефразируй это. : P
Стефано Палаццо
Похоже, вы заметили, что я повторно использовал ваш ответ, чтобы улучшить его ;-) Какого рода атрибуция вы хотели бы иметь?
Максим Р.
2
Твоего комментария более чем достаточно, чтобы я был счастлив :) Если вы хотите узнать о том, как работает атрибуция, есть хороший пост в блоге на эту тему. Не беспокойтесь об этом, я хочу, чтобы люди максимально использовали мою работу.
Стефано Палаццо
1
Ну, я просто писал вопрос по этой теме на мета. (уже прочитал пост в блоге)
Максим Р.
Это здесь . Бьюсь об заклад, ваш ответ в какой-то момент окажется над моим ^^
Максим Р.