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? |