0,0
рейтинг
24 августа 2013 в 13:04

Почему Windows 95 подвисала при форматировании дискеты? перевод

Рэймонд Чен отвечает на известную шутку:
— Папа, покажи, какая винда многозадачная!
— Сейчас, сынок, только дискету доформатирую...

Кто же целыми днями форматирует дискеты? Оказывается, многие гики только этим и заняты. (Вообще-то, можно покупать дискеты уже отформатированными, только тссс!) Но почему Windows 95 подвисала при форматировании дискеты?

Всё дело в совместимости с MS-DOS.

Как мы видели немного раньше, MS-DOS в Windows 95 выступала как слой для старых 16-битных драйверов. Несмотря на то, что в итоге операции ввода-вывода обрабатывались 32-битной файловой подсистемой, все они проходили через 16-битный код, чтобы 16-битные драйверы, TSR и подобные обработчики видели «нормальные 16-битные операции» и работали в привычном им окружении.

В 16-битном мире форматированием занималось программное прерывание 13h, и многие программы использовали этот факт, перехватывая прерывание так, чтобы получать управление при форматировании дискеты. Так делали некоторые TSR, программы для бэкапов (программы для бэкапов, разработанные для Windows 3.0, включали в себя 32-битные драйверы под Windows 3.x, называемые VxD, для отслеживания операций с дискетами). Но это объясняет не всё. В конце концов, Windows 95 прогоняла весь дисковый ввод-вывод, а не только форматирование дискет, через 16-битный код. Почему же форматирование дискет так существенно влияло на систему?

Как я отметил в статье по ссылке выше, 32-битная файловая подсистема тщательно подделывала свидетельства, заставляя 16-битный код верить в то, что за всё ответственна MS-DOS, хотя это и было неправдой. Любой, кто занимался программированием TSR (ого, определение любой, кто занимался программированием TSR когда-то охватывало массу людей, а сегодня описывает несколько десятков бывалых программистов, большинство из которых хотели бы забыть это как страшный сон), знает всё про флаг INDOS. MS-DOS устанавливала этот флаг на время обработки запроса ввода-вывода. Поскольку MS-DOS не допускала вложенного вызова самой себя, TSR должны были тщательно отслеживать этот флаг, чтобы знать, безопасно ли обращаться к MS-DOS. Флаг INDOS был 16-битным отражением сущности, которую 32-битное ядро называло Главной Критической Секцией; 32-битное ядро держало главную критическую секцию и флаг INDOS в одинаковом состоянии, чтобы не вызывать один и тот же драйвер MS-DOS или TSR параллельно несколько раз. Когда одна виртуальная машина захватывала главную критическую секцию, любая другая виртуальная машина, попытавшаяся сделать то же самое, была вынуждена ждать, пока первая виртуальная машина не отпустит секцию. Таким образом, параллельные вызовы драйвера или TSR блокировались.

Как я уже отметил, в 16-битном мире собственно форматированием занималась ROM BIOS, и в целях совместимости форматирование дискет по-прежнему посылалось через 16-битное программное прерывание 13h, чтобы все TSR и драйверы могли увидеть происходящее. Многие BIOSы безумны, так что при запросе на форматирование дискеты 32-битное ядро проделывало большую дополнительную работу, чтобы BIOS получала именно то окружение, которого хотела. В частности, порты аппаратного таймера переходили от менеджера виртуальных машин под полный контроль BIOS, чтобы не влиять на работу циклов, используемых BIOS для задержек при форматировании, для которых критично время выполнения.

Итак, посчитаем итоговый урон. Пока дискета форматируется, таймер развиртуализован для точности циклов, используемых BIOS для задержек. Только виртуальная машина, форматирующая дискету, получает сигналы от таймера; остальным приходится ждать. Отсутствие сигналов таймера означает, что никто не вызывает планировщик с сообщением «пора дать поработать другому потоку». Далее, главная критическая секция заблокирована на время операции, что означает, что никакой другой поток не может начинать операции ввода-вывода. Всё это ещё усугубляется тем, что дискета — медленное устройство, и любая операция, ожидающая окончания работы с дискетой, вынуждена остановиться и подождать несколько секунд.

Хорошо хоть, что дискеты форматируются по дорожке за раз, и система блокируется не на всё время форматирования. BIOS подаётся команда отформатировать одну дорожку, и по окончании процесса таймер возвращается в нормальное состояние (что позволяет планировщику заняться своим делом), главная критическая секция разблокируется (и ожидающие операции ввода-вывода получают шанс на выполнение). Но потом возвращается программа FORMAT.COM и форматирует следующую дорожку, и система возвращается назад в состояние подождём, не будем отвлекать BIOS от работы.

Аналогично случаю 32-битной файловой подсистемы, существовал 32-битный драйвер дискет, пытавшийся перехватить операции форматирования в самом конце. Если это получалось, драйвер делал работу по форматированию одной дорожки вместо BIOS. Доблестная попытка, но сколь бы высокопроизводительным ни был драйвер, это не имеет значения; скорость форматирования дорожки ограничена в основном механикой дискеты.

Конечно, если бы Windows 95 не должна была поддерживать совместимость с 16-битными драйверами, TSR и сомнительными BIOS, она могла бы направлять запросы форматирования прямо в 32-битный драйвер дискет, не отвлекаясь на абсурдные операции с таймером и главной критической секцией. Но вообще-то у нас уже была система, отказавшаяся от совместимости с 16-битными драйверами, TSR, 16-битными Windows-программами с собственными 32-битными VxD-драйверами и сомнительными BIOS. Она называлась Windows NT.

Если вы хотели Windows NT, вы знали, где её найти.
Перевод: Raymond Chen
Евгений Гречников @grechnik
карма
79,0
рейтинг 0,0

Похожие публикации

Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (92)

  • +1
    По-моему с тех времен процесс форматирования не сильно изменился. Даже Windows 7 ощутимо притормаживает при работе с дискетами. Или это мне кажется уже?
    • +79
      Непривычно видеть «Windows 7» и «дискета» в одном предложении.
      • +4
        Вы не поверите. Как-то полдня искал в квартире дискету, чтобы просто её отформатировать и вспомнить как оно жужжит во время форматирования. Дискета оказалась 12-ти летней давности и с запоротой нулевой дорожкой.
        • +1
          Настальджи…
        • +7
          Удивительно, что в той же квартире нашёл рабочий дисковод… :)
          • +2
            У меня и 5-и дюймовый есть ;-)
            • 0
              А 8ми дюймвого ни у кого нет? :) У меня была пара таких дискет
              • 0
                Я искал 7 лет назад, находились только дискеты :-)
            • 0
              а 8"? тяжел тот ящичек, конечно…
          • –1
            Удивительно, что его есть куда подключить. Материнки уже давно от IDE отказались.
            • 0
              У меня один комп до сих пор с Windows XP + Pentium IV со всеми вытекающими, включая IDE и т.д.
              Даж SATA нету :-(
            • 0
              Ну, насколькто мне помнится, пятидюймовый флопы подключаются не по IDE совсем =)
              MFM вроде, но могу и ошибаться.
              • +1
                Может быть, пятидюймовками с прошлого века не пользовался.
        • +1
          А еще нулевую дорожку можно было попробовать восстановить… Если не ошибаюсь из Norton Utils программа Calibrate. Вот тогда жужжало не по детски )
          • 0
            Гораздо лучше Mformat — утилка могла обойти битые сектора
        • 0
      • +6
        Попробуйте донести весь свет прогресса производителям серверного оборудования, которые продолжают выпускать прошивки для биосов, контроллеров и всяких проприетарных микросхем в виде бинарника и утилиты для прошивки под DOS. А то и просто образа дискеты.
        Я на любой админской должности держал в ящике под замком USB дисковод. Нужен он был ну раз в год от силы, но уж когда нужен, то заменить его было абсолютно нечем.
        За дисковод этот приходилось бодаться обычно с бухгалтером, которая владела порождением сумеречных гениев программирования именуемым «клиент банк с крипто-ключом». На компромис я не шел и покупал второй дисковод.
        • 0
          А вот что-то такое не подошло бы?

          jimwarholic.com/2009/04/fdd-floppy-disk-drive-emulators.php
        • +2
          А разве нельзя с флэшки загрузиться вместо дискеты? Я на серверах обычно так делаю.
        • 0
          Это для особых эстетов, в большинстве случаев возможна прошивка через BMC, ОС или EFI Shell.
        • 0
          pxe + bootp + tftp + memdisk cпасет админа от дискет :)
          • 0
            проще говоря, тупо один dnsmasq — я его за тем на ноуте и держу, что если нужно — можно всегда загрузить рескью/parted или тупо заинсталлить систему будет кому надо.

            всё никак руки не дотянутся там же win лечилку разместить
      • +9
        Более того, в Win7 осталась поддержка пятидюймовых дискет, и даже новая иконка для привода была нарисована.
        • +5
          Гм, меня этот факт удивил больше, чем пост. Ладно поддержку не стали убирать, но новая иконка?..
          • 0
            По-моему, для них это просто очередная иконка. Вы думаете, они выборочно смотрели, какие иконки перерисовывать, а какие не надо?
            • +1
              Ну, здравый смысл-то никто не отменял. Да и, например, диалог установки шрифтов тянулся еще эдак с 3.1 аж до Висты, и только в Вин 7 его удосужились обновить.
              • 0
                В Windows вообще к обратной совместимости очень внимательно относятся.
                • +1
                  К обратной совместимости пользовательского интерфейса? ) Конкретно этот диалог даже в ХР вызывал недоумение тем, что не был похож абсолютно ни на что.
  • –18
    — Папа, а что такое многозадачность в Windows 95?
    — Подожди, сейчас дискету доформатирую и покажу.
    • +30
      Э… вроде это было в эпиграф даже вынесено. :)
      • +17
        Это он «на бис» :)
      • +5
        В эпиграфе мутированный анекдот, а этот — настоящий!
  • +4
    А почему у меня Win7 периодически начинает жутко хрустеть винтом и при этом подвисает абсоютно все, даже мышиный курсор? Так продолжается секунд 20-30. Потом все ок (и да, это и на чистой системе происходит, на новом ноуте). Каждый раз как такое происходит, вспоминаю Win9x/Me как там тоже все подвисало если например плохо читающийся CD вставить, или дискетку.
    • +3
      первое что приходит в голову
      1. Мало памяти, своп читается туда-сюда
      2. Агрессивное создание точки восстановления
      • +1
        Памяти 8 гиг. И это все случается когда свободно ОЗУ еще гиг 5, то есть практически ничего не запущено.

        Вопрос не в том почему винда так насилует винт, а в том почему при интенсивной работе с винтом она ТАК дико тормозит. Я ничего подобного не видел со времен WinDOS.
        • 0
          На рабочей машине такая же фигня, но больше нигде такого не встречал
        • 0
          Загляните в журнал событий. Почти наверняка будут ошибки доступа к устройству.
          • 0
            Заглянул. Журнал событий оборудования вообще пуст. В сводке административных событий в категории ошибок тоже нет ничего похожего.
    • +3
      Битый сектор на винте? Драйвер пытается его прочесть, не получается, он пытается в другом, более тяжёлом для системы режиме. Или просто кривой драйвер. В любом случае, подвесить даже мышиный курсор может только какой-то драйвер.
      • 0
        Был бы битый сектор — SMART бы это показал. Ан нет. Причем не я один такой. У некоторых с семеркой ровно то же самое.
        • +2
          Битые сектора помечаются только при записи в них, а при чтении происходит описанное вами.
          • 0
            Ну, это легко проверить — просканирую диск. скажу есть ли там что-то битое (я сомневаюсь что на новом ноуте винт в badblock'aх).
        • 0
          Подтверждаю, у меня то же самое было. Как я понимаю, какая-то странная комбинация дровлей материнки и винта.
          На Вин8 прошло.
      • 0
        В любом случае, подвесить даже мышиный курсор может только какой-то драйвер.
        У меня с этим отлично справляется Firefox при первой загрузке некоторых сайтов — вся система замирает на несколько секунд, мышиный курсор не движется, пользователь (я) в ярости.
        Комп современный, Win7, 8 GB RAM, четырёхъядерный интеловский проц.
        Сейчас вот подумал, что это может и не браузер виноват, а антивирус от Семантик.
        • 0
          аналогично… первая загрузка летна.ру в Firefox тормозит всю систему на секунд 30… потом всё нормально. при этом винт не шуршит, но светодиод активности носителей бьется в истерике. «антивирус» от дяди жени…
        • +2
          Тормоза может вызывать Flash Player. Ещё похожее было на новых драйверах NVIDIA, решилось откатом на старую версию.
        • 0
          Symantec очень любит конкурировать за жесткий диск :-)
          Со всеми вытекающими.
          Программы, интенсивно работающие с диском в фоне, отдыхают.
    • 0
      можно открыть ресурс менеджер (или как его там — вызывается из таск менеджера по кнопке ресурсы), там можно посмотреть iotop
    • 0
      Сколько памяти? Может свопится?
    • +1
      Сидюк-то нормально работает? А то был случай — в общаге у одного нищеброда был ноут где-то пятилетней давности, из ломбарда, побитый. Так же зависал время от времени почти на полминуты намертво, со звуками остановки винта. Думал, проблемы с винтом — всё чисто. Программно тоже никто не долбил. А оказалось, всё дело в дохлом сидюке. Система за каким-то макаром к нему обращалась и зависла в попытке связаться. Проблема решилась его отключением в «Диспетчере устройств».
      • 0
        С сидюком все ок. Ноут новый.
      • +4
        А, да. Были такие заморочки с IDE. Нужно было сидюк и винт вешать на разные порты, а не master/slave на одном.
    • 0
      Это у вас всё на одном ноуте?
      У меня ПК так глючил, в итоге я нашёл вздутый кондер на плате =)
      • 0
        Если б дело было в конденсаторах, то этот эффект проявлялся бы не только в винде, но и, например, в линуксе. Но в линуксе все ок.
    • 0
      У меня похожая проблема была из-за корявых первых серий материнок для i7. Там контроллеры диска вроде были глючными.
    • +4
      12309
      • 0
        Здорово, но при чем тут линукс?
        • 0
          Потому, что там уже пофиксили)
          • +4
            Что, опять? :-)
            • 0
              Последний комментарий оттуда, хорошо описывает, что я чувствую в линуксе когда начинается своп:
              Swap in linux is something fantastik. Fills like schedule is locked, when ram-page is writing in swap. We expected for lags in program, but lags is global! That`s awesome! :)
        • +1
          Мигрирует, вестимо:)
    • 0
      Вы все таки проверьте системный диск на жестком диске. У меня была очень похожая вещь. Я загружался из гибернации и потому не мог понять в чем проблема, а при обычной загрузке система очень долго загружалась. Оказалось через три года Samsung таки начал «сыпаться». Заменил на WD и перенес OEM систему на новый диск. Проблемы исчезли.
      • 0
        Спасибо. проверю. Но система грузится быстро.
        • 0
          Гадаю посимптомам что проблема в intel sata achi driver. Известный глюк, с которым часто и много трахаются владельцы ноутов. Проблема связана с тем, что диск засыпает прямо во время работы и ему норм и каждый разк когда он уснет система ждет отклика. Для начала могу предложить изменить время засыпания харда на 999999. Если не поможет, то удалить драйвер вообще. Если не поможет обновлять.
          • 0
            Или окончательно снести винду :-) В линуксе вроде бы проблемы такой нет.

            Есть предложение как подтвердить это предположение?
    • +2
      Помню раньше по хрусту винта при движении мышки определял, зависла винда или нет. Потом винты пошли не такие шумные и приходилось по Num Lock опрределять.
  • 0
    Как я понял, «зависала при форматировании через DOS»… Ну да, делали мы дискеты с интерливингом, которые на 9x работали быстрее, но на NT почему-то не читались — например, через Floppy Format или DOS Navigator.

    А сейчас у меня на дешёвой «офисной» матплате флоповод вообще не припаян. Место есть, разъёма нет. Последний раз флопик использовал ~2009, чтобы перешивать BIOS.
  • +3
    Ну 95 — это уже преданья старины глубокой, но со всех сторон 32-х битная ХР вела себя порой весьма задумчиво при вставке CD-R/CD-RW диска в привод. [И да, я знаю, чем дискета отличается от CD]
    • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    И Это стало самой распространенной ОС в мире. Матерь Божья, что же мы наделали…
    • +4
      Windows NT же не на DOS работает, так что этого жуткого наследия больше нет.
    • +5
      Как я понял, «зависает в DOS» — ведь в Windows была своя утилита форматирования, и тормозов в ней я не видел.

      Как ни странно, Win9x стал верным ходом. Отрежь совместимость — отрежешь старый софт! А разных досявых АРМов и АСУ ТП, естественно, наклепали много. А игры под Windows обошли таковые под DOS ~1997, когда в видеоплаты вернулись аппаратные блиттеры и появился DirectX, способный эти блиттеры задействовать. Да, это временный ход и все это понимают, но ход правильный. Единственное, что хотелось бы в Windows 95 сейчас, в ретроспективе,— это зачаточное разграничение доступа. Не для того, чтобы разделять админов и пользователей, а для того, чтобы подготовить программистов к новым ограничениям NT.
    • +2
      Если бы не стало — вы бы сейчас платили денежки не MS а IBM и HP и о домашнем компьютере многие бы даже и не мечтали. Именно благодаря Винде комп есть в каждом доме. Так же как и благодаря IE6 и Outlook Web Access вы можете использовать AJAX. А ошибаются все. Вы бы Mandrake 5.1 поглядели в 98 году… Про Apple вообще молчу…
  • 0
    Удивительно, но сторонние программы форматирования тормозили существенно меньше. Впрочем, format вообще был редкостно кривой программой, не способной даже форматировать сколь-нибудь повреждённые дискеты (знаменитое сообщение об испорченной нулевой дорожке. И даже если оно почему-либо не появлялось, format никогда не помечал как bad сбоящие сектора, которые влёгкую обнаруживались ScanDisk'ом).
    А вот, например, fformat от Shamarokov'а мог не только работать под Windows без тормозов, но даже форматировать несколько дискет одновременно (при наличии нескольких дисководов), форматировать битые дискеты, помечая сбойные кластеры, форматировать дискеты с нестандартной ёмкостью и т.д. Но больше всего гикам нравился тот весёленький текстовый UI, который выдавали при загрузке отформаченные им дискеты вместо унылого Microsoft'ного «non-system disk».
  • НЛО прилетело и опубликовало эту надпись здесь
    • +5
      Отмечаем день рождения. Кто-то начал уже вчера.
  • +19
    Помню как боялся случайно нажать на диск А и потом ждать две минуты пока Win не поймёт что дискеты в нём нет.
  • –4
    OS/2 forever! Это во-первых. Во-вторых я писал много TSR и я никогда в жизни не слышал про «флаг INDOS». В третьих MS-DOS позволяла вызов самой себя и вообще черт знает что еще. В четвертых — какая нахрен разница 16-битный или 32-битный код занимается форматированием. Взгляните на любой драйвер флоповода — там главное на размерность команд, а ввод/вывод из портов (in/out). А 32-битных портов у нас (на PC) еще вроде нет. Короче статья — херня имхо.
  • –1
    Вот тоже, году так в 2002 развлекался досовскими резидентами, но флага такого в упор не помню.
    • +2
      http://cs.smith.edu/~thiebaut/ArtOfAssembly/CH18/CH18-3.html, например.
      Функция 34h прерывания 21h возвращает указатель на флаг InDOS.

      Если резиденту не нужно вызывать функции DOS (например, он только делает вывод непосредственно в видеопамять), то про флаг InDOS тоже ничего знать не нужно.

      Обработчик прерываний 21h (а также 25h и 26h) в MS-DOS первым делом переключается на свой собственный стек (если не считать немногочисленных специальных функций типа Get PSP). (Точнее, там есть три стека под разные функции.) Если TSR активируется, например, по нажатию на клавишу, пользователь работает с каким-то приложением, которое как раз в этот момент решило прочитать какой-нибудь файл, и обработчик нажатия на клавишу в TSR вызывает DOS с целью прочитать свой файл, то DOS второй раз переключится на свой стек, затрёт старые данные, отработает запрос TSR, но возврат из TSR произойдёт в никуда (в затёртый стек).
      • 0
        Вона как, ну я из резидента в досе не работал, сразу в видео память гадил. Всякие лулзы выводил на экран по нажатию кнопочек, чем немало доставлял нашим лаборантам в ВЦ, которых это приводило в шок :)
  • 0
    У меня был в 1999м году комп корейской сборки (Daewoo), предметом гордости которого было то, что Win95/Win98 на нем не замирала как на всех остальных знакомых мне тогда компах, а под Win98 даже свободно можно было слушать MP3 файлы. Комп был на PII-400. Друзья приходили убедиться, что это и правда так :)
    • 0
      Win98 даже свободно можно было слушать MP3 файлы. Комп был на PII-400.

      Ээ, «даже»? MP3-файлы, пусть в моно, но крутились даже на 486. А Pll-400 в 99 году был очень мощной машиной.
      • 0
        Во время форматирования дискет ;)
        • 0
          Это хорошая звуковуха, с поддержкой DMA.
          сейчас всё меньше таких…
          • 0
            Ага. Yamaha с расширенным набором инструментов. Распаяна на матери была. Кстати, Midi инструменты у нее тоже отличные были, хотя загрузку банков сэмплов не поддерживала.
  • 0
    Удивительно, но даже в Windows 8 винда по-умолчанию пытается найти драйвер именно на диске A:.
    • 0
      Забыли, видимо :-)
      Или по-привычке пропустили.
      • 0
        Я склоняюсь к тому, что эта ветка поиска драйверов тянется с древних версий NT и не переписывалась.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.