15 / 24 · Практика
Лабораторная работа: проверьте 1024 шаблона остановок
Проверьте удержание, замену и освобождение для всех десятизначных тактовых шаблонов ready.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
Сохраняйте значения и порядок при остановках
Вручную создайте elastic-model.mjs, сохраните следующий код и выполните node elastic-model.mjs. Источник предлагает четыре упорядоченных элемента и продвигается только при приёме. Бит ноль шаблона управляет фронтом 0, бит один — фронтом 1 и так далее. Переберите все 1024 десятибитных шаблона ready, затем держите приёмник готовым для завершения незавершённой работы.
Выдавайте данные из старого места до решения о замене. Пустое место принимает один элемент даже при остановленном приёмнике. Полное остановленное место не позволяет источнику продвинуться. Увеличение next на каждом фронте отбрасывало бы непринятые элементы и делало бы тестовый источник неправильным даже при правильном буфере.
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`);При нулевом шаблоне приёмник остановлен на первых десяти фронтах. Tag0,y0 входит в пустое место на фронте 0 и остаётся там до фронта 9 включительно. Фронт 10 выдаёт его и сохраняет tag1,y9. Метки 1,2,3 затем передаются на фронтах 11,12,13. Достоверный ноль нельзя принимать за null. Успешная проверка сообщает о 1024 шаблонах и 4096 выдачах.
Принятые минус выданные равны текущей заполненности после каждого фронта. Такой локальный учёт локализует ошибки раньше итогового сравнения выходов. Проверки удержания охватывают сохранение полезных данных, хотя сравнение реальной реализации требует наблюдать её фактический выход, а не только неизменную переменную этой модели. Перебор десятизначных тактовых шаблонов — ограниченная проверка, а не доказательство для любой возможной длины остановки. Завершение также предполагает, что приёмник со временем станет готовым; бесконечное обратное давление требует сохранения, а не гарантированной выдачи.
Попробуйте сами
При нулевом шаблоне насколько продвигается source next на фронтах 0–9? Чему равны заполненность и next-seen.length после фронта 10?
Прочитать объяснение
Принимается только элемент на фронте 0, поэтому next=1. На фронте 10 tag0 передаётся, а tag1 входит: next=2, seen.length=1; и разность, и заполненность места равны единице.