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