2012-03-01 6 views
3

数年前、私は私の学位に就いていましたが、私の先生は、C言語で無限ループを作るとコンピュータがクラッシュしてプロセッサのリソースを無駄に使うことになると言いました。物事は再び良い。今日私はWindows 7のコンピュータで同じ状況をテストしましたが、コンピュータがクラッシュせず、プロセッサリソースが単に「アイドル」だったことがわかりました。この特定のイベントを変更するには、5年前から今日まで何が変わりますか?for(;;){}がコンピュータをもはやクラッシュさせないのはなぜですか?

+7

先生はまだ教えていますか? – Mysticial

+0

もういない...しかし、それはWindows XPの初めにあった... 5〜8年前など... – Diogo

+0

Tehehe ...それはおそらく理由を説明する... :) – Mysticial

答えて

6

OSがプリエンプティブマルチタスクをサポートしていない場合、無限ループはOSを "クラッシュ"させます。まともなOSで、スケジューラはそのプロセスをしばらくの間休憩させ、他のものを実行させる。

いずれにせよ、リソースの使用率が低い場合は、生成されたコードを見てください。コンパイラは、全体を最適化するようなスマートな処理を行っている可能性があります。

+1

そして、OSがプログラムを中断する何らかの方法をサポートしていない場合でも。 Classic Mac OS(協調マルチタスクを使用していました!)でも実行中のアプリケーションを強制終了するために⌘-⌥-Escをサポートしていました。 – duskwuff

+0

@duskwuff私は実際にMac OSが協調マルチタスクを使用しているのを知らなかった。いつものように、私はSOから最も利益を受けるのです。私はDOSでその種のループを試みることを考えています。 – cnicutar

+0

それは68Kシステムでは少なくとも行いました。 PPCポートは、実際には先取り型マルチタスクをサポートするナノカーネルを持っていましたが、ほとんどのプログラムでそれを使用したプログラムはほとんどありませんでした。ほとんどのコードは引き続き1つのスレッド内で協調マルチタスクを使用し続けました。もっと知っているほど! ♒✭ – duskwuff

3

あなたの先生は、まずは真実ではないことを教えてくれました。それは起こらないことは驚くことではありません。

無限ループでCPUを100%にすることができますが、最新のオペレーティングシステムでは、他のプロセスでもタイムスライスが得られ、簡単に削除できます。プログラマが簡単に間違っていると、マシン全体が非常に簡単に停止した場合、OSはあまり役に立ちません。

0

マルチコアプロセッサは8年前のように現在一般的に使用されています。これは、単一のインフォメーション処理が現在は単一のコアを結びつけ、残りのコアは自由に他の作業を実行できることを意味します。それでも、1つのビジーループプロセスがシステム全体を結びつけるためには、かなり厄介なオペレーティングシステムを実行しなければなりません。

0

WindowsにはW95以降の先制型マルチタスクがありました。単一のCPUボックスであっても、1つのルーパスレッドは、通常の方法で問題のプロセスをシャットダウンしたり、タスクマネージャを起動してプロセスを終了させるのに十分なほど、使用可能なままです。

本当にボックスをボークするには、スレッドを上げて優先順位をリアルタイムに処理し、コア数と同じ数のスレッドを作成します(作業を保存します)。

関連する問題