| 46 | | |
| 47 | | Pour instancier le !MultiTty vous aurez besoin de définir une liste de noms de TTYs, ce qui suppose un nombre variable d'arguments. |
| 48 | | Vous aurez besoin d'utiliser une fonctionnalité du langage Python: le passage de nombre variable d'arguments issus d'une liste. Supposant que ''nproc'' est une variable contenant le nombre de tty (égal au nombre de processeurs) |
| 49 | | * il faudra créer une liste avec les noms des tty: |
| 50 | | {{{ |
| 51 | | noms_ttys = ["tty%d"%i for i in range(nproc)] |
| 52 | | }}} |
| 53 | | * puis passer cette liste comme une liste d'arguments au constructeur du !MultiTty: |
| 54 | | {{{ |
| 55 | | tty_controller = MultiTty('tty', *noms_ttys) |
| 56 | | }}} |
| 57 | | Avec `nproc = 3`, ces deux lignes reviennent à: |
| 58 | | {{{ |
| 59 | | tty_controller = MultiTty('tty', "tty0", "tty1", "tty2") |
| 60 | | }}} |
| 61 | | |
| 62 | | Il faudra de plus connecter les ''nproc'' lignes d'interruption du controlleur `MultiTty` à |
| 63 | | chacun des port d'interruption IRQ0 des ''nproc'' processeurs. Une boucle suffit: |
| 64 | | {{{ |
| 65 | | for i in range(nproc): |
| 66 | | tty_controller.irq[i] // self.processor[i].irq[0] |
| 67 | | }}} |
| 68 | | |
| 69 | | Vous exporterez les membres suivants: |
| 70 | | * `processor`: une liste contenant tous les processeurs crées. On accédera au processeur ''n'' par `archi.processor[n]` |
| 71 | | * `cram`: une liste contenant tous les segments cachés crées |
| 72 | | * `uram`: une liste contenant tous les segments non cachés crées |
| 73 | | * `vgmn`: l'interconnect |
| 74 | | * `locks`: le composant de verrous matériels |
| 124 | | |
| 125 | | On va utiliser pour cela les informations fournies par l'ordonnanceur de tâches associé à chaque processeur. |
| 126 | | Lorsqu'une tâche se bloque (par exemble en attente de données disponibles sur un canal MWMR d'entrée), |
| 127 | | l'ordonnanceur essaie de lancer l'exécution d'une autre tâche. Dans un système où chaque processeur |
| 128 | | n'exécute qu'une seule tâche, l'ordonnanceur va essayer de relancer l'exécution de la tâche bloquée |
| 129 | | un grand nombre de fois, jusqu'à ce que la condition de blocage disparaisse. Le compteur ''idleness'' |
| 130 | | - affiché par l'ordonnanceur - mesure le nombre total de tentatives de lancement d'une autre tâche. |
| 131 | | Une valeur élevée pour ce compteur est donc un bon indicateur que le processeur est faiblement utilisé, |
| 132 | | puisque que l'ordonnanceur essaye souvent de passer la main à d'autres tâches. |
| 133 | | |
| 134 | | [[Image(MjpegCourse:q.gif)]] Q4: Les valeurs des compteurs ''idleness'' sont-elles cohérentes avec les informations |
| 135 | | de profilage obtenues sur station de travail? |