Рэймонд Чен отвечает на известную шутку: — Папа, покажи мне, какая в Windows многозадачность! - Сейчас, сынок, я просто отформатирую дискету.Теги: #История ИТ #дискеты #windows 95Кто целый день форматирует дискеты? Оказывается, многие гики именно так и делают. (Вообще-то можно купить уже отформатированные дискеты, но тсс!) Но почему Windows 95 зависала при форматировании дискеты? Все дело в совместимости с MS-DOS. Как мы видели немного раньше MS-DOS в Windows 95 выступала в качестве прослойки для старых 16-битных драйверов.
Несмотря на то, что операции ввода-вывода в конечном итоге обрабатывались 32-битной файловой подсистемой, все они проходили через 16-битный код, поэтому 16-битные драйверы ТСР и такие обработчики видели «нормальные 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 возвращается и форматирует следующий трек, и система возвращается в режим подождем, не будем отвлекать биос от работы .
Как и в случае с 32-битной файловой подсистемой, существовал 32-битный драйвер гибких дисков, который пытался в самом конце перехватить операции форматирования.
Если это сработало, значит, работу по форматированию одной дорожки вместо BIOS выполнял драйвер.
Отважная попытка, но каким бы производительным ни был драйвер, это не имеет значения; скорость форматирования треков ограничена в основном механикой дискеты.
Конечно, если бы Windows 95 не приходилось поддерживать совместимость с 16-битными драйверами, TSR и сомнительными BIOS, она могла бы направлять запросы форматирования непосредственно к 32-битному драйверу гибких дисков, не сталкиваясь с абсурдными операциями с таймером и основными критическими секциями.
.
Но на самом деле у нас уже была система, отказывавшаяся от совместимости с 16-битными драйверами, TSR, 16-битными программами Windows со своими 32-битными драйверами VxD и сомнительным BIOS. Его называли Windows НТ .
Если вам нужна была Windows NT, вы знали, где ее найти.
-
Mp3-Файл "Protect" На Amazon.com
19 Oct, 24 -
Рефлексивная Музыкальная Ловушка 2
19 Oct, 24