Altifigence Academy

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.

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.

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`);

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.

Lesson files

elastic-model.mjs ↓

Sua escolha vale neste navegador. Altere-a a qualquer momento no rodapé.