Конфиденциальная информация WindowsВозможности ошибок

Рэймонд Чен (Raymond Chen)

В операционной системе Windows 95 Можно перейти на страницу «Устранение неполадок» и установить флажок «синхронной записи содержимого буфера на диск». Но знаете ли вы, для чего предназначен этот флажок? Или зачем он необходим?

Обычным поведением функции Commit операционной системы MS-DOS® являлось сохранение всех незаписанных данных в определенный файл на диске и последующее ожидание подтверждения записи данных для продолжения. При установленном флажке «синхронной записи содержимого буфера на диск» вызов возвращался немедленно без ожидания записи данных. Конечно, это являлось нарушением функциональной спецификации, в соответствии с которым вызов возвращался только после записи данных. Это увеличивало опасность того, что в статье базы знаний 139669 было мягко названо «проблемами целостности файлов», поскольку программа, отправившая запрос на сброс, предполагала наличие данных на диске, в то время как их там не было.

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

Почему, несмотря на столь ужасные последствия, этот флажок был доступен? Причина: ошибка Windows® 3.11.

Рис. 1 Разрешение ошибочного поведения в Windows Server 2003

Рис. 1** Разрешение ошибочного поведения в Windows Server 2003 **(Щелкните изображение, чтобы увеличить его)

В операционной системе Windows 3.11 появился «32-разрядный доступ к файлам», который являлся 32-разрядной реализацией низкоуровневого интерфейса ввода/вывода файлов. Но в реализованной функции Commit содержалась ошибка игнорирования запросов на сброс буферов файлов. При запуске программы, сбросившей буферы файлов, в операционной системе Windows 3.11 запрос на сброс не действовал. В результате при отключении питания в неподходящий момент происходило повреждение базы данных.

В операционной системе Windows 95 эта ошибка была исправлена, но начали появляться новые отчеты об ошибках. Затем эта ошибка повторилась в другой программе базы данных. Что происходило?

Оказалось, что эти программы постоянно осуществляли вызовы на сброс. Программисты заметили, что запросы на вызовы вWindows 3.11 выполнялись довольно быстро, поэтому они свободно использовали их в своих программах. Запись байта, сброс. Запись строки, сброс. Поскольку сбросы осуществлялись так быстро, приложение могло сохранять данные на диск после каждой операции без заметной потери производительности. Но после исправления этой ошибки в Windows 95 работа таких программ сильно замедлилась, поскольку вызовы функции Commit неожиданно стали фактически выполняться.

Конечно, если бы отдел, занимающийся файловой системой, ничего не сделал, эти программы продолжали бы работать так же медленно, а пользователи решили бы, что проблема заключается в Windows 95. «Windows 95 работает ужасно», - сказали бы они другим пользователям. С другой стороны, при возврате поведения старой файловой системы Windows 3.11 снова могла появиться ошибка, приводящая к ужасным «проблемам целостности файлов».

В итоге было найдено решение, оставить эту ошибку исправленной, но добавить флажок, хоть и на страницу «Устранение неисправностей», возвращающий поведение Windows 3.11 для пользователей, использующих программы, в которых происходили сбои из-за исправления ошибки.

Оказалось, что история повторилась. В Windows Server® 2003 программисты, занимающиеся операциями ввода/вывода, обнаружили ошибку, при которой запросы с тегом Forced Unit Access (FUA) теряли этот тег и выполнялись как обычные запросы ввода/вывода. Это оказалось современной версией игнорирования запросов на сброс! Ошибка была исправлена, но была предусмотрена возможность возврата к старому поведению с возникновением ошибки. Версия этого флажка в Windows Server 2003 называется «Выполнить повышенную производительность», но вы то знаете, что на самом деле это означает «Возврат старого поведения с ошибкой».

Рэймонд Чен (Raymond Chen) на своем веб-узле The Old New Thing и в книге с таким же названием (издание Addison-Wesley, 2007 г.) рассказывает об истории развития Windows и касается вопросов программирования в среде Win32. Он слишком законопослушный.

© 2008 Корпорация Майкрософт и компания CMP Media, LLC. Все права защищены; полное или частичное воспроизведение без разрешения запрещено.