В вычислительной технике зависание или заморозка происходит, когда процесс или система перестают реагировать на ввод . Типичным примером является ситуация, когда графический пользовательский интерфейс компьютера (например, Microsoft Windows [a] ) больше не реагирует на ввод пользователем текста на клавиатуре или перемещение мыши. Этот термин охватывает широкий спектр поведения как клиентов , так и серверов и не ограничивается проблемами графического пользовательского интерфейса.
Зависания имеют различные причины и симптомы, включая программные или аппаратные дефекты, такие как бесконечный цикл или длительные непрерывные вычисления, истощение ресурсов ( пробуксовка ), неэффективное оборудование ( дросселирование ), внешние события, такие как медленная компьютерная сеть , неправильная конфигурация и проблемы совместимости . Основной причиной обычно является истощение ресурсов: ресурсы, необходимые для работы какой-либо части системы, недоступны из-за того, что они используются другими процессами или просто недостаточны. Часто причиной является взаимодействие нескольких факторов, что делает «зависание» не техническим термином, а скорее свободным обобщающим термином.
Зависание может быть временным, если вызвано условием, которое разрешается само собой, например, медленное оборудование, или оно может быть постоянным и требовать ручного вмешательства, как в случае аппаратной или программной логической ошибки. Многие современные операционные системы предоставляют пользователю возможность принудительно завершить зависшую программу без перезагрузки или выхода из системы ; некоторые операционные системы, например, предназначенные для мобильных устройств, могут даже делать это автоматически. В более серьезных зависаниях, влияющих на всю систему, единственным решением может быть перезагрузка машины, обычно путем выключения/включения питания с помощью кнопки выключения/включения или сброса.
Зависание отличается от сбоя , при котором сбой происходит немедленно и не связан с реакцией на ввод данных. [ необходима цитата ]
В многозадачной операционной системе возможно зависание отдельного процесса или потока , например, блокировка ресурса или попадание в бесконечный цикл, хотя влияние на всю систему значительно различается. В кооперативной многозадачной системе любой поток, который зависает без уступки, зависает систему, поскольку он заклинивает себя как работающий поток и мешает другим потокам работать.
Напротив, современные операционные системы в основном используют упреждающую многозадачность , например, Windows 2000 и ее последователи, а также Linux и macOS от Apple Inc. В этих случаях застрявший поток не обязательно повесит систему, так как операционная система вытеснит его, когда истечет его временной интервал, позволив запуститься другому потоку. Если поток зависнет, планировщик может переключиться на другую группу взаимозависимых задач, чтобы все процессы не зависли. [1] Однако застрявший поток все равно будет потреблять ресурсы: по крайней мере, запись в планировании, и если он работает (например, застрял в бесконечном цикле), он будет потреблять циклы процессора и электроэнергию, когда он запланирован, замедляя систему, хотя и не завешивая ее.
Однако даже при использовании вытесняющей многозадачности система может зависнуть, а неправильно выполняемая или вредоносная задача может повесить систему, в первую очередь за счет монополизации какого-либо другого ресурса, например ввода-вывода или памяти, хотя процессорное время не может быть монополизировано. Например, процесс, блокирующий файловую систему, часто будет подвешивать систему.
Перемещение по окну поверх зависшей программы во время зависания может привести к появлению следа от перерисовки окна. [2]
Аппаратное обеспечение может привести к зависанию компьютера, либо из-за его неполадок, либо из-за несоответствия другому оборудованию в компьютере [3] (это может произойти при обновлении ) . Аппаратное обеспечение также может со временем выйти из строя из-за грязи или теплового повреждения.
Зависание также может произойти из-за того, что программист неправильно указал условия завершения цикла или , в кооперативной многозадачной операционной системе , забыл передать управление другим задачам. Другими словами, многие зависания, связанные с программным обеспечением, вызваны потоками, ожидающими события, которое никогда не произойдет. [4] Это также известно как бесконечный цикл .
Другой причиной зависаний является состояние гонки в коммуникации между процессами . Один процесс может отправить сигнал второму процессу, а затем остановить выполнение, пока не получит ответ. Если второй процесс занят, сигнал будет вынужден ждать, пока процесс не сможет до него добраться. Однако, если второй процесс был занят отправкой сигнала первому процессу, то оба процесса будут вечно ждать ответа другого на сигналы и никогда не увидят сигнала другого (это событие известно как взаимоблокировка ) . Если процессы непрерываемы, они зависнут и должны быть завершены. Если хотя бы один из процессов является критическим процессом ядра , вся система может зависнуть и ее придется перезапустить.
Может показаться, что компьютер завис, когда на самом деле он просто очень медленно обрабатывает данные. Это может быть вызвано слишком большим количеством одновременно запущенных программ, нехваткой памяти ( ОЗУ ) или фрагментацией памяти , медленным доступом к оборудованию (особенно к удаленным устройствам), медленными системными API и т. д. Это также может быть вызвано скрытыми программами, которые были установлены тайно, например, шпионским ПО .
Во многих случаях может показаться, что программы зависли, но на самом деле они выполняются медленно, и ожидание в несколько минут позволит задаче завершиться.
Современные операционные системы предоставляют механизм для завершения зависших процессов, например, с помощью команды kill Unix или с помощью графических средств, таких как кнопка «Завершить задачу» диспетчера задач в Windows (выберите конкретный процесс в списке и нажмите «Завершить задачу»). Старые системы, например, работающие под управлением MS-DOS , ранних версий Windows или Classic Mac OS, часто требовали полной перезагрузки в случае зависания.
На встраиваемых устройствах , где взаимодействие с человеком ограничено, сторожевой таймер может перезагрузить компьютер в случае зависания.