Utiliser wait_event_interruptible et wake_up_all ensemble

Pour un projet de classe impliquant des processus de planification utilisant le blocage et les verrous, nous sums supposés utiliser deux fonctions du kernel:

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

L’explication de wait_event_interruptible est la suivante:

Bloque la tâche en cours dans une queue jusqu’à ce qu’une CONDITION devienne vraie.

C’est en fait une macro. Il évalue de manière répétée la CONDITION, qui est un fragment de code C tel que foo == bar ou function ()> 3. Lorsque la condition est vraie, wait_event_interruptible renvoie 0. Si la condition est false, la tâche en cours est ajoutée à wait_queue_head_t. list avec l’état TASK_INTERRUPTIBLE; le processus en cours sera bloqué jusqu’à ce que wake_up_all (& q) soit appelé, puis il revérifiera la CONDITION. Si la tâche en cours reçoit un signal avant que CONDITION ne devienne vraie, la macro renvoie -ERESTARTSYS.

Et l’explication de wake_up_all est la suivante:

Réveillez toutes les tâches de la queue en définissant leurs états sur TASK_RUNNABLE.

J’ai du mal à comprendre comment fonctionnent exactement ces fonctions et comment les utiliser ensemble. Par exemple, quand la condition est-elle vérifiée? Wait_event_interruptible interroge-t-il continuellement ou vérifie-t-il uniquement la condition lorsque wake_up_all est appelée? Cette explication est un peu obscure.

Si vous pouviez donner un exemple d’utilisation de ces fonctions, cela serait très utile.

Wait_event_interruptible interroge-t-il continuellement ou vérifie-t-il uniquement la condition lorsque wake_up_all est appelée? Cette explication est un peu obscure.

Le but d’un programmateur est d’éviter les scrutations dans des cas comme celui-ci. Ce qui se passe est décrit précisément dans ce que vous avez cité: La condition est uniquement vérifiée de nouveau sur wake_up, par exemple si une tâche donnée attend la production de données:

  • vérification par le consommateur si les données sont disponibles

  • sinon (c.-à-d. condition fausse), il se met en veille et est ajouté à une queue

  • réessayer quand réveillé

Du côté des producteurs

  • Une fois les données produites, définissez un indicateur ou ajoutez quelque chose à une liste afin que la condition évaluée par le consommateur devienne vraie.

  • appelez wake_up ou wake_up le tout sur une queue

Maintenant, je vous suggère d’essayer de les utiliser et de revenir avec une autre question ET un code que vous avez essayés si cela ne fonctionne pas comme vous le souhaitez.