Использование wait_event_interruptible и wake_up_all вместе - PullRequest
0 голосов
/ 13 февраля 2012

Для проекта класса, включающего планирование процессов с использованием блокировок и блокировок, мы должны использовать две функции ядра:

int wait_event_interruptible(wait_queue_head_t q, CONDITION);
void wake_up_all(wait_queue_head_t *q); 

Объяснение wait_event_interruptible:

Блокирует текущую задачу в очереди ожидания, пока СОСТОЯНИЕ не станет истинным.

Это на самом деле макрос. Он многократно оценивает СОСТОЯНИЕ, которое является фрагментом кода C, такого как foo == bar или function ()> 3. Как только условие выполнено, wait_event_interruptible возвращает 0. Если условие ложно, текущая задача добавляется в wait_queue_head_t список с состоянием TASK_INTERRUPTIBLE; текущий процесс будет блокироваться до тех пор, пока не будет вызван wake_up_all (& q), затем он повторно проверит СОСТОЯНИЕ. Если текущая задача получает сигнал до того, как условие становится истинным, макрос возвращает -ERESTARTSYS.

И объяснение wake_up_all:

Разбудить все задачи в очереди ожидания, установив их состояния в TASK_RUNNABLE.

Мне трудно понять, как именно работают эти функции и как их использовать вместе. Например, когда проверяется СОСТОЯНИЕ? Ожидает ли непрерывный опрос wait_event_interruptible или перепроверяет условие только при вызове wake_up_all? Это объяснение немного неясно.

Если бы вы могли привести пример совместного использования этих функций, это было бы очень полезно.

1 Ответ

1 голос
/ 13 февраля 2012

Определяет ли wait_event_interruptible непрерывный опрос или только перепроверить условие при вызове wake_up_all? Это объяснение немного неясно.

Смысл планировщика состоит в том, чтобы избежать опроса в подобных случаях. То, что происходит, точно описано в том, что вы цитировали: Условие перепроверяется только при wake_up, например, если заданная задача ожидает получения данных:

  • проверка потребителем наличия данных

  • если нет (то есть условие ложно), он идет в сон и добавляется в очередь ожидания

  • повторить пробуждение

На стороне производителя

  • После получения данных установите флаг или добавьте что-нибудь в список так что условие, оцениваемое потребителем, становится истинным

  • вызов wake_up или wake_up all в очереди ожидания

Теперь я предлагаю вам попробовать использовать их и вернуться с другим вопросом и кодом, который вы пробовали, если он не работает так, как вы хотите.

...