Перейти к содержимому

Давным давно когда 640 кбайт хватало на все лучшие компьютеры

  • автор:

640 КБ на самом деле хватит всем

image

Действительно ли Билл Гейтс произнёс фразу «640 КБ должно хватить всем»? Её история довольно туманна, однако чаще всего её приписывают Биллу, так что, возможно, он действительно такое говорил.

Его довольно часто за это высмеивали. Мысль о общем пространстве памяти размером всего 640 КБ по современным стандартам смехотворна. В этот размер не уместится даже исполняемые файлы большинства программ-установщиков.

Для сравнения: калькулятор в Windows 10 занимает в состоянии простоя 16,2 МБ оперативной памяти — почти в 26 раз больше, чем объём доступной DOS-программам памяти в 1980-х.

Странные дела

Поверите ли вы мне, если я скажу, что до сих пор существует активное сообщество, использующее эту устаревшую платформу и разрабатывающее для неё ПО?

Наверно, вашим первым вопросом будет «Но зачем?» И я хорошо вас понимаю. Давайте рассмотрим некоторые группы, которые до сих пор заинтересованы во вложениях усилий в DOS.

Разработчики legacy-систем

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

Незатратные системы реального времени

DOS в сущности является операционной системой реального времени (ОСРВ). Она не была специально разработана для этой цели, но её минималистичный дизайн позволяет отнести её к другим подобным системам.

ОСРВ характеризуются предсказуемой задержкой программных и аппаратных запросов. Так как DOS имеет минимальный API без внутренней многозадачности, стабильность задержек вызовов операционной системы довольно высока.

Хотя уже существуют более современные примеры систем реального времени с улучшенным дизайном и разработанные специально для этой цели, тончайший интерфейс DOS между приложением и оборудованием даёт ей преимущество в этой области использования. Поскольку такие системы, как FreeDOS (которую я рассмотрю ниже) имеют открытые исходники и распространяются бесплатно, они являются хорошей альтернативой другим ОСРВ.

Ностальгические видеоигры

Современные видеоигры потрясающи. Они требуют огромной мощи 3D, но графика, звук и геймплей иногда настолько реалистичны, что их можно спутать с реальностью. Оборудование виртуальной реальности ещё больше усиливает это ощущение, позволяя игрокам полностью погрузиться в среду игры.

Но несмотря на весь этот прогресс, многие геймеры, бывшие детьми в 80-х и начале 90-х, с любовью вспоминают времена, когда примитивная (по современным стандартам) графика и синтезаторные звуки заставляли их заполнять пробелы собственным воображением.

Несмотря на то, что оборудование оставило ограничения эры DOS далеко позади, по-прежнему существует активная сцена DOS-геймеров. Движимые ностальгией и любовью к программированию, разработчики пишут игры, запускаемые на старых системах, в том числе и на PC, которые изначально поставлялись с DOS.

Если вы считаете, что этот рынок ограничен кучкой пенсионеров, пытающихся вернуться в своё технологическое детство, то вы ошибаетесь. Дэвид Мюррей, больше известный в YouTube как The 8-bit Guy, имеет более полумиллиона подписчиков, которые еженедельно исследуют территорию ностальгического компьютерного «железа». Он даже написал стратегию реального времени для Commodore 64 под названием PlanetX2. Проект имел такой успех, что Дэвид распродал все физические запасы носителей с игрой и планирует создать сиквел для платформы DOS.

Запустите DOS

Существует множество способов запуска DOS. Возможно, у вас даже сохранился компьютер, на котором можно запустить её прямо сейчас. Но поскольку мы хотим плотно работать с этой операционной системой, то воспользуемся способом, в котором применяется бесплатное ПО, работающее почти на любом компьютере.

Для начала немного поговорим о лицензии. По некоторым данным, Microsoft сделала MS-DOS 6.22 общественным достоянием, но мне не удалось найти этому подтверждения. Поскольку ПО можно легко скачать из достаточно безопасных онлайн-источников, я не сторонник установки того, что может нарушать права на копирование. Даже если у вас есть законно приобретённая копия (а я подозреваю, что она есть у многих), её установка на виртуальную машину может быть юридически рискованным поступком.

Чтобы упростить установку, мы воспользуемся FreeDOS. FreeDOS — это клон DOS с открытым исходным кодом, написанный Джимом Холлом. Джим начал разработку в июне 1994 года, когда Microsoft заявила о том, что больше не будет продавать и поддерживать MS-DOS. Через несколько недель к проекту присоединились Пэт Виллэни и Тим Норман. Всего через несколько месяцев появилась версия 0.01. Сегодня мы пользуемся версией 1.2, выпущенной на Рождество 2016 года.

Сначала мы зайдём на веб-сайт FreeDOS и скачаем ISO-образ стандартного установщика на CD-ROM. Также можно скачать USB-версию, но с учётом различий в «железе», BIOS и т.д. мы не будем рассматривать здесь этот способ. Вместо этого мы воспользуемся виртуализацией.

Я протестировал FreeDOS и с VirtualBox Oracle, и с VMware Workstation / Player. Оба продукта работают хорошо, однако VMware обеспечивает немного более качественную эмуляцию BIOS и эмулирует PC speaker, используемый во многих играх для DOS. В примерах ниже я буду использовать VMware Workstation, но в принципе подойдёт любая система.

По умолчанию вариантами установки для FreeDOS являются VirtualBox и VMware. Вас может удивить, насколько мало выделяется ОЗУ и дискового места. Обычно я создаю для DOS двухгигабайтный диск, но и выбранных по умолчанию 512 МБ будет вполне достаточно.

Установка FreeDOS проста, достаточно загрузиться в виртуальной машине с ISO-образа (запрос файла ISO будет выдан при запуске или при создании виртуальной машины) и следовать экранным подсказкам. После того, как FreeDOS разобьёт диск и перезагрузится, снова выберите «Install to Hard Disk». Выберите «Full Installation» или «Full Installation with Sources», если вы любите видеть, как всё работает. Вы читаете эту статью, поэтому скорее всего так и есть, тогда почему бы не установить и исходники?

После установки необходимо будет перезагрузиться. На этот раз вместо выбора «Install to Hard Disk» в загрузочном меню CD выберите «Boot from System Hard Disk». Вариант по умолчанию Jemmex (with no EMS) вполне подходит для стандартной загрузки, особенно если вы хотите заняться разработкой.

Технически система FreeDOS готова к работе, только пока ещё полностью «голая». В таком состоянии удобно запускать игры и программы DOS, но оно не совсем подходит для разработки, потому что у нас нет важных инструментов.

Милый FDimples

Теперь настало время установить в FreeDOS немного программного обеспечения. ОС содержит в себе замечательную систему правления пакетами FDimples. Чтобы воспользоваться ею, введите:

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

Потрясающий пакетный менеджер с милым названием.

Для перемещения между категориями и пакетами можно использовать клавиши со стрелками. Пробелом выбираются отдельные пакеты, ENTER — целые категории. Какой бы вариант вы ни выбрали, обязательно отметьте категорию Development. Для запуска установки нажимайте TAB, пока не будет выбрана кнопка OK, затем нажмите ENTER.

От C++ не спрятаться

Но вы и не стремитесь, не так ли? C++ замечателен, и благодаря Ди Джею Делори производительность и возможности GNU Compiler Collection теперь доступны и в DOS.

Более того, с помощью поставляемого в комплекте расширителя DOS CWSDPMI программы могут использовать защищённый режим и компилироваться в 32-битные исполняемые файлы без малейших проблем. Вы сможете преодолеть барьер 640 КБ с большим запасом. Выкусите, мистер Гейтс!

Чтобы проверить работоспособность среды разработки, давайте создадим новую папку и тестовый проект:

При этом запустится среда разработки RHIDE. Она не дотягивает до уровня Visual Studio, но для наших нужд разработки вполне достаточна. Мне она напоминает среду Borland Turbo-C, с которой связано множество приятных воспоминаний.

От этого интерфейса по телу разливается тепло и пробегают мурашки.

Вот обязательный тестовый код:

Теперь можно запустить код с помощью меню «Run» (или нажав ALT+R, а затем R или CTRL+F9). Вы заметите, что можно пользоваться мышью и горячими клавишами. Поначалу мыши достаточно, но стоит запомнить горячие клавиши, которые указаны рядом с различными элементами меню. Проведя какое-то время в RHIDE, вы запомните самые важные из них и ваша продуктивность значительно увеличится!

Более интересный пример

Давайте сделаем что-нибудь более интересное. Для начала давайте создадим рабочее пространство:

В этом примере мы покажем, как задаются видеорежимы, указываются пиксели и выполняется управление цветом в режиме VGA 320x200x256.

Пример с движением

В этом примере мы на основе предыдущего примера добавим управляемое пользователем движение. Мы будем использовать клавиши со стрелками, чтобы перемещать пиксель по экрану. Это станет фундаментом того, что может превратиться в видеоигру.

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

Например, для получения нажатий клавиатуры мы используем INT 16. Это работает хорошо, но приостанавливает работу программы, пока она ждёт ввода. В более сложном примере мы бы использовали INT 16 AH = 01 для проверки состояния клавиатуры и возвращались бы к выполнению программы, если ввод с клавиатуры отсутствует. Это даст нам время на отрисовку другой графики. В нашем примере это работает нормально, но для более динамичной игры нужно будет писать обработчик событий клавиатуры с этими функциями.

Кроме того, put_pixel и clear_pixel работают достаточно хорошо, но оба они не так эффективны, как создание буфера кадра и запись в него. Буфер памяти можно с любой нужной скоростью копировать в видеопамять с помощью memcpy(). Пример его использования может выглядеть как-то так:

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

Лучшее из обоих миров

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

Однако в таком подходе есть своя красота. Вместо того, чтобы писать целиком на ассемблере, я могу воспользоваться мощью вызовов прерываний языка ассемблера в сочетании с удобством C++, не говоря уже о мощной системе управления памятью в защищённом режиме, доступной благодаря DJGPP.

Можно сказать, что используя эту систему, я жульничаю, и если относиться к этому строго, то так и есть. До появления расширителей DOS разработчикам приходилось мучиться, пытаясь уместить всё в 640 КБ. И если смотреть реалистично, у них редко было даже 640 КБ. На большинстве DOS-машин после загрузки драйверов и TSR (резидентных программ) едва находилось 600 КБ ОЗУ.

Этого было достаточно для простых программ, но когда требовались более сложные структуры данных, приходилось использовать расширители DOS или EMS (расширенную память). Код может быть и умещался в 600 КБ, но пространства данных в сложных программах и играх требовали места для роста, а барьер в 1 МБ был невероятно мал. Расширители DOS наподобие CWSDPMI были настоящими спасителями!

Подводим итог

Надеюсь, вам понравилось наше путешествие в Страну ностальгии. Программирование под DOS — это очень интересная область. В любой другой операционной системе сложно так близко подобраться к голому «железу», а без использования DJGPP трудно добиться равновесия между функциональностью и гибкостью.

Хочется, чтобы у нас было больше времени на более сложные примеры программ. С этим комплектом разработки наши возможности поистине безграничны. Мы получаем молниеносность программирования под DOS, графический потенциал системы VGA (которая, несмотря на свою древнюю природу, по-прежнему может создавать интересную игровую графику) и мощь стандартной библиотеки C.

Благодаря C++ мы можем создать класс персонажа для героя видеоигры, назначить ему переменные (например, текущее положение на экране, здоровье и силу) и управлять им с помощью клавиш со стрелками. Поскольку у нас есть до 4 ГБ адресуемого пространства (по крайней мере, теоретически), мы можем считывать с диска сложную тайловую графику или даже целые JPG пререндеренной графики. С помощью этой системы вполне возможно создать почти современную видеоигру.

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

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

Давным давно когда 640 кбайт хватало на все лучшие компьютеры

Ну, начнем с исторических функций.
Давным-давно, когда даже Билл Гейтс говорил что 640 килобайт хватит всем, но не у всех были эти 640 килобайт. 🙂 в биосах существовала функция определения количества базовой памяти.

  • ax — размер базовой памяти в килобайтах.

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

Появлялись новые процессоры, и размеры памяти стали расти. в связи с чем появилась функция определения количества расширенной памяти.

  • ah = 88h
  • ax — размер расширенной памяти в килобайтах.

Возможно из за архитектуры 286-х процессоров (которым размер шины адреса не позволяет иметь больше чем 16 мегабайт памяти) эта функция часто имеет аналогичное ограничение и результат в ax не может превышать 3с00h (Что составляет 15Мб).

Но, опять таки, появились новые процессоры. 16 мегабайт стало мало. Вследствие этого появилась еще одна функция BIOS:

  • ax = e801h.
  • ax — размер расширенной памяти в килобайтах до 16Mb;
  • bx — размер расширенной памяти в блоках по 64к свыше 16Мб;
  • cx — размер сконфигурированный расширенной памяти в килобайтах до 16Mb;
  • dx — размер сконфигурированной расширенной памяти в блоках по 64к свыше 16Мб.

Не знаю, что означает сконфигурированная память. Так написано в описании.

Здесь производители BIOS видимо оказались неединодушны. Некоторые версии в ax и bx возвращают 0, это значит что размер памяти следует определять из cx, dx.

Но видимо и 4 гигабайт оказалось мало. В новых BIOS появилась еще одна функция.

  • eax = e820h;
  • edx = 534d4150h (‘SMAP’);
  • ebx — смещение от начала карты памяти;
  • eсx — Размер буфера;
  • es:di — Адрес буфера для размещения карты памяти.
  • eax — 534d4150h (‘SMAP’);
  • ebx — следующее смещение от начала карты памяти, если = 0, то вся карта передана;
  • ecx — Количество возвращенных байт;
  • буфер заполнен информацией;

Эту функцию нужно вызывать в цикле до тех пор, пока не будет прочитана вся карта памяти.

Формат структуры таков:

  • 1 — Доступно для использования операционной системой;
  • 2 — Зарезервировано (например, ROM);
  • 3 — ACPI reclaim memory (Доступно для операционной системы после прочтения таблицы ACPI;
  • 4 — ACPI NVS memory (Операционной системе требуется сохранять эту память между NVS сессиями).

Функции BIOS не работают в защищенном режиме, поэтому все эти операции необходимо производить еще до перехода в защищенный режим.

Определение размера памяти другими способами:

Помимо функций BIOS есть еще много других способов.

Самый простой — помереть память самому. 🙂 Делается это из защищенного режима, страничное преобразование должно быть выключено, адресная линия A20 должна быть включена.
Можно мереть от нуля, но поскольку в первом мегабайте есть дыры (видеопамять, биосы, просто дыры), удобнее делать это начиная с первого мегабайта.

Вовсе не обязательно проверять каждый байт, достаточно проверять один байт на какое-то определенное количество памяти. Определенным количеством памяти можно посчитать мегабайт, но лучше (хотя и медленнее) за единицу памяти принять одну страницу памяти (4к).

Во избежание неприятностей память лучше не разрушать, а восстанавливать в первоначальном виде. делается это примерно так:

xchg [ebx], eax
xchg [ebx], eax

Если после этого в eax содержится то же значение, которое было до того, значит память присутствует по данному адресу. Если возвратилось 0ffffffffh, значит память отсутствует, если же что ни будь другое — то это может быть ROM, хотя после мегабайта вы вряд ли встретите какой либо BIOS. В любом случае если память по текущему адресу не обнаружена, значит, память закончилась и дальше искать чревато. существуют еще различные типы памяти (ACPI например) которую не стоит трогать.

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

  • 15h — Базовая память в килобайтах (младший байт) (IBM);
  • 16h — Базовая память в килобайтах (старший байт) (IBM);
  • 17h — Расширенная память в килобайтах (младший байт) (IBM);
  • 18h — Расширенная память в килобайтах (старший байт) (IBM);
  • 30h — Расширенная память в килобайтах (младший байт) (IBM);
  • 31h — Расширенная память в килобайтах (старший байт) (IBM);
  • 34h — Расширенная память более 16Мб (блоками по 64к) (младший байт) (AMI);
  • 35h — Расширенная память более 16Мб (блоками по 64к) (старший байт) (AMI);
  • 35h — Расширенная память (блоками по 64к) (младший байт) (AMI WinBIOS);
  • 36h — Расширенная память (блоками по 64к) (старший байт) (AMI WinBIOS);

Байты 30-31 принято считать стандартными, но они определяют только 64Мб памяти. Не очень то подходят для использования.

Динамическое распределение памяти.

Почти любое приложение пользуется динамически выделяемыми блоками памяти (известная, наверное, всем функция malloc в c). Сейчас мы поговорим о том, как это все работает.

Подходить к этому можно по разному, но принцип везде прослеживается один. На каждый блок памяти необходимо иметь структуру, описывающую занятось блока, его размер. В примитивной реализации это может выглядеть так, как это сделано в DOS.

В ДОСе вся память на равных правах принадлежит всем запущенным программам. Но чтобы операционная система могла как-то контролировать использование памяти, в ДОСе применяются MCB (Memory Control Block). Формат этого блока таков:

Размер структуры 16 байт (1 параграф памяти) и эта структура непосредственно предшествует описываемому блоку памяти.
Размер блока указывается в параграфах в поле SizeParas. Такая структура вполне подходит для ограниченной по размерам памяти DOS, но для приложений она не очень то применима. Разница состоит в том, что в случае ДОС, чтобы найти блок свободной памяти (Такие блоки помечаются нулевым OwnerId), необходимо пройти по всем блокам от начала цепочки, до тех пор, пока не встретится свободный блок соответствующего размера. В ДОСе имеется функция, с помощью которой можно получить адрес первого блока (Base MCB) (int 21h, fn 52h).
Столь медленный поиск не страшен для DOS, у которого количество блоков редко превышает несколько десятков, но в приложениях поиск по цепочке блоков может быть достаточно долгой процедурой.
Поэтому в приложениях обычно применяется другой алгоритм, который заключается в следующем. (Я рассмотрю наиболее быстрый алгоритм, вариантов, конечно, может быть множество):

У каждого блока, как я уже говорил, есть два основных параметра: размер и флаг занятости. Оба эти параметра размещаются в одном двойном слове памяти. Поскольку как начало блока, так и его размер обычно выравниваются на четное число байт, младшие биты размера остаются неиспользуемыми (всегда равны нулю) и флаг занятости размещается в одном из них.

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

Свободные блоки памяти размещаются в списках в соответствии со своим размером. Размер блоков в списках увеличивается в геометрической прогрессии. К примеру, в первом списке хранятся блоки до 16 байт длиной, во втором до 32-х байт длиной и так далее. Такая система позволяет, зная размер необходимого блока, сразу же выбирать из соответствующего списка подходящий блок и не требует поиска по всем блокам. Для организации списков к блоку добавляются несколько параметров (поскольку блок свободен, и его внутреннее пространство может быть использовано для любых целей, эти параметры размещаются в самом блоке). К этим параметрам относятся ссылка на следующий свободный блок в списке, и номер списка в котором находится блок. (Это позволяет ускорить удаление блока из списка).

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

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

При освобождении блока, если предыдущий или последующий блоки пусты, он объединяется с ними в один блок и добавляется в список соответствующего размера. Использованные окружающие блоки удаляются из тех списков, в которых они были записаны ранее.

Для того, чтобы предотвратить попытку объединения первого блока памяти (при его освобождении) с предшествующим ему, перед первым блоком ставится параметр с флагом занятости. То же самое делается и для последнего блока памяти, но только после него.

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

Проблема 2000

Old man sym.png

. Загорятся реки, взорвутся дороги, калькуляторы превратятся в ядерные боеголовки.

. Из-за не устранённых вовремя ошибок, связанных с «проблемой 2000 года», корпорация Microsoft отложила выпуск Windows 2000 до 1-го квартала 1901 года

Проблема 2000, она же Y2K (Year 2 kilos, то есть год 2 тысячи, иногда транслитерируется на расовый русский как «Удвак») — внезапное выпиливание всех компьютеров в мире, которое ожидалось в первую миллисекунду 2000 года.

Виной тому — жадные программисты прошлого тысячелетия, которые поскупились выделить лишний байт для хранения даты; в результате, 1999 год должен был смениться на 1900 или 19100 [1] , ставя человечество на грань временного парадокса и деления на ноль. Градус добавляли вполне реальные подобные баги в самых разнообразных программах, неоднократно вылезавшие боком.

Предчувствуя глобальную катастрофу и возможный попил бабла, лучшие умы человечества объединились, чтобы дать бой этой напасти. Был разработан хитрый план, отпечатаны более 9000 книг по борьбе с недостающим байтом, а число патчей к различному софту исчислялось миллионами. В результате «проблема 2000» была полностью побеждена, и человечество возликовало. Несколько омрачал радость тот факт, что ни единого разрыва не произошло даже в тех странах, которые с проблемой не боролись, правительственных комиссий не создавали, книг не печатали и патчей не выпускали. И главное, миллиарды денег за новые, проверенно-сертифицированные версии разнообразных маздаёв никому не платили. Но прогрессивным людям недосуг оглядываться на такие мелочи, ведь впереди ещё много трудностей, о разрешении которых нужно начинать думать уже сейчас. Например, проблема 10000, проблема 2100 года (исчерпание EUI-48) или хотя бы 2038.

Содержание

Y1C [ править ]

К 2011 году проблема возникла у жадных тайваньцев. Она связана с тем, что в Тайване в официальных целях используется календарь, ведущий отсчёт с 1912 года, поэтому 2011 год по нормальному белому календарю будет соответствовать сотому году по календарю узкоглазому, что могло вызвать проблемы в программах, в которых для хранения дат используются только две цифры, что на самом деле не редкость там. В итоге частный сектор не пострадал совсем, госучреждения же вовремя успели внести поправку на жадность.

Y2K38 [ править ]

Ещё одна люто, бешено ожидаемая ошибка, связанная с инкрементирующим оверлоудом счётчика секунд, прошедших с начала эпохи C. Все программы, использующие 32-разрядное время библиотеки <time.h>, 19 января 2038 в 3:14 ёкнутся нафиг и удивят юзера кто во что горазд: одни больше не станут запускаться, другие упадут, третьи заглючат, четвёртые покажут 13 декабря 1901 года и лишь немногие продолжат нормально работать.

А разгадка проста: на 32-битных системах тип time_t представляет собой знаковое 32-битное число, которое показывает количество секунд с начала 1970 года, поэтому его максимальное значение равно 2 147 483 647, а добавив к этому числу единицу, мы получим минус 2 147 483 648 из-за переполнения. Если проблема 2000 касалась больше пользовательских интерфейсов, то проблема 2038 затронет внутренние потроха системных программ, так как всякие таймауты и временные интервалы проще считать именно через Unix-время, чем любым другим способом. Это может вызвать уже гораздо более заметный пиздец, особенно если современные 32-битные программы без доработок доживут до того времени. Если не большинство, то заметная их доля написана без учёта проблемы 2038.

С переходом на 64 разряда этот сценарий конца света становится неактуальным (вернее, переносится на 4 декабря 292277026596 года. Это, конечно же, очень всех беспокоит, но ссылку на пока ещё пустой шаблон Проблема_292277026596_года в Википедии уже поставили).

Y21C [ править ]

2100 хоть и делится на четыре, но этот год не будет високосным, так как в григорианском календаре года, делящиеся без остатка на 100, не являются високосными, если не делятся без остатка на 400 (таким был 2000). Для быдла это будет выражаться в том, что праздник по случаю Октябрьской революции и Рождество будут выпадать на 8-ой день календаря, а 8 марта станет 9-ым марта.

Очевидно, что не только быдла, но и быдлокода без учёта этой особенности over 9000. Да кстати стоит добавить то, что в Windows XP времяисчисление ограничено до 2099 года, следовательно, когда настанет 2100 год, ваш компьютер покажет, что сейчас 1985 год, и вы нахрен в прошлое улетели. Что характерно, ошибка 2100 не исправлена ни в Висте, ни в семёрке и даже не в 8 и 8.1. В Windows 10 таки поправили. Этакая проблема Y21C (Year Twenty-One Hundred, Year Twenty-One Centoes, отсюда и Y21C, C = cento, сто, 100 (ну как K = Kilo, кило, 1000), неправильно Y2K100, Y2K1C, ибо 2100 — Twenty-One Hundred, двадцать одна сотня, но никак не две тысячи сто) актуальна в некоторых версиях Windows. Но актуальна она не только лишь для операционок, но и для программ, использующих и по сей день число года двумя цифрами. Как бы не захотели, после 99-го года (XXI века только!) 100 не будет, будет 00 и программа решит, что снова наступил Миллениум, грубо говоря комп вас вернёт на сто лет назад, в 2000 год, хотя на самом деле наступил новый, XXII век.

Y21C07 [ править ]

2107-й год является последним годом, поддерживаемым файловой системой FAT (включая новомодную проприетарную до мозга костей exFAT). Эта файловая система используется на флэшках, отформатированных под Windows.

Y22C86 [ править ]

20 ноября 2286 количество секунд, прошедших с начала эпохи Си, перевалит за 10 миллиардов. Тогда потребуется уже 11 цифр, чтобы хранить это значение. Соответственно, полетит весь софт, который сейчас тупо проверяет, что таймштапмы содержат 10 цифр. Плюс к этому обломаются все, кто хранит секунды тупо в виде числа в таблице с ограничением в 10 цифр.

30828 [ править ]

В 30828-м году происходит переполнение времени в формате FILETIME, который используется повсеместно в Windows, включая файловую систему NTFS. Поэтому в 30828 году нас ждёт катастрофа. Но кто тогда будет пользоваться виндами? Впрочем, с Adeptus Mechanicus станется.

Y2C7BIT [ править ]

Ну и наиболее вероятная ошибка(про которую благополучно забыли настолько, что до её срабатывания от вписки про неё сюда осталось меньше суток, а неиллюзорно доставит она всем олдфагам как минимум. В особенности своей «невыпиливаемостью») связана с тем, что в самой топологии микросхемы таймера, так широко раскомунизженного по всем физическим электронным часикам во всём мире простой копипастой фрагмента кристалла чуть менее чем полностью, у счётчика года в этом кристалле разрядность тоже ограничена. Поэтому в обычных наручных, настенных, настольных и других электронных часах «с цифирьками вместо стрелок» после 2019-го наступает…не, даже не надейтесь… 1980-й год(в чём усмотрена шикарнейшая пасхалка так как это — год разработки этой топологии). Ну а поскольку посадить такую микросхему на материнку какого-нибудь компучера, смартфона или бытового устройства, де будильник играет хоть какую-то роль, тоже вполне так могли — не удивляйтесь особым чудесам на кухне, в ванной,…и т. п. в новом 2020-м/1980 м году ;) Это как раз нормально.

Так что если в Новом Году у Вас при взгляде на ГОД на любимых часиках возникнет стойкое ощущение, что явилась Белка и пора бежать сдаваться — не пугайтесь. Баг не у Вас, а у Этой Реальности. И даже скажу больше — Это не баг — это фича!(с)Nokia.

Високосная секунда [ править ]

Иногда так бывает, что сутки заканчиваются не в 23:59:59, а в 23:59:60 (либо же в 23:59:58), дабы учесть влияние Луны на скорость вращения Земли. Но увы, не всякое ПО способно корректно переварить лишнюю секунду. Особенно этим грешат прыщесерверы, которые попросту зависают, приводя к локальным пиздецам в банковской и не очень сфере. В последний раз такой пиздец случился в ночь с 31 декабря 2016 на 1 января 2017 года. ЦБ РФ нервничает.

31 февраля [ править ]

Ещё одна пасхалка в микросхеме таймера (которой можете лично глумонуться над знакомыми в конце февраля) связана с сигналами сброса счётчика дней и инкремента счётчика месяцев. Делается таким образом:

1. Ставим на часах високосный год.

2. Выставляем 29 февраля.

3. Возвращаем реальный год…

Результатом таких нехитрых манипуляций получим то, что часы педантично отсчитают в феврале от 31 до 39 дней, при этом всерьёз считая, что их совсем не глючит и март реально будет позже.

IRL [ править ]

У многих может возникнуть впечатление, что проблема была высосана из пальца и реально никакой угрозы, тем более глобальной, не существовало. Однако следует учитывать местную специфику. Пока в этой стране ударными темпами пытались построить коммунизм к 1980 году и клеили танчики, проклятые капиталисты пытались выкинуть на улицу без выходного пособия существовавший у них уже тогда офисный планктон, внедряя в стране эльфов, Цюрихе, Лондоне и прочих интересных местах, первые банковские компьютеры на базе мейнфреймов. Софт для этих монстров в связи с отсутствием 1С писался на таких интересных языках, как COBOL, MUMPS и прочих радостях гиков, которые большинство современных программистов считают вымершими из-за отсутствия статей про них на хабре.

Так как со временем парк мейнфреймов естественным путём убывал, а денег и нервов на переиздание всего выводка программ на С++ было жалко, то очень часто принималось тупое и эффективное решение: выбывающий мейнфрейм заменялся современным сервером, внутри которого крутился виртуальный двойник того самого мейнфрейма со всеми программами 60-ых годов написания. Как известно, раньше трава была зеленее, тян чаще давали, а программы писались добротно, без всяких там переполняющихся буферов и утечек драгоценной памяти. А раз работает — не трогай. PROFIT. Не совсем… В результате к 2000 году многие весьма известные и уважаемые организации (типа банков и страховых контор) подошли с наличием у них ПО, которое мало того, что поведет себя совершенно непредсказуемо, но и написанного 20 лет назад на непонятных языках, учебники по которым уже давно сдали на макулатуру, а документацию и исходные тексты отдали в музей. Поэтому во второй половине 90-ых наблюдался резкий рост зарплат и вакансий для специалистов, владеющих соответствующими языками. Бородатые гики 60-70-ых, которые к указанному времени не спились и не потеряли квалификации, смогли срубить немало бабла даже в качестве простых программистов.

В этой стране естественный выпил большинства мамонтов отечественного компьютеростроения произошел в начале 90-ых из-за проигрыша зарубежным аналогам в результате естественного отбора. Более того, всеобщее нищебродство оттянуло момент тотальной компьютеризации до того времени, когда 640К памяти уже хватало далеко не всем. Тем не менее банковским ИТшникам пришлось оторваться от сапера, дабы разобраться с ДОСовскими программами, купленными в первой половине 90-ых у благополучно развалившихся наследников советских кооперативов.

Так что несмотря на то, что рядового анонимуса этой страны Y2K касался незначительно (в связи с отсутствием счетов в швейцарских банках), серьезный повод для беспокойства все же был. Но нельзя не признать, что основную часть внимания сабжу обеспечили маркетологи, надеявшиеся поиметь гешефт от продажи программ и оборудования с шильдиком «Y2K compatible».

Y2K в играх [ править ]

В игре Metal Gear Solid 2: Sons of Liberty проблема Y2K была обыграна довольно занятно. Патриоты под видом патчей, решающих эту проблему, подсунули всем программы-цензоры, дабы получить полный контроль над информацией.

В винрарнейшей игре SkiFree начиная ровно с дистанции 2000 метров за тобой начинает гоняться снежный человек.

Информатика 11 класс пробный вариант №14 решу ЕГЭ 2022 задания с ответами

1)На рисунке справа схема дорог Н-ского района изображена в виде графа, в таблице содержатся сведения о длинах этих дорог (в километрах). Так как таблицу и схему рисовали независимо друг от друга, то нумерация населённых пунктов в таблице никак не связана с буквенными обозначениями на графе. Выпишите последовательно, без пробелов и знаков препинания, указанные на графе буквенные обозначения пунктов от П1 до П7: сначала букву, соответствующую П1, затем букву, соответствующую П2, и т. д.

Ответ: ВДБЕАГЖ

2)Логическая функция F задаётся выражением ((x → y) ∨ ¬(z → w)) ∧ ((w → ¬x) ∨ (¬y → z)). На рисунке приведён частично заполненный фрагмент таблицы истинности функции F, содержащий неповторяющиеся строки. Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z, w.

Ответ: yzwx

3)В файле 3-5.xls приведён фрагмент базы фрагмент базы данных «Аудиотека». База данных состоит из четырёх таблиц. Таблица «Альбомы» содержит записи о записанных альбомах, а также информацию о исполнителях. Таблица «Артисты» содержит записи о названии исполнителей. Таблица «Треки» содержит записи о записанных композициях, а также информацию о альбомах и жанрах. Поле Длительность содержит длительность аудиозаписи в миллисекундах, поле Размер содержит размер аудиозаписи в байтах, а поле Стоимость содержит стоимость аудиозаписи в рублях. Таблица «Жанры» содержит данные о названии жанров. На рисунке приведена схема указанной базы данных. Используя информацию из приведённой базы данных, найдите исполнителя с наибольшей суммарной стоимостью. В ответе укажите суммарную стоимость его песен в рублях.

Ответ: 26904

4)По каналу связи передаются сообщения, содержащие только семь букв: А, Б, Й, Л, М, Т, Ю. Для передачи используется двоичный код, удовлетворяющий условию Фано. Кодовые слова для некоторых букв известны: Л – 010, Б – 011, Ю – 10. Какое наименьшее количество двоичных знаков потребуется для кодирования слова АЛТАЙ?

Ответ: 14

5)На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Строится двоичная запись числа N. 2) Затем справа дописываются два разряда: символы 01, если число N чётное, и 10, если нечётное. Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью искомого числа R. Укажите минимальное число R, большее 130, которое может являться результатом работы этого алгоритма. В ответе это число запишите в десятичной системе.

Ответ: 134

6)Определите наименьшее введённое значение переменной s, при котором программа выведет число 115. s = int(input()) n = 11 while s < 224: s = s + 15 n = n + 8 print(n)

Ответ: 29

7)Давным-давно, когда 640 Кбайт хватало «на всё», лучшие компьютеры поддерживали максимальное разрешение 640х480 пикселей. Известно, что каждый пиксель мог быть окрашен в один из 16 цветов. Определите объем памяти видеобуфера (памяти необходимой для хранения одной картинки) в Кбайтах (1 Кбайт = 1024 байта).

Ответ: 150

8)Лиля составляет 5-буквенные слова из букв С, О, Т, К, А, П, Л, З. Слово не должно заканчиваться на гласную и содержать сочетания ЗЛО. Буквы в слове не повторяются. Сколько слов может составить Лиля?

Ответ: 5008

9)Откройте файл электронной таблицы 9-119.xls, содержащей в каждой строке четыре натуральных числа, являющиеся последовательностью длин отрезков ломаной. Выясните, какое количество четверок чисел может являться сторонами четырехугольника. В ответе запишите только число.

Ответ: 4757

10)В файле 10-141.docx приведена книга Н.В. Гоголя «Вечера на хуторе близ Диканьки». Сколько раз слово «небо» (во всех формах единственного и множественного числа) встречается в тексте повести «Страшная месть» (не считая сносок)? Регистр написания слова не имеет значения. В ответе укажите только число.

Ответ: 22

11)При регистрации в компьютерной системе каждому пользователю выдаётся пароль, состоящий из 7 символов и содержащий только символы из 12-буквенного набора А, В, Е, К, М, Н, О, Р, С, Т, У, X. В базе данных для хранения сведений о каждом пользователе отведено одинаковое и минимально возможное целое число байт. При этом используют посимвольное кодирование паролей, все символы кодируются одинаковым и минимально возможным количеством бит. Кроме собственно пароля для каждого пользователя в системе хранятся дополнительные сведения, для чего отведено 15 байт. Определите объём памяти в байтах, необходимый для хранения сведений о 150 пользователях.

Ответ: 2850

12)Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки символов. 1. заменить (v, w) 2. нашлось (v) Первая команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Если цепочки v в строке нет, эта команда не изменяет строку. Вторая команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Дана программа для исполнителя Редактор: НАЧАЛО ПОКА нашлось (900) или нашлось(8000) или нашлось(70) заменить(70, 8) заменить(900, 70) заменить(8000, 900) КОНЕЦ ПОКА КОНЕЦ Известно, что на вход программы поступила строка из 71 символа. Определите минимальное четырехзначное число, которое может являться результатом работы исполнителя.

Ответ: 1008

13)На рисунке – схема дорог, связывающих города А, Б, В, Г, Д, Е, Ж, З, И, К, Л. По каждой дороге можно двигаться только в одном направлении, указанном стрелкой. Сколько существует различных путей, ведущих из города А в город Л и проходящих через город Ж, но НЕ проходящих через город З?

Ответ: 10

14)Значение выражения 61333 – 5∙61215 + 3∙6144 – 86 записали в системе счисления с основанием 6. Найдите сумму цифр получившегося числа и запишите её в ответе в десятичной системе счисления.

Ответ: 1303

15)Элементами множеств А, P и Q являются натуральные числа, причём P= <2, 4, 6, 8, 10, 12, 14, 16, 18, 20>и Q=<5, 10, 15, 20, 25, 30, 35, 40, 45, 50>. Известно, что выражение ((x ∈ A) → (x ∈ P)) ∨ (¬(x ∈ Q) → ¬(x ∈ A)) истинно (т.е. принимает значение 1 при любом значении переменной х. Определите наибольшее возможное количество элементов в множестве A.

Ответ: 18

16)Алгоритм вычисления значения функции F(n), где n – целое число, задан следующими соотношениями: F(n) = 1, при n < 2, F(n) = F(n/3) + 1, когда n ≥ 2 и делится на 3, F(n) = F(n — 2) + 5, когда n ≥ 2 и не делится на 3. Назовите количество значений n на отрезке [1;100000], для которых F(n) равно 55.

Ответ: 7581

17)В файле 17-7.txt содержится последовательность целых чисел. Элементы последовательности могут принимать значения от 0 до 200 включительно. Рассматривается множество элементов последовательности, которые удовлетворяют следующему условию: число в шестнадцатеричной записи оканчивается на 9, но не оканчивается на A9. Найдите количество таких чисел и максимальное из них.

Ответ: 5 57

18)Квадрат разлинован на N×N клеток (1 < N < 20). В левом верхнем углу квадрата стоит Робот. За один ход Робот может переместиться в пределах квадрата на одну клетку вправо, вниз или по диагонали вправо-вниз. Определите минимальную и максимальную сумму чисел в клетках, через которые может пройти Робот при перемещении из левого верхнего угла в правый нижний. В ответе укажите два числа – сначала максимальную сумму, затем минимальную. Исходные данные для Робота записаны в файле 18-101.xls в виде прямоугольной таблицы, каждая ячейка которой соответствует клетке квадрата.

Ответ: 2405 675

22)Ниже записана программа, которая вводит натуральное число x, выполняет преобразования, а затем выводит два числа. Укажите наименьшее возможное значение x, при вводе которого программа выведет числа 2 и 15. x = int(input()) k = x % 6 a = 0 b = 0 while x > 0: d = x % 6 if d == k: a += 1 b += d x //= 6 print(a, b)

Ответ: 395

23)Исполнитель Нолик преобразует число, записанное на экране в троичной системе счисления. У исполнителя есть две команды, которым присвоены номера: 1. Вычесть 2 2. Обнулить младший разряд Первая команда уменьшает число на 2. Вторая команда обнуляет ненулевой младший разряд троичной записи числа. (Например, при выполнении этой команды число 21 преобразуется в число 20. Если в младшем разряде находится 0, то данная команда не выполняется). Сколько существует программ, которые троичное число 212, преобразуют в троичное число 10?

Ответ: 86

24)Текстовый файл 24-164.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита (ABC…Z). Текст разбит на строки различной длины. В строках, содержащих менее 15 букв G, нужно определить и вывести максимальное расстояние между одинаковыми буквами в одной строке. Пример. Исходный файл: VOVA ZAGALG QRAGQT В этом примере во всех строках меньше 15 букв G. Самое большое расстояние между одинаковыми буквами – в третьей строке между буквами Q, расположенными в строке на 1-й и 5-й позициях. В ответе для данного примера нужно вывести число 4.

Ответ: 916

25)Найдите все натуральные числа, N, принадлежащие отрезку [100 000 000; 300 000 000], которые можно представить в виде N = 2m•7n, где m – нечётное число, n – чётное число. В ответе запишите все найденные числа в порядке возрастания, а справа от каждого числа – сумму m+n.

27)Набор данных состоит из пар натуральных чисел. Необходимо выбрать из набора некоторые пары так, чтобы первое число в каждой выбранной паре было нечётным, сумма бо́льших чисел во всех выбранных парах была нечётной, а сумма меньших – чётной. Какую наибольшую сумму чисел во всех выбранных парах можно при этом получить? Входные данные. Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 100000). Каждая из следующих N строк содержит два натуральных числа, не превышающих 10000.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *