У меня была очень странная проблема и решение на одной из наших рабочих станций Windows 8.1, и я не могу понять, как мое решение могло бы решить эту проблему.

Это рабочая станция:

  • Windows 8.1 x64
  • AMD Athlon x64 x2 5200+ 2,7 ГГц
  • 4 ГБ оперативной памяти DDR2
  • Материнская плата NG1DB-M25 Biostar
  • 1 ТБ Western Digital HDD
  • DVD-привод (не определенная марка)

Как вы можете видеть, это довольно старое оборудование, за исключением жесткого диска и DVD-привода (возможно, старое, но до недавнего времени оно не использовалось, я просто вставил его).

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

Я был занят вещами с более высоким приоритетом весь день, поэтому я просто оставил его включенным, и на следующий день он запустился нормально, но затем, когда я попытался открыть обновление Windows, окна открылись, но никакая информация не загрузилась и не загрузилась. это зависало, пока я не перезапустил проводник. Также была проблема в другой программе, которая приводила к зависанию этой программы.

Сначала я попробовал DISM.exe /Online /Cleanup-image /Restorehealth а затем SFC. Ни одна из них не сработала, поэтому я просто решил пойти дальше и переформатировать. Я поместил DVD-диск, и когда я попытался его запустить, Windows просто показала экран с ошибкой (сейчас я не помню ни кода, ни точной формулировки), что возникла какая-то проблема из-за съемного хранилища. USB-накопителей нет, поэтому я решил, что это связано с DVD-дисководом. Я отключил кабель SATA Data на нем, и теперь рабочая станция работает отлично, нет необходимости переформатировать или что-то еще.

Я не могу сложить, как это решило проблему. До конца ни одна из проблем не могла быть связана с приводами DVD, так как к ней никогда не было доступа. Кто-нибудь знает какую-либо причину, почему замена кабеля SATA исправит все это, или это совпадение и что-то еще, возможно, произошло?

1 ответ1

0

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

Программное обеспечение пользователя> Ядро> Уровень аппаратной абстракции> Оборудование

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

Ядро имеет определенные ограничения для "гарантии" стабильности, такие как ограниченная возможность повторного входа, безопасность потоков, ограничения ресурсов и так далее. В частности, большинство аппаратных средств не имеют концепции совместного использования; это обобщается на более высоком уровне через драйверы HAL или ядра.

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

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

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

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

Многие программы в Windows в основном зацикливаются, например:

while(GetMessage(&msg, hWnd, NULL, NULL)) {
    DispatchMessage(&msg);
}

Как вы можете догадаться, есть только одна нить. Как только он пытается прочитать с диска, который завис, он не может восстановиться, пока диск в конечном счете не истечет. Если это не так, эта программа зависит от API операционной системы. Даже если бы он был многопоточным, поток чтения с диска стал бы заблокированным, хотя поток пользовательского интерфейса мог бы обнаружить это и восстановить / прервать.

Чтобы усугубить проблему, многие вызовы API, такие как те, которые выделяют память, открывают диски или файлы и т.д., Являются блокирующими вызовами. Они заставляют текущий поток ждать неопределенно (если он не запрашивает определенное значение тайм-аута), пока ОС не сможет выполнить запрос или прервать его из-за тайм-аута. Большинство программ не предполагают, что ОС займет очень много времени, и поэтому никогда не указывают время ожидания. Эти программы никогда не восстановятся, если диск не отвечает.

Для программы, которая «никогда не обращается к неисправному диску», это не обязательно. Все, что нужно сделать, это вызвать функцию, которая в данный момент заблокирована неисправным диском. Например, если OpenFile был вызван на неисправном приводе DVD, другие запросы к файлам могут зависать до истечения времени ожидания привода DVD, даже если они читают только с системного диска.

Может быть, программа вызывает GetOpenFileName, который показывает отображаемое в ОС диалоговое окно, которое принимает управление потоком до его возврата. В этом окне перечислены все диски в системе путем перечисления списка дисков. Если API зависает на плохом диске, конечный результат остается тем же: диалоговое окно останавливается, останавливая все приложение, ожидая, когда этот диск станет доступным / свободным.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .