CSAppという:第VIII章例外制御フローECF

第VIII章例外制御フローECF

8.1異常な例外

グラフLR E [異常な例外] - > E2は[割り込み:非同期例外] E - > E3 [同期例外] E3 - >トラップE3 - >障害E3 - >アボート

異常な例外的な制御フローの形態、ハードウェアによって実現彼の一部、オペレーティングシステムの一部として実装されます。

プロセッサは、何かが起こることを検出した場合にどのような場合でも、彼は例外(例外テーブル)、テーブルをジャンプ(異常)の簡単な紹介のプロシージャ・コールを実施するテーブルによって呼び出されます、具体的には、処理するように設計オペレーティングシステムのイベントサブルーチン(例外ハンドラ例外ハンドラ)。例外ハンドラが終了すると、例外を発生させたイベントのタイプに応じて、以下の3つの条件のいずれかが発生します。

  1. ハンドラは現在の命令Iに制御を返すCURR、命令が実行されたときにのみ起こります。
  2. ハンドラがIに制御を返す次に、次の命令が発生していない場合、例外が実行されます。
  3. 中断されたプログラムを停止するプロセッサ。

異常の種類:

カテゴリ 理由 非同期/同期 戻り挙動
割り込み I / Oデバイスからの信号 非同期な 必ず次の命令に戻ります
トラップ このようなシステムコール(システムコール)など興味の例外、 シンクロナス 必ず次の命令に戻ります
欠陥 このよう欠落しているページなどの回復可能なエラーの意図ん シンクロナス 現在の命令に復帰することが可能です
中止 意図しないエラー シンクロナス 戻りません

例外処理の障害、例えばページフォルトで。メモリページ要求へのシステムメモリは、このページはもはやメモリ内にあるときに、ディスクからメモリに不足しているページに置くために、異常な手続きを扱うこの時間コールに落丁、異常な不足しているページをトリガしません。成功した場合、現在の命令、両方の再要求メモリページへの復帰は、今ではメモリページをトリガしません。失敗した場合、メモリのページ要求を放棄し、現在の命令を返しません。

8.2プロセスプロセス

異常なプロセスは、オペレーティングシステムがコンセプトの基本的なビルディングブロックを提供することができるようにすることです、このプロセスは、コンピュータ科学の最も深遠かつ成功した1つの概念です。

プロセスの古典的な定義は、プログラム実行の種類の一例です。各プログラムは、処理中の(コンテキスト)の文脈におけるシステムで実行されます。

キー抽象化のアプリケーションに提供プロセス:

  • 我々は排他的にプロセッサによって使用されるプログラムかのように独立したロジック制御の流れは、それは、錯覚を提供します。
  • 私は空腹のプログラムは専用のメモリシステムを使用したかのようにプライベートなメモリ空間は、それは、誤った印象を与えます。

コアの異常が異常な制御フローの形でプロセスコンテキストスイッチをサポートします。

8.4プロセス制御

プロセスIDを取得します。

#include <sys/types.h>
#include <unisted.h>

pid_t getpid(void);
pid_t getppod(void);

プロセスのfork関数、作成二回返され、一度だけ呼び出さを親プロセスで生成された子プロセスpidに戻り、子プロセスに0を返します。

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    pid_t pid;
    int x = 1;

    pid = fork();
    if(pid == 0){
        printf("child : x = %d\n", ++x);//child process
        exit(0);
    }

    printf("parent : x = %d\n", --x);//parent process
    return 0;
}

結果:

$ ./fork 
parent : x = 0
child : x = 2

リサイクル子プロセス

#include <sys/types.h>
#include <unistd.h>

pid_t waitpid(pid_t pid, int *statusp, int options);
//如果成功,则返回子进程的pid,如果WNOHANG,则为0,如果其他错误,则为-1.

プログラムをロードして実行します

#include <unistd.h>

int execve(const *filename, const char *argv[], const char *envp[]);
//如果成功则不返回,若错误,则返回-1;

8.5信号

例外の形で、より高いレベルのソフトウェアは、カーネルを可能にし、Linuxの信号は、他のプロセスで処理します。

おすすめ

転載: www.cnblogs.com/LiShiZhen/p/11494440.html