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

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

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

Скриншот

2 ответа

Решение

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

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

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

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

  • 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 ответ

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