17

オペレーティング システムの観点から、例外はどのように機能しますか?

C++ 出身なので、プログラマーの観点から例外を理解できます。
例外がスローされると、スタックはアンワインドを開始し、各アクティベーション レコードには例外をキャッチして処理する機会があります。

しかし、そもそも例外をスローしたのは誰の責任だったのでしょうか?

  1. 「例外処理状態」に入るように指示するトリガーをプロセスに送信するのはオペレーティングシステムですか?
  2. プロセスは独自のプログラム空間で例外を呼び出して処理しており、OS には認識されていませんか?

私の不確実性を示す 2 つのクラッシュするプログラムを次に示します。

int main(){

    int i = 1/0; //did the OS tell the process to end?

    return 0;
}

#include <exception>

int main(){

    throw 11;  //did the process tell the OS it needs to end?

    return 0;
}
4

3 に答える 3

12

C++ 例外は言語の一部であり、言語標準によって定義され、コンパイラとランタイム ライブラリによって実装されます。exceptionsゼロ除算や NULL ポインターの逆参照など、CPU によって検出されるものは他にもあります。どちらも言語標準の未定義動作の例です。これらはfaultsプロセッサの用語であり、x86 では、たとえばfault handler、OS によって処理される a をトリガーします。次に、OS は、その障害を原因となったプロセスに報告することを選択できます。Unix では、これは で行われsignalsます。たとえば、プロセスが をインストールしている場合、プロセスがsignal handlerNULLSIGSEGVポインターを逆参照するときに CPU によって生成されたエラーを処理できます...そのメカニズムは、言語によって定義された C++ 例外とは別のものです。

あなたの例では、C++ プログラムthrowsが例外である場合、これはコンパイラによって生成されたコードと言語ランタイム ライブラリによって完全に処理され、カーネル呼び出しは必要なく、プロセッサによって生成されるハードウェア障害はありません。

于 2013-02-06T20:57:08.697 に答える
8

あなたは2つの完全に異なる例外プロセスについて話している.

1 つ目は OS によって提供されます。Windows では、 と を使用__try__exceptてそれらを処理できます。

2 つ目は C++ コンパイラによって提供され、OS は一切関与しません。

于 2013-02-06T20:54:34.917 に答える
7

私は C++ で書かれた 1 つまたは 2 つの OS しか認識していないため、私がよく知っている OS は公式に例外をまったく使用していないため、OS によって例外がスローされる可能性はほとんどありません。

3 つの主要な OS (Linux、Windows、MacOS X) は、すべての形式の Unix (AIX、Solaris、HP-UX など) とともに C で記述されており、アセンブラーで記述されていない他のほとんどの市販の OS も C で記述されています。したがって、C++ 型の例外をスローすることはできません [ソフトウェア駆動型の例外がないと言っているわけではなく、C++ の "try/catch" でなんらかの変換を行わずにキャッチする例外の型ではないということです]。

最初の例では、OS は [私が知っているすべての OS で] 確実に関与しています。これは、関数として除算を持つすべてのマシンでゼロ除算がハードウェア例外を引き起こすため、OS が関与する必要があるためです。また、これは C++ であろうと C であろうと、同じことをアセンブラーで記述していようと、同じようにコンパイルして失敗します。ほとんどのオペレーティング システムでは、シグナルがプログラムに送信されますが、シグナルを処理するコードがないため、コードはおそらく単純に中止され、OS に奇妙なことが起こったことを伝え、OS は諦め、巻き戻すことさえしません。スタック。

2 番目のケースでは、OS はまったく関与しません。メインへの呼び出しの周りに「try-catch」ブロックがあり、「おっと、誰かがキャッチされていないものを投げました。終了します」と言います。OSが関与する唯一の部分は「このプロセスを終了する」ことです。これはもちろんOSによって実行される必要がありますが、ほとんどのOSを信じていますが、「アプリケーションの開始アドレス」から戻るだけでも同じ効果があります。

于 2013-02-06T20:56:39.290 に答える