Corrigé pour l’enseignant

Ordonnancement, cœurs et événements

Recueillez quatre types d’indices : prédiction de l’état pertinent ; comportement dans des cas variés, y compris aux limites ; explication fondée sur la trace et l’état ; correction justifiée d’un écart. Évaluez chacun comme en développement, avec soutien ou autonome, sur papier ou selon la procédure approuvée de votre école. Réussir un défi prouve un comportement de la machine, pas la paternité du code ni une maîtrise complète. Acceptez les programmes équivalents corrects : le corrigé public est un modèle, pas l’unique réponse possible.

Matériel pédagogique public. Les solutions sont des exemples ; des programmes équivalents corrects peuvent aussi réussir les vérifications réelles.

25. Ordonnancement coopératif

Faites alterner des tâches et distinguez la politique d’exécution des instructions du processeur.

Ouvrir cette leçon →

1. Prévoir et tracer

Avant d’exécuter le programme d’essai, prévoyez sa sortie et tracez les trois premières instructions exécutées. Suivez les registres, les indicateurs ou la mémoire pertinents, selon le besoin. Avancez ensuite pas à pas pour comparer.

LOAD 1
CALL taskA
CALL taskB
HALT
taskA: PRINT
SLEEP 500
RETURN
taskB: LOAD 101
PRINT
RETURN

Ajouter les entrées à la file: Aucune

Initialiser la mémoire: Tous les octets sont initialement nuls

Corrigé de la prédiction d’essai

Sortie: 1, 101

InstructionPC avantPC aprèsR0 avantR0 aprèsÉtat pertinentSortie
LOAD0101{"registers":[1,0,0,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":255,"stack":[],"callStack":[],"loopStack":[],"memoryReads":[],"memoryWrites":[]}Aucune
CALL1411{"registers":[1,0,0,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":254,"stack":[],"callStack":[2],"loopStack":[],"memoryReads":[],"memoryWrites":[]}Aucune
PRINT4511{"registers":[1,0,0,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":254,"stack":[],"callStack":[2],"loopStack":[],"memoryReads":[],"memoryWrites":[]}1

2. Construire et vérifier

Lisez un nombre de tours de 0 à 3. Faites commencer le compteur de la tâche A à 0 et celui de B à 100. À chaque tour, appelez A pour augmenter et afficher son compteur, puis B pour augmenter et afficher le sien.

Types d’instructions requis: INPUT, LOOP, CALL, RETURN

Exemple de solution du défi

INPUT
COPY R0 R3
LOAD 0 R1
LOAD 100 R2
LOOP R3
CALL taskA
CALL taskB
RETURN
HALT
taskA: LOAD R1
ADD 1
COPY R0 R1
PRINT
SLEEP 0
RETURN
taskB: LOAD R2
ADD 1
COPY R0 R2
PRINT
SLEEP 0
RETURN

Cas réels du vérificateur

Cas 1
Entrée
0
Mémoire initiale
Tous les octets sont initialement nuls
Sortie attendue
Aucune
Cas 2
Entrée
1
Mémoire initiale
Tous les octets sont initialement nuls
Sortie attendue
1, 101
Cas 3
Entrée
3
Mémoire initiale
Tous les octets sont initialement nuls
Sortie attendue
1, 101, 2, 102, 3, 103

3. Expliquer la machine

L’alternance CALL/RETURN équivaut-elle à la préemption matérielle ?

Raisonnement et note pédagogique

Non. C’est un modèle de répartiteur coopératif ; la politique et le quantum de l’ordonnanceur relèvent de la simulation des systèmes explicitement identifiée.