Что такое "канал ожидания" процесса?
На вкладке "Процессы" системного монитора 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
указывает на то, что задача ожидает ввода-вывода, аппаратного обеспечения, такого как клавиатуры и мыши, звуковые устройства или даже сетевые сокеты.- Функция в ядре
- Они определены в
<linux/poll.h>
,poll
была реализация, впервые увиденная в System V,select
является эквивалентом BSD UNIX.
futex_wait_queue_me
:Чтобы объяснить это, мы должны взглянуть на замки. Блокировка - это сохраненное состояние в системе, которое указывает, что задача работает с ресурсом. Например, может быть только одна задача, которая читает файл. Эта задача блокирует файл, любая другая задача1, которая пытается прочитать файл, узнает, что он заблокирован, и ждет, пока блокировка не исчезнет, прежде чем она сможет получить к нему доступ. То же самое происходит для процессорного времени.
Современная версия Linux (на большинстве архитектур) использует блокировку Futex (быстрый пользовательский мьютекс) в ядре. Mutex, взаимное исключение, относится к идее, что общий ресурс может быть доступен только одной задачей в любое время. Для этого в системе установлены флаги.
Если процесс ожидает заблокированного ресурса, это называется " Ожидание при занятости" или "Вращение", ссылаясь на тот факт, что он пытается обращаться к нему снова и снова, пока не сможет. Задача называется заблокированной, когда она вращается.
Блокировки Futex можно рассматривать как число в пользовательском пространстве, которое может быть увеличено или уменьшено с помощью задачи (в случаях, когда к ресурсу могут обращаться несколько задач, это число может стать больше единицы). Это число показано на диаграмме4.
Эти задачи помещают себя в очередь ожидания, простую очередь задач, которые должны выполнить некоторую работу, как только время обработки доступно, задачи выполняют свою работу и удаляются из очереди.
futex_wait_queue_me
ставит задачи. Затем он ожидает сигнала, времени ожидания или пробуждения. Задачи, находящиеся в этом канале ожидания, ожидают не в очереди ожидания, они ожидают постановки в очередь.- Задачей может быть либо Процесс3, либо Поток2.
- Поток - это подраздел процесса. Многие потоки могут работать параллельно
- Процесс - это полноценная программа, состоящая из одного или нескольких потоков, хотя программа может также состоять из нескольких процессов.
- Помните, что это все еще очень высокий взгляд на вещи, это не учитывает детали реализации
__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 ответ