コンピューティングにおいて、ハングまたはフリーズとは、プロセスまたはシステムが入力に応答しなくなった状態を指します。典型的な例としては、コンピューターのグラフィカルユーザーインターフェイス(Microsoft Windows [ a ]など)が、ユーザーのキーボード入力やマウス操作に反応しなくなる場合が挙げられます。この用語は、クライアントとサーバーの両方における幅広い動作を網羅しており、グラフィカルユーザーインターフェイスの問題に限定されるものではありません。
ハングには、ソフトウェアやハードウェアの欠陥(無限ループや長時間実行される中断不可能な計算など)、リソースの枯渇(スラッシング)、ハードウェアの性能低下(スロットリング)、コンピュータネットワークの遅延などの外部要因、設定ミス、互換性の問題など、さまざまな原因と症状があります。根本的な原因は通常、リソースの枯渇です。システムの一部を実行するために必要なリソースが、他のプロセスで使用されているか、単に不足しているために利用できません。多くの場合、原因は複数の要因の相互作用であるため、「ハング」は技術的な用語というよりは、包括的な用語として使われています。
ハングは、ハードウェアの速度低下など、自然に解消されるような原因であれば一時的なものですが、ハードウェアやソフトウェアの論理エラーなどが原因で永続的に発生し、手動での対処が必要となる場合もあります。多くの最新のオペレーティングシステムでは、再起動やログアウトせずにハングしたプログラムを強制終了する手段がユーザーに提供されています。モバイルデバイス向けに設計されたオペレーティングシステムなど、一部のシステムではこれを自動的に行うものもあります。システム全体に影響を与えるような深刻なハングの場合、唯一の解決策は、通常は電源のオン/オフボタンまたはリセットボタンによる電源のオン/オフ操作でマシンを再起動することです。
ハングはクラッシュとは異なり、クラッシュの場合は障害が即座に発生し、入力に対する応答性とは無関係です。
マルチタスクオペレーティングシステムでは、個々のプロセスやスレッドがリソースのブロックや無限ループに陥るなどして停止する可能性がありますが、システム全体への影響は大きく異なります。協調型マルチタスクシステムでは、停止したスレッドが他のスレッドに道を譲らない場合、そのスレッドが実行中のスレッドとして機能し続け、他のスレッドの実行を妨げるため、システムがハングアップします。
対照的に、現代のオペレーティングシステムは、Windows 2000とその後継バージョン、Linux、Apple Inc.のmacOSなど、主にプリエンプティブ マルチタスクを使用しています。これらの場合、単一のスレッドが停止しても、オペレーティングシステムがタイム スライスが期限切れになったときにそれをプリエンプトして別のスレッドを実行できるようにするため、必ずしもシステムがハングアップすることはありません。スレッドがハングアップした場合、スケジューラは相互依存するタスクの別のグループに切り替えて、すべてのプロセスがハングアップしないようにすることができます。[ 1 ]ただし、停止したスレッドは依然としてリソースを消費します。少なくともスケジューリングのエントリが消費され、実行中の場合 (たとえば、無限ループで停止している場合)、スケジューリングされたときにプロセッサ サイクルと電力を消費し、システムをハングアップさせなくてもシステムを遅くします。
しかし、プリエンプティブマルチタスクであっても、システムがハングアップする可能性があり、プロセッサ時間を独占することはできないものの、不正なタスクや悪意のあるタスクがI/Oやメモリなどの他のリソースを独占することで、システムがハングアップすることもあります。例えば、ファイルシステムをブロックするプロセスは、しばしばシステムをハングアップさせます。
ハードウェアは、断続的な故障やコンピュータ内の他のハードウェアとの不一致(これはアップグレード時に発生する可能性があります)により、コンピュータのフリーズを引き起こす可能性があります[ 3 ]。また、ハードウェアは、汚れや熱による損傷により、時間の経過とともに故障することもあります。
ハングは、プログラマがループの終了条件を誤って設定している場合や、協調型マルチタスクオペレーティングシステムで他のタスクに処理を譲ることを忘れている場合にも発生する可能性があります。言い換えれば、ソフトウェア関連のハングの多くは、決して発生しないイベントの発生をスレッドが待機していることが原因です。 [ 4 ]これは無限ループとも呼ばれます。
ハングアップのもう一つの原因は、プロセス間の通信における競合状態です。あるプロセスが別のプロセスにシグナルを送信した後、応答を受信するまで実行を停止することがあります。2番目のプロセスがビジー状態の場合、シグナルは処理できるようになるまで待機させられます。しかし、2番目のプロセスが最初のプロセスにシグナルを送信している最中だった場合、両方のプロセスは相手からの応答を永遠に待ち続け、相手のシグナルを受信することはありません(この現象はデッドロックと呼ばれます)。プロセスが割り込み不可能な場合、ハングアップして強制終了する必要があります。少なくとも一方のプロセスが重要なカーネルプロセスである場合、システム全体がハングアップして再起動が必要になる可能性があります。
コンピュータがフリーズしたように見える場合でも、実際には処理速度が非常に遅いだけかもしれません。これは、同時に実行されるプログラムが多すぎる、メモリ(RAM)が不足している、メモリの断片化、ハードウェアへのアクセス速度が遅い(特にリモートデバイスへのアクセス)、システムAPIの処理速度が遅いなどが原因で発生する可能性があります。また、スパイウェアなど、密かにインストールされた隠しプログラムが原因である場合もあります。
多くの場合、プログラムはフリーズしたように見えるかもしれませんが、実際にはゆっくりと処理が進んでおり、数分待てばタスクは完了します。
最新のオペレーティングシステムには、フリーズしたプロセスを終了させるための仕組みが備わっています。例えば、Unixのkillコマンドを使用したり、 Windowsのタスクマネージャーの「タスクの終了」ボタン(リストから該当のプロセスを選択し、「タスクの終了」を押す)などのグラフィカルな方法で終了させることができます。MS -DOS、初期のWindows、Classic Mac OSなどの古いシステムでは、フリーズが発生した場合、システム全体を再起動する必要がある場合がよくありました。
人間の介入が限られている組み込み機器では、ウォッチドッグタイマーによって、システムがフリーズした場合にコンピュータを再起動させることができる。