Глава 24 Самотест

К стабилизатору Алексей действительно вернулся — ровно настолько, чтобы убедиться, что новый трансформатор ведёт себя прилично: вентиляционные щели не забиты, ничего не подгорает и не пахнет.

После истории с памятью думать о перегреве было почти приятно. Железо простое: если что‑то греется — видно, слышно, иногда ещё и дым идёт. В отличие от ошибок в ОЗУ, которые тихо сидят в одном бите и ждут удобного случая испортить чей‑нибудь расчёт.

К середине февраля эта мысль перестала его отпускать.

* * *

В один из таких февральских вечеров, когда снег уже не падал, а просто висел в воздухе серой взвесью, Алексей поймал Евгения в коридоре у стенгазеты.

— Вдохновляешься? — спросил Алексей.

— Успокаиваюсь, — поправил Евгений. — После наших накладных приятно знать, что где‑то ещё хуже.

— Что, снова в машзал зовёшь? Я думал, после того как мы память на стенде приручили, ты наконец успокоишься.

— Память на стенде — это хорошо, — сказал Алексей. — Но у нас всё ещё нет нормальной оценки, сколько шаблонов самотест может себе позволить.

Он выдержал паузу.

— Нужно прогнать алгоритм на машине. Нормально, с измерением времени, с разными последовательностями.

Евгений театрально закатил глаза.

— То есть мало того, что маленькая ЭВМ будет заниматься самолюбованием при каждом включении, ты предлагаешь ещё и большую заставить по ночам работать диагностом?

Он хмыкнул.

— Знаешь, в каком месте Кирилл Савельевич скажет нам «спасибо»?

— В том, где ему потом не придётся объяснять министерству, почему учебный прибор завис в колхозной бухгалтерии, — спокойно ответил Алексей. — Машинное время дешевле командировок на ремонты.

Евгений вздохнул, но спорить дальше уже начал без нажима.

— Хорошо, допустим. Что ты хочешь? Очередную «гуляющую единицу»?

— Хочу нормальный самотест, — сказал Алексей. — Не только «все нули» и «все единицы». Минимальный набор, который заодно поймает зависшие неизменяемые биты, ошибку адреса и паразитную связь между соседними ячейками.

Он поймал взгляд Евгения.

— И да, часть этих шаблонов мы сейчас придумать не сможем «по ощущению». Их лучше проверить на машине, где мы видим всю картину.

Евгений помолчал.

— Ладно, — сдался он. — Давай так: сегодня идём к Кириллу Савельевичу, выпрашиваем ночной слот. Но с условием: мы не забиваем весь барабан под твои диагностические фантазии. Ты придумываешь три, максимум четыре шаблона. Остальное — потом, в следующей жизни.

— Договорились, — сказал Алексей. — Но про «три» мы ещё поторгуемся.

* * *

Комната начальника вычислительного центра была наполнена двумя вещами: запахом старой бумаги и здоровой подозрительностью.

Кирилл Савельевич, сухощавый мужчина с аккуратной седой бородкой, оторвался от стопки ведомостей и посмотрел поверх очков.

— Машинное время, говорите, — протянул он. — Ночью. На учебные эксперименты.

Так он называл всё, что не попадало ни в расчёты планового отдела, ни в отчётность по областной статистике.

— Не только учебные, — вставил Евгений. — Это для новой ЭВМ, которая у нас в НИИ идёт как учебно‑демонстрационный комплекс. Мы тестируем алгоритм контроля ОЗУ при включении.

— То есть вы хотите, чтобы наша ЕС проверяла вашу память, — уточнил Кирилл Савельевич. — Чтобы потом ваша ЭВМ проверяла сама себя.

— Можно и так сказать, — кивнул Алексей. — Нам важно понять, какие последовательности записи‑чтения дадут максимальный эффект при минимальном времени. Здесь мы можем это измерить точно.

Начальник машинного зала вздохнул.

— Вы, ребята, вообще видели очередь на расчёты? — Он ткнул в сторону доски, где мелом были написаны фамилии цехов и номера заданий. — У меня плановики, автоматчики, бухгалтерия по налогам… А вы с самотестами.

— Зато строго ночью, — мягко напомнил Евгений. — Я сам буду сидеть рядом на подхвате, если что‑то повиснет.

Кирилл Савельевич посмотрел на него внимательно.

— Это вы нам уже обещали, когда модель ЦУБа гоняли, — сказал он. — С тех пор я к вашим «экспериментам» отношусь осторожнее.

Алексей вмешался, пока разговор не ушёл в сторону:

— Мы готовы вписаться между плановыми заданиями, — сказал он. — Любое окно, когда барабан простаивает. Нам не нужен весь ночной слот. Полтора часа с учётом перезапуска — и всё.

Он добавил, чуть смягчив голос:

— И мы потом принесём вам отчёт. С конкретными цифрами, чтобы вы могли показать: машину используют не только как счётчик зарплаты, но и как средство разработки новой вычислительной техники для того же министерства.

Кирилл Савельевич коснулся пальцами стола. При слове «министерство» у него в голове появлялось что‑то вроде внутреннего калькулятора.

— Полтора часа… — протянул он. — А если сначала не заведётся? Маршрутные карты вы мне принесёте? Ответственного назначите?

— Ответственный — я, — тут же сказал Евгений. — Маршрутную карту Наталья Сергеевна уже заполняет. Там будет написано «проверка алгоритма контроля ОЗУ». Красиво.

— В ТЗ у нас есть такой пункт, — добавил Алексей. — «Предусмотреть контроль исправности основных узлов». Мы просто выполняем.

Начальник ещё немного помолчал, потом махнул рукой:

— Ладно, уговорили. Со среды на четверг. С двух ночи до половины четвёртого.

Он поднял палец:

— Но если плановики задержатся, вы ждёте. И никаких «всего одну карточку добить».

— Ни одной лишней карточки, — торжественно пообещал Евгений.

* * *

Ночь на четверг началась с перфоратора.

Комната подготовки программ напоминала одновременно типографию и птичник: треск перфораторов, шелест карт, приглушённые ругательства. В углу курили «Приму» в открытое окно, стараясь не попадаться на глаза технику‑методисту.

Евгений сидел за своим столом, перед ним — аккуратная стопка перфокарт. На первой крупным аккуратным почерком было выведено: «TESTMEM1». Ниже — «FORTRAN».

— Ну что, — сказал он, когда Алексей сел рядом. — Вот твой «минимальный набор».

Он постучал пальцем по верхним картам:

— Первый проход — все нули. Второй — все единицы. Третий — шахматка «01». Четвёртый — обратная «10». Пятый я выбросил.

— Как это — выбросил? — насторожился Алексей.

— Очень просто, — сказал Евгений. — Ты предложил «гуляющую единицу» по всей памяти. Я прикинул цикл — при нашей скорости это ещё секунд десять сверху.

Он развёл руками:

— Дети в школах и так будут считать, что прибор долго «думает». Хочешь, чтобы они его выключали, не дождавшись «Готов»?

— Лучше пусть выключают, чем мы потом ловим подвисания от невыявленных бит, — сухо возразил Алексей. — «Гуляющая единица» ловит ошибки по адресам. Когда у тебя один провод на шине отвалился не полностью, а так… наполовину.

Он чуть наклонился к столу, не повышая голос:

— В моём… скажем так, в хорошем будущем, которое мне иногда снится, все нормальные машины при включении гоняют похожие тесты по памяти. И никого не смущает, что это занимает несколько секунд.

Он посмотрел прямо:

— Если мы сейчас начнём экономить на этом — будем потом всю жизнь разбираться, почему у кого‑то в школе таблица умножения однажды посчиталась не так.

Евгений какое‑то время молча вертел в пальцах карандаш.

— Ты умеешь испортить человеку радость от оптимизации, — наконец сказал он. — Ладно. Я верну тебе твою «гуляющую единицу», но вместо второго прохода шахматки. Одной хватит.

Он взял верхнюю карту, задумчиво посмотрел на дырочки, потом отложил в сторону:

— Иначе мы точно не впишемся в полторы минуты на реальном приборе.

Алексей кивнул:

— Договорились. Вместо двух шахматок — одна. Но «гуляющую» оставляем. И всё равно сначала замеряем на ЕС: сколько это реально занимает.

Евгений вздохнул, но поднялся с довольным видом:

— Пошли тогда в машзал, пока я ещё добрый.

* * *

Машинный зал ночью был похож на гулкий храм. Под фальшполом беспрерывно шёл воздух, в стойках переливались лампочки, барабаны тихо шипели, как удалённый водопад.

Тихонова встретила их у окна операторской, прижимая к щеке трубку телефонной гарнитуры.

— Ага, ваши пришли, — сказала она куда‑то внутрь, кладя трубку. — Только без фокусов, Громов. Если опять повиснем — я на этот раз в журнал так и напишу: «из‑за экспериментатора».

— Мы будем тихими, как мыши, — заверил её Евгений. — Вот, посмотри, какая невинная колода.

Он поднял коробочку с перфокартами.

Тихонова взяла верхнюю, глянула на надпись «TESTMEM1» и на служебные поля.

— Фортран? — уточнила она.

— С элементами, — скромно признался Евгений. — Низкоуровневыми.

— Главное, чтобы не низкооплачиваемыми, — вздохнула Тихонова. — Ладно, идите. Плановики только что освободились, окно есть. Но я вас в три с копейками выгоню.

Они прошли в зал. ЕС‑1035, с блестящими панелями и рядами лампочек, уже спокойнее смотрела на ночных гостей, чем в самые первые их визиты. На отдельном столе, чуть поодаль, стоял небольшой металлический ящик — их испытательный стенд. К нему тянулся толстый шлейф от одной из периферийных стоек.

— Даже красиво, — заметил Алексей, глядя на эту импровизированную пуповину. — Большая машина проверяет маленькую. Как мама руку держит.

— Вот сопли мне тут не распускай, — буркнул Евгений. — Лучше помоги перетащить.

Он осторожно поставил на стол знакомую плату, подсоединённую к стенду.

— Напомню, — пробормотал он, пока подключал разъём, — всю шину адреса и данных мы закинули через этот канал. ЕС пишет в регистр — регистр дёргает наш ЦУБ, тот шлёт сигнал на память. Потом всё в обратную сторону. А машину мы спасаем от осознания, с кем она связана.

— То есть если что‑то пойдёт не так, — уточнил Алексей, — первой сгорит не ЕС.

— Вот видишь, ты уже мыслишь как настоящий программист, — сказал Евгений. — Думаешь, как бы чужую машину не тронуло.

Они загрузили перфокарты в считыватель. Тихонова из операторской кивнула, нажала несколько кнопок, барабан зашуршал быстрее. На пульте загорелась надпись задания с номером их маршрутной карты.

— Поехали, — сказал Евгений.

* * *

Самотест на большой машине был, по сути, тем же, что они уже гоняли на стенде, только в роскоши двоичного поля из восьми тысяч слов, аккуратно уложенных в группе рабочих переменных. И с таймером.

Первая часть программы записывала в память «Сферы» нули, потом читала, сравнивала, считала ошибки и время. Вторая — единицы. Третья — шахматку. Четвёртая — «гуляющую единицу».

Единственное, чего не было в «большой» версии, — это человеческого визуального контроля. Вместо лампочек работал принтер.

— Сейчас будет музыка, — предупредил Евгений.

Через несколько секунд в дальнем конце зала затрещал печатающий барабан. Лента ползла, на ней появлялись строки: сначала служебные заголовки, потом сообщения вида «PATTERN 0: ERRORS 0, TIME 0.37 SEC».

— Нули прошли, — прокомментировал Евгений. — Время — тридцать семь сотых. Жить можно.

— Единицы? — спросил Алексей.

Новая строчка: «PATTERN 1: ERRORS 0, TIME 0.38 SEC».

— Тоже ничего, — сказал Евгений. — Шахматку смотри.

«PATTERN CHESS: ERRORS 0, TIME 0.39 SEC».

— Видишь? — довольно протянул он. — Три прохода, чуть больше секунды. С учётом того, что у нас там всё работает медленнее, ну, пусть будет полторы. Дети даже не успеют отойти за тетрадкой.

Алексей не отрывал взгляда от ленты.

— «Гуляющую» дождёмся, — сказал он.

Евгений закатил глаза.

Через полминуты принтер снова ожил.

«PATTERN WALK1: ERRORS 0, TIME 0.85 SEC».

— Почти секунда, — вслух подсчитал Евгений. — В сумме набегает уже две с лишним.

Он посмотрел на Алексея:

— Ну, велико ли счастье‑то? Ноль ошибок, зато дети считают, что ЭВМ зависла.

— Счастье в том, что мы теперь знаем цифры, — возразил Алексей. — Две с половиной секунды — это не «вечность». И если за них мы ловим то, что иначе поймаем через год, я не вижу проблемы.

Евгений хотел было ещё что‑то сказать, но в этот момент принтер внезапно ожил снова.

Новые строки печатались с чуть меньшими паузами, чем раньше. Алексей заметил в начале: «REPEAT 2».

— Это что ещё? — нахмурился он.

— Я оставил там цикл по повторению, — признался Евгений. — На случай, если ошибка случайная. Второй прогон «гуляющей».

«PATTERN WALK1 REPEAT 2: ERRORS 1, TIME 0.85 SEC».

Оба замолчали.

Единица в графе «ERRORS» смотрелась как загвоздка в идеальной бухгалтерской ведомости.

— Это шутка? — осторожно спросил Алексей.

— Машина шуток не понимает, — мрачно сказал Евгений. — Особенно ночью.

Он уже шагал к принтеру, отрывая ленту. Вернулся с длинным куском бумаги, где под строкой с «ERRORS 1» шли подробности:

«ADDR 1A3, EXPECT 00000001, GOT 00000000».

— Один конкретный адрес, — сказал Алексей. — Одна конкретная единица, которая потерялась.

— Может, это канал, — предположил Евгений. — Глюк на связи между ЕС и нашим стендом.

— Тогда ошибка прыгала бы по адресам, — возразил Алексей. — А тут в обоих повторениях — один и тот же.

Он кивнул на следующую строчку: там было то же «ADDR 1A3».

Евгений замолчал.

— Саша плату паял, — сказал он механически. — Может, дорожка.

— Может, — согласился Алексей. — Поэтому сейчас мы сначала повторим тест, но с другой платой.

Он показал на коробку с микросхемами у стены:

— А потом поменяем местами пару К565 и посмотрим, чья вина.

* * *

Через двадцать минут у них было четыре распечатки.

На первой — плата номер один. Ошибка по адресу 1А3, оба раза. На второй — плата номер два, собранная на тех же микросхемах: опять 1А3. На третьей — плата с другой партией памяти: ошибок нет. На четвёртой — первая плата, но с заменой одного корпуса К565РУ5 на новый: ошибка исчезла.

— Вот тебе и канал, — проговорил Евгений, глядя на ленты, разложенные по столу. — Канал у нас один, платы разные, а болит всё равно одно и то же место.

— И тип микросхемы один и тот же, — добавил Алексей. — Серия РУ5, партия девяносто седьмая.

Он поднял коробку. На этикетке было аккуратно выведено: «К565РУ5, 02‑77».

— Ты видишь закономерность, Громов?

— Вижу, — выдохнул тот. — Не любит она, когда единственный бит гуляет по всему слову.

Он задумчиво постучал по столу:

— Похоже, если до этого там стояла единица в соседнем разряде, эта конкретная К565 не всегда успевает её «забыть».

Алексей кивнул.

— Типичная ошибка по времени восстановления, — сказал он автоматически, и только потом поймал себя на том, что в семидесятых это звучит слишком умно. — Короче, у неё память лучше, чем положено.

Евгений усмехнулся криво:

— То есть она помнит лишнее. Как бухгалтерия.

— И как некоторые инспектора, — добавил Алексей. — Но это нас сейчас не интересует. Нас интересует, что весь ящик этой партии под подозрением.

Евгений посмотрел на коробку, как на чугунный груз.

— Николай нас убьёт, — задумчиво произнёс он. — Он эту партию выбивал, наверное, полгода.

— Либо он нас убьёт сейчас, — спокойно сказал Алексей, — либо потом нас всех будут убивать по одному в школах и домоуправлениях.

Он свернул ленты в аккуратный рулон:

— Пойдём завтра к нему с цифрами. Тут уже не «кажется», тут адреса и повторяемость.

— Может, сначала ещё раз прогнать? — неуверенно предложил Евгений. — Вдруг это… не знаю… солнечная буря.

— Прогоним, — согласился Алексей. — Но не сегодня.

Он посмотрел на часы:

— У нас осталось двадцать минут машинного времени, а я предпочитаю аккуратно завершить, чем убегать под крики Тихоновой.

Евгений тяжело вздохнул.

— И всё‑таки, — сказал он, пока они аккуратно закрывали программу и отдавали машине короткий тестовый job, чтобы она не скучала, — внутри меня есть маленький программист, который плачет.

Он закатил глаза к потолку:

— Мы могли бы за это время написать нормальную игру. Простую, конечно, но…

— Мы пишем игру, — возразил Алексей. — Только для ОЗУ. Выигрыш — когда у тебя нет скрытых ошибок.

Евгений хмыкнул:

— Это даже хуже. В нормальной игре хоть финальные титры есть.

* * *

Николай Петрович встретил их на следующий день с тем же выражением, с каким смотрят на людей, которые пришли с заявлением «верните деньги».

— Мне снабжение звонит, — начал он ещё с порога, — говорит: «Ваши опять ругают партию». Я думаю: кто такие «ваши»? Оказалось — вы.

Он кивнул на коробку, которую держал Алексей.

— Ну? — спросил он. — Чем вам наша память не угодила?

— Тем, что она слишком избирательная, — сказал Алексей. — Одни вещи помнит, другие забывает.

Николай не оценил метафору.

— У нас по накладной допускается до двадцати процентов отказов, — сухо напомнил он. — Это эксплуатация, товарищ Морозов. Вы же не хуже меня знаете.

— Отказ — это когда микросхема совсем не работает, — вмешался Евгений. — А тут всё хуже. Она вроде бы работает, а потом иногда вспоминает лишнее.

Николай нахмурился.

— Конкретнее можно? А то я вас сейчас всех отправлю в отдел технического контроля, они любят, когда разговаривают по формам.

Алексей развернул ленты.

— Конкретно — вот, — сказал он. — Мы прогнали четыре платы с этой партией через программу самотестирования на ЕС. Везде, где стояли К565РУ5 из партии 02‑77, в одном и том же адресе при шаблоне «гуляющая единица» возникала ошибка.

Он ткнул пальцем:

— Адрес 1А3. Направление — запись единицы после нуля. Модель с другой партией — ошибок не даёт.

Николай взял ленты, придвинул к себе, некоторое время молча разбирался в таблицах.

— А это что? — спросил он, показывая на строку «REPEAT 2».

— Повтор теста, — ответил Евгений. — Чтобы исключить «случайный сбой».

Он усмехнулся:

— Случайность, которая дважды попадает в один адрес, у нас переходит в категорию «закономерность».

Николай помолчал.

— И что вы от меня хотите? — наконец спросил он. — Чтобы я всю эту партию на помойку снёс?

Он кивнул на коробку:

— Вы понимаете, сколько бумаги на неё ушло? Согласования, заявки, протокол комиссии…

— Мы понимаем, — спокойно сказал Алексей. — Поэтому не просим выбрасывать.

Он чуть наклонился вперёд:

— Просим не использовать её в оперативной памяти «Сферы‑80».

Он сделал паузу:

— Поставьте их куда попроще. В счётчики, в табло, во что угодно, где одинаковые числа крутятся и нет сложных последовательностей. Там эта ошибка может за весь срок службы не вылезти.

Он постучал по рулону:

— А у нас дети будут гонять по этой памяти такие комбинации, о которых ваша спецификация даже не мечтала.

Николай вздохнул, поёрзал на стуле.

— Вы, Морозов, как всегда, — проговорил он. — Взяли и перевернули всё с ног на голову.

Он поскреб лоб:

— По‑человечески я вас прекрасно понимаю. По бумаге — у меня есть партия, которая формально проходит по ОТК.

Он поднял взгляд:

— Давайте так. Официально эта партия уходит в другой отдел.

Он выдвинул ящик, достал бланк:

— Тут как раз у автоматчиков заявка на память для их табло. Там адреса как Бог положит. Им с этой партией будет счастье. А вам я попробую выбить ещё одну — с завода, где контролёр у нас… наш человек.

Евгений облегчённо выдохнул.

— И вы это можете? — спросил он.

— Могу, — вздохнул Николай. — А то что же я тут сижу, по‑вашему.

Он посмотрел на Алексея:

— Только учтите, я теперь по каждому вашему чиху машинного времени ЕС требовать не буду. Посчитали, доказали — хорошо. Но если через неделю вы придёте и скажете: «знаете, мы придумали ещё два прекрасных шаблона, которые ловят новые виды глюков»…

— Мы всё равно придём, — честно сказал Алексей. — Но, может быть, не через неделю.

Николай закатил глаза, но в уголках губ мелькнуло что‑то похожее на улыбку.

— Идите уже, — буркнул он. — Пока я не передумал.

* * *

Они вышли из бюро снабжения на лестничную площадку и какое‑то время молча спускались.

Евгений первым нарушил тишину.

— Знаешь, Морозов, — сказал он, — я, конечно, всегда подозревал, что ты параноик.

Он достал из кармана маленький бумажный пакет, помял:

— Теперь у меня есть экспериментальное подтверждение.

— Это комплимент? — уточнил Алексей.

— Сегодня да, — кивнул Евгений. — Потому что твоя паранойя только что спасла нам, возможно, пару десятков приборов от таинственных зависаний.

Он вытряхнул из пакета несколько мятных карамелек.

— Держи, — сказал он. — Программистский гонорар за выявленный глюк.

Алексей поймал одну.

— Думал, у тебя мятные идут по смете только за новые функции, — заметил он.

— Ошибаешься, — сказал Евгений. — За правильно найденные баги положено вдвое.

Он чуть ухмыльнулся:

— А ещё — право в следующий раз первым ругаться, когда я скажу: «да ну его, этот самотест, давай лучше игру напишем».

— Я тебе даже помогу ругаться, — пообещал Алексей. — Но самотест мы всё равно допилим.

Евгений вздохнул, но уже без прежней досады.

— Знаешь, — сказал он, — в одном ты прав. Лучше уж машина пару секунд думает, чем потом мы неделю бегаем по учреждениям, объясняя, почему у кого‑то вдруг из таблички исчезла одна строка.

— Это и называется надёжность, — ответил Алексей. — Она скучная, как отчётность. Зато потом никто не вспоминает, что где‑то кто‑то ночью сидел с перфокартами.

Он сунул карамель в рот. Сладость была почти приторной, но мята бодрила и успокаивала одновременно — и после ночи в машзале и утренней ругани со снабжением казалась очень уместной.

— Ладно, — сказал Евгений. — Раз уж мы отстояли «гуляющую единицу», давай вечером посчитаем, как вписать всё это в наш базовый код.

Он усмехнулся:

— А то ещё окажется, что самотест у нас занимает больше места, чем табличные формулы.

— Ничего, — ответил Алексей. — Значит, табличные формулы ужмутся.

На дворе по‑прежнему висел февральский сумрак, на ступеньках общежития кто‑то чистил от снега валенки. Внутри же у Алексея было неожиданно спокойно.

Он не «спасал СССР». Он всего лишь выбросил из будущей ЭВМ партию капризной памяти и довёл до ума кусок самотеста.

Иногда этого вполне достаточно, чтобы потом где‑то в школе маленький курсор спокойно мигал на экране и ждал очередной строки формулы — не исчезая в самый неподходящий момент.

Загрузка...