Altifigence Academy

15 / 24 · Travaux pratiques

TP : vérifier 1024 séquences de blocage

Testez conservation, remplacement et vidage avec toutes les séquences ready de dix cycles.

Préserver les valeurs et l’ordre sous blocage

Créez manuellement elastic-model.mjs, enregistrez le code suivant et exécutez node elastic-model.mjs. La source propose quatre éléments ordonnés et n’avance qu’à leur acceptation. Le bit zéro de la séquence commande le front 0, le bit un le front 1, et ainsi de suite. Parcourez les 1024 séquences ready sur dix bits, puis maintenez le récepteur prêt pour vidanger le travail en cours.

Livrez l’ancien emplacement avant de décider du remplacement. Un emplacement vide accepte un élément même avec un récepteur bloqué. Un emplacement plein bloqué ne peut pas faire avancer la source. Incrémenter next à chaque front abandonnerait les éléments non acceptés et rendrait la source de test incorrecte même avec un tampon correct.

javascript
import assert from 'node:assert/strict';
const values = [0, 9, 255, 12];
let deliveries = 0;
for (let pattern = 0; pattern < 1024; pattern++) {
  let slot = null, next = 0;
  const seen = [];
  for (let edge = 0; edge < 20; edge++) {
    const ready = edge >= 10 || ((pattern >>> edge) & 1) === 1;
    const old = slot;
    const inReady = old === null || ready;
    if (old !== null && ready) seen.push(old);
    if (inReady) {
      slot = next < values.length ? { tag: next, y: values[next] } : null;
      if (slot !== null) next++;
    } else {
      assert.deepEqual(slot, old);
    }
    assert.equal(next - seen.length, Number(slot !== null));
  }
  assert.deepEqual(seen, values.map((y, tag) => ({ tag, y })));
  assert.equal(slot, null);
  deliveries += seen.length;
}
console.log(`ELASTIC PASS: 1024 patterns, ${deliveries} deliveries`);

Pour la séquence zéro, le récepteur se bloque aux dix premiers fronts. Tag0, y0 entre dans l’emplacement vide au front 0 et y reste jusqu’au front 9. Le front 10 le livre et stocke tag1, y9. Les étiquettes 1, 2, 3 sont ensuite transférées aux fronts 11, 12, 13. Un zéro valide ne doit pas être confondu avec null. La réussite annonce 1024 séquences et 4096 livraisons.

Acceptées moins livrées égale l’occupation actuelle après chaque front. Ce bilan local circonscrit les échecs plus tôt qu’une comparaison finale des sorties. Les vérifications de conservation couvrent la préservation de charge utile, mais comparer une implémentation réelle exige d’observer sa sortie effective plutôt que seulement la variable inchangée de ce modèle. Exhauster les séquences de dix cycles est un test borné, et non une preuve pour toute durée possible de blocage. La fin éventuelle suppose aussi que le récepteur devienne finalement prêt ; une contre-pression indéfinie exige la conservation, et non une livraison garantie.

Essayez vous-même

Pour la séquence zéro, jusqu’où next de la source avance-t-il aux fronts 0 à 9 ? Que valent l’occupation et next-seen.length après le front 10 ?

Lire l’explication

Seul l’élément du front 0 est accepté : next=1. Au front 10, tag0 est transféré et tag1 entre : next=2, seen.length=1, et la différence comme l’occupation valent un.

Lesson files

elastic-model.mjs ↓

Votre choix s’applique à ce navigateur. Modifiez-le à tout moment en bas de page.