Skip to topic | Skip to bottom
Home
Minfo
Minfo.Tp12r1.2 - 02 Dec 2007 - 16:01 - NicolasNobelistopic end

Start of topic | Skip to actions

Avant propos : retour sur les pages

The basic unit of memory is the page. Nobody knows how large a page is (that is why the Linux swapspace structure, with a signature at the end of a page, is so unfortunate), this is architecture-dependent, but typically PAGE_SIZE = 4096. (PAGE_SIZE equals 1 << PAGE_SHIFT, and PAGE_SHIFT is 12, 13, 14, 15, 16 on the various architectures). If one is lucky, the getpagesize() system call returns the page size.

Extrait de ce site. A priori cette taille est en octet, mais prudence. Autre avertissement : certains systèmes ont des pages de taille variable, et le comportement de cette macro dans ces cas là ne semble pas déterminé...

Si vous finissez le présent TD en avance, modifiez votre module du TD précédent afin de rajouter les tests de limite de page.

Wait Queues

Le but de ce TP est d'utiliser les wait queues pour implémenter un mécanisme de producteur/consommateur via un périphérique virtuel en mode caractère.

Version débutant

La lecture sur ce périphérique bloquera en attente d'un message.
L'écriture débloquera tous les processus en attente qui afficheront alors le message reçu via l'opération d'écriture.

Exemple d'utilisation :

$ cat mon_dev

cat est bloqué en attente.

$ echo "Un exemple" > mon_dev

cat se réveille et affiche "Un exemple".

Indications

  • Docs : Site web, cours '06.
  • Utilisez wait_event_interruptible pour pouvoir interrompre avec un signal le (les) processus en attente.

Version confirmé

Seul le processus dont le PID est donné lors de l'écriture se réveille.

Exemple d'utilisation :

$ cat mon_dev

cat de pid 200 est bloqué en attente.

$ echo "200: Un exemple" > mon_dev

Seul cat de pid 200 se réveille et affiche "Un exemple".

Indications

  • Vous pouvez obtenir un pointeur vers le processus courant à l'aide de la macro current. La structure pointée contient en autres un champ pid.
  • Il n'y aura qu' une waitqueue pour les processus en attente. Pour réveiller le processus choisi, vous pouvez :
    • soit chercher à le réveiller grâce à son PID (aucune garantie que cela soit réalisable),
    • soit réveiller tous les processus. Seul celui dont la condition l'y autorisera pourra continuer son exécution.
  • Évitez les race conditions : si un processus est autorisé à continuer, il doit pouvoir le savoir à son réveil qui peut survenir n'importe quand. C'est ainsi que la solution d'une variable globale contenant le pid du processus choisi est à proscrire. Vous utiliserez plutôt une liste de structures contenant chacune : le pid du processus, son état (bloqué ou non), le message qu'il doit afficher si son état est "débloqué".

Version élite

Ajoutez le PID de l'écrivain dans le message envoyé au lecteur :

$ echo "200:Un exemple" > mon_dev

echo a pour pid 300. Le processus cat de pid 200 devra donc afficher la chaîne "300: Un exemple".

Faites en sorte que le processus écrivain attende que le processus lecteur ait lu toute la chaîne. Vous pourrez introduire une deuxième waitqueue (mais il doit être possible de faire sans...).

-- NicolasNobelis - 02 Dec 2007
to top


You are here: Minfo > ApprofondissementSysteme > Tp12

to top

Copyright © 1999-2017 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding WIKIDeptinfo? Send feedback