15 / 24 · Prática
Laboratório: verifique 1024 padrões de pausa
Exercite manutenção, substituição e esvaziamento com todos os padrões de ready de dez ciclos.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
Preserve os valores e a ordenação durante pausas
Crie manualmente elastic-model.mjs, salve o código a seguir e execute node elastic-model.mjs. A fonte oferece quatro itens ordenados e avança apenas quando são aceitos. O bit zero do padrão controla a borda 0, o bit um controla a borda 1 e assim por diante. Percorra todos os 1024 padrões de ready de dez bits e depois mantenha o destino pronto para esvaziar o trabalho pendente.
Entregue o conteúdo anterior da posição antes de decidir a substituição. Uma posição vazia aceita um item mesmo com o destino em pausa. Uma posição cheia em pausa não pode fazer a fonte avançar. Incrementar next a cada borda descartaria itens não aceitos e tornaria a fonte de teste incorreta mesmo se o buffer estivesse correto.
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`);Para o padrão zero, o destino pausa nas primeiras dez bordas. Tag0,y0 entra na posição vazia na borda 0 e permanece lá até a borda 9. A borda 10 entrega esse item e armazena tag1,y9. As etiquetas 1,2,3 são então transferidas nas bordas 11,12,13. Um zero válido não deve ser confundido com null. O sucesso informa 1024 padrões e 4096 entregas.
Aceitas menos entregues é igual à ocupação atual após cada borda. Essa contabilização local ajuda a localizar falhas mais cedo do que uma comparação final de saídas. As verificações de manutenção cobrem a preservação do conteúdo, embora comparar uma implementação real exija observar sua saída efetiva, e não apenas a variável inalterada deste modelo. Esgotar os padrões de dez ciclos é um teste limitado, não uma prova para toda duração possível de pausa. A conclusão eventual também pressupõe que o destino eventualmente fique pronto; contrapressão indefinida exige preservação, não garantia de entrega.
Experimente
Para o padrão zero, quanto o next da fonte avança entre as bordas 0 e 9? Quais são a ocupação e next-seen.length após a borda 10?
Ler a explicação
Apenas o item da borda 0 é aceito, portanto next=1. Na borda 10, tag0 é transferida e tag1 entra: next=2, seen.length=1, e tanto a diferença quanto a ocupação da posição valem um.