15 / 24 · Esercitazione
Laboratorio: verifica 1024 configurazioni di stallo
Esercita mantenimento, sostituzione e svuotamento con tutte le configurazioni ready di dieci cicli.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Conserva valori e ordinamento durante gli stalli
Crea manualmente elastic-model.mjs, salva il codice seguente ed esegui node elastic-model.mjs. La sorgente offre quattro elementi ordinati e avanza soltanto quando vengono accettati. Il bit zero della configurazione controlla il fronte 0, il bit uno controlla il fronte 1 e così via. Esamina tutte le 1024 configurazioni ready a dieci bit, poi mantieni pronta la destinazione per completare il lavoro in sospeso.
Consegna dalla vecchia posizione prima di decidere la sostituzione. Una posizione vuota accetta un elemento anche con una destinazione in stallo. Una posizione piena e in stallo non può far avanzare la sorgente. Incrementare next a ogni fronte scarterebbe gli elementi non accettati e renderebbe errata la sorgente di prova anche se il buffer fosse corretto.
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`);Per la configurazione zero, la destinazione va in stallo sui primi dieci fronti. Tag0,y0 entra nella posizione vuota al fronte 0 e rimane lì fino al fronte 9. Il fronte 10 lo consegna e memorizza tag1,y9. I tag 1,2,3 vengono poi trasferiti ai fronti 11,12,13. Uno zero valido non deve essere confuso con null. Il successo riporta 1024 configurazioni e 4096 consegne.
Accettati meno consegnati uguaglia l'occupazione corrente dopo ogni fronte. Questa contabilità locale circoscrive gli errori prima del confronto finale delle uscite. Le verifiche di mantenimento coprono la conservazione del payload, anche se confrontare un'implementazione reale richiede di osservarne l'uscita effettiva anziché soltanto la variabile invariata di questo modello. Esaminare tutte le configurazioni di dieci cicli è un test limitato, non una prova per ogni possibile durata di stallo. Il completamento futuro presume inoltre che prima o poi la destinazione diventi pronta; una contropressione indefinita richiede conservazione, non consegna garantita.
Prova tu
Per la configurazione zero, quanto avanza next della sorgente sui fronti da 0 a 9? Quali sono l'occupazione e next-seen.length dopo il fronte 10?
Leggi la spiegazione
Viene accettato soltanto l'elemento al fronte 0, quindi next=1. Al fronte 10, tag0 viene trasferito e tag1 entra: next=2, seen.length=1 e sia la differenza sia l'occupazione della posizione sono uno.