Зависание

Зависа́ние — компьютерное явление, при котором одна или несколько программ или вся операционная система перестают реагировать на действия пользователя, или начинают без остановки выполнять одну и ту же (не обязательно полезную или содержательную) операцию, не реагируя на сообщения от других программ. В этот момент изображение, выводимое программой на монитор (если оно есть) может застыть, в отличие от ошибки исполнения, при которой на экран выдаётся сообщение.

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

Многозадачность 
В многозадачной операционной системе возможно зависание отдельного процесса или потока, например, блокировка ресурса или попадание в бесконечный цикл. В кооперативной многозадачной системе любой поток, который зависает, но не отдаёт управление, приведёт к зависанию системы, поскольку он не позволит другим потокам работать.

Напротив, современные операционные системы в основном используют упреждающую многозадачность, такие как Windows 2000 и её преемники, а также Linux и macOS от Apple Inc. В этих случаях зависание одного потока не обязательно приведет к зависанию системы, поскольку операционная система вытеснит его, когда истечёт его временной интервал, позволяя запустить другой поток. Если поток действительно зависает, планировщик может переключиться на другую группу взаимозависимых задач, чтобы все процессы не зависали. Однако застрявший поток всё равно будет потреблять ресурсы: по крайней мере, запись в расписании, и если он запущен (например, застрял в бесконечном цикле), он будет потреблять процессорные циклы и мощность, когда он запланирован, замедляя работу системы, хотя и не приводя к зависанию системы в целом. Перемещение по окну поверх зависшей программы во время зависания может привести к перерисовке следа окна.

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

Классификация и виды зависаний 
По масштабности:

 Зависания компьютера/операционной системы в целом
 Зависания отдельного приложения

По повторяемости:

 Стабильные — можно выявить и повторить условия, при которых происходит зависание
 Произвольные — неоднократные зависания, для которых выявить зависимость от внешних факторов или действия пользователей не удаётся
 Разовые — случайное зависание, которое больше не повторяется

Причины зависания

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

Аппаратные 
 ошибки в драйверах
 нарушение температурного режима
 механические повреждения (разрывы проводов, трещины, вздутые конденсаторы и пр.)
 химические повреждения
 некорректное напряжение, подаваемое на компьютер или его элементы
 дефекты поверхности в жёстких дисках
 ошибки при передачи данных по кабелям (в частности от накопителей) из-за электрических помех или плохих контактах
Иногда может показаться, что компьютер зависает, хотя на самом деле он просто работает очень медленно или выполняет очень длительную операцию. Это может быть вызвано слишком большим количеством программ, запущенных одновременно, недостатком памяти (ОЗУ) или фрагментацией памяти, медленным доступом к оборудованию (особенно к удаленным устройствам), медленными системными API и т. д. Это также может быть вызвано скрытыми программами, которые были установлены тайно, такими как шпионские программы.

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

Современные операционные системы предоставляют механизм для завершения зависших процессов, например, с помощью команды kill в Unix или с помощью графических средств, таких как кнопка «Завершить задачу» диспетчера задач в Windows (выберите конкретный процесс в списке и нажмите «Завершить задачу»). Windows добавляет текст «(Не отвечает)» к заголовку окна. Начиная с Windows Vista, прозрачный белый слой будет покрывать содержимое окна при попытке взаимодействия с пользователем, чтобы было ясно, что программа не реагирует (при этом программа не обязательно зависла, возможно идут длительные вычисления или ожидается ответ от баз данных/сетевых ресурсов и прочее).

В старых системах, таких как те, которые работают под управлением MS-DOS, ранних версий Windows или классической Mac OS, часто требовалась полная перезагрузка в случае зависания.

Во многих случаях зависание программы приводит к потере всех несохранённых данных в программе, хотя некоторые программы пытаются предотвратить это путём механизма автосохранения документов.

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

Продолжить работу программы можно только выгрузив её из памяти и запустив на исполнение снова. В большинстве современных операционных систем предусмотрена возможность прерывания исполнения программ, например — команда kill и различные интерфейсы к ней в системах GNU/Linux, или диспетчер задач, либо консольная команда taskkill в Microsoft Windows. В случае полного зависания ОС, когда она не реагирует на ввод клавиатуры или мыши, работу можно продолжить только после полной перезагрузки операционной системы, либо использования Magic SysRq в Linux (REISUB).

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

См. также 
 Экран смерти
 Linux oops

Примечания

Литература 
 
Программистский сленг
Ошибки программирования
Компьютерная терминология