На вкладке «Процессы» системного монитора GNOME имеется столбец «Канал ожидания». Наиболее часто встречающиеся значения, которые я здесь вижу, это poll_schedule_timeout i>, но я также вижу и другие значения: 0 i>, do_exit i>, do_wait i>, futex_wait_queue_me i>, pipe_wait i>, __ skb_recv_datagram i> и unix_stream_data_wait i>.
Так что же означает этот столбец «Канал ожидания»? И, возможно, что означают некоторые из этих значений в нем?
Канал ожидания является местом в Ядре, где задача в настоящее время ожидает. Задача должна ожидать Ресурса, который может быть данными или время обработки. Эти два включают сетевые сокеты, аппаратные средства, файлы, и так далее; так как большинство из них является просто файлами в подобных Unix системах.
0
: Процесс не ожидает
poll_schedule_timeout
poll()
система call1, раньше обрабатывал ввод-вывод. Это подобно select()
.2
Приложения, которые используют не блокирующийся ввод-вывод, используют эти вызовы, чтобы видеть, могут ли они читать из или записать в файл, withouth имеющий необходимость заблокировать его. Они часто используются для потоков ввода/вывода, которые не могут быть заблокированы (иначе, возможно, Ваша мышь остановилась бы для перемещения).
Канал ожидания poll_schedule_timeout
указывает, что задача ожидает ввода-вывода, или аппаратные средства как клавиатуры и мыши, звуковые устройства или даже сетевые сокеты.
<linux/poll.h>
. poll
была реализация, увиденная в первый раз в System V, select
эквивалентный UNIX BSD. futex_wait_queue_me
:
Для объяснения этого мы должны посмотреть на Блокировки. Блокировка является сохраненным состоянием в системе, которая указывает, что задача работает с ресурсом. Может быть, например, только одна задача, которая читает файл. Эта задача заблокировала бы файл, любой другой task1, который пытается считать файл, знал бы, что это заблокировано, и ожидайте блокировки, чтобы уйти, прежде чем это сможет получить доступ к нему. То же самое происходит в течение процессорного времени.
Современная версия Linux (на большей части архитектуры) использует Futex (быстрое взаимное исключение пространства пользователя) привязывают ядро. Взаимное исключение, взаимное исключение, относится к идее, что к общему ресурсу может только получить доступ одна задача в любое время. Для этого установлены флаги в системе.
Если процесс ожидает заблокированного ресурса, это называют Активным ожиданием или "Вращением", относясь к тому, что это пытается получить доступ к нему много раз, пока это не может. Задача, как говорят, заблокирована, когда она вращается.
Блокировки Futex могут считаться числом в пространстве пользователя, которое может быть увеличено или постепенно уменьшено задачей (в случаях, где к ресурсу могут получить доступ несколько задач, это число может стать больше, чем одно). Это - число, показанное в diagram4.
Эти задачи ставят в очередь себя в очереди ожидания, простой очереди задач, которые должны сделать некоторую работу, после того как время обработки доступно, задачи делают свою работу и удалены из очереди.
futex_wait_queue_me
ставит в очередь задачи. Это затем ожидает сигнала, время или пробуждение. Задача, которые находятся в этом канале ожидания, ожидает не на очереди ожидания, они ожидают, чтобы ставиться в очередь.
__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()
метод. Этот метод может использоваться, чтобы программа спала в течение определенных интервалов времени с точностью наносекунды.
Они не все, но я не наблюдал других. Добавьте комментарий, если я пропустил что-нибудь.
Значение ожидающего канала - это имя функции ядра, в которой процесс в настоящее время заблокирован.
Имя обычно связано с системным вызовом, который будет иметь справочную страницу.
Если вам действительно нужна более подробная информация, вы можете проверить ядро , источник .
Если вы введете 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 sup> [ 1125]