プロセス_Linuxカーネルの設計と実装の注意事項

プロセス

実施段階でのプログラムのプロセスおよび関連リソースの総称であり、その結果は、コードが実行されているリアルタイムです。

カーネル層プロセスを設置PMプロセスの一部はUnixオペレーティングシステムの抽象化で、最も基本的なものは、オペレーティング・システムは、ユーザプログラムを実行するために存在しているので、オペレーティングシステムのプロセス管理は、すべての心があるである。
プログラム自体は、プロセスではなく、プロセス実行可能コードセグメント(テキストセクション)に限定されるものではなく、発生し得る異なる方法の数を完了し、同じプログラムを実行し、複数のプロセス間で、そのようなファイルを開くように、アドレス空間をいくつかのリソースを共有することができます。

スレッド

短いための実行スレッドのスレッドは、各スレッドが有する、アクティブオブジェクトの処理である独立的程序计数器进程栈一组进程寄存器

スケジューリング・オブジェクトはアクティブオブジェクトの過程にある线程プロセス自体は、プロセスは、通常、複数のスレッドを含むのではなく、それはあります多线程序

仮想プロセッサと仮想メモリ

プロセスは2つのメカニズムを提供し、虚拟处理器そして虚拟内存同様に、同じプロセッサを共有し、プロセッサは排他的プロセッサの仮想フェルトを処理する仮想メモリを実際に多くのプロセスであってもよく、プロセスは、それらが、システム全体のメモリリソースを持っていることを感じるだろう。

仮想メモリは、同じプロセスに含まれるスレッド間で共有することができるが、各スレッドは、独自の仮想プロセッサを有しています。

カーネルの視点からは、スレッドの概念がない、Linux用のスレッドは、プロセス間でリソースを共有するだけの手段です。

プロセスを作成します。

fork関数を使用してプロセスを作成します

...
NAME
   fork - create a child process

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

   pid_t fork(void);

DESCRIPTION
   fork()  creates  a new process by duplicating the calling process.  The new process is
   referred to as the child process.  The calling process is referred to  as  the  parent
   process.

   The  child  process and the parent process run in separate memory spaces.  At the time
   of fork() both memory spaces have the same  content.   Memory  writes,  file  mappings
   (mmap(2)),  and unmappings (munmap(2)) performed by one of the processes do not affect
   the other.
   ...
   RETURN VALUE
   On  success, the PID of the child process is returned in the parent, and 0 is returned
   in the child.  On failure, -1 is returned in the parent, no child process is  created,
   and errno is set appropriately
   ...

fork函数  
Creat thread   
child process may use all of father's resources  
pid_t fork(void);  
– 参数:无  
– 返回值:执行成功,返回子进程pid给父进程,0返回给子进程;出现错误,返回-1给父进程。执行失败的唯一情况是内存不够或者id号用尽,不过这种情况几乎很少发生。  
– 系统函数fork 调用成功,会创建一个新的进程,它几乎会调用差不多完全一样的fork 进程  
– 子进程的pid 和父进程不一样,是新分配的  
– 子进程的ppid(他爷爷的ID) 会设置为父进程的pid,也就是说子进程和父进程各自的
“父进程”不一样.  
– 子进程中的资源统计信息会清零.  
– 挂起的信号会被清除,也不会被继承.  
– 所有文件锁也不会被子进程继承.  

プロセスプロセスは、それが生き残るために作成された時点から始まり、Linuxは通常、フォーク()プロセスが呼び出されるコール既存のプロセスをコピーして新しいプロセスを作成するためにシステムコールfork()システムコールを使用してプロセスを作成します、新しいプロセスが親プロセスに戻り、通話終了後に作成された子プロセスと呼ばれる親プロセスは、親プロセスが下向き続け、子プロセスが実行を開始し、

父进程调用子进程,然后自己向下执行,同时子进程被调用后也开始执行.
fork系统调用从内核返回两次,一次返回到父进程,另一次返回到新产生的子进程.

典型的には、新しいプロセスが新しいアドレス空間を作成することができexec関数のクラスタを使用して、すぐに新しいプログラムを実装することで作成し、プログラム(実行可能ファイル)がロードされ、フォーク関数は、実際にはclone、システム・コールの実装。

clone()的所有参数定义在 linux/sched.h 中.

コールの関係

创建进程 -> fork() -> clone() -> do_fork() -> copy_process()

完了するためにcopy_process()関数

  1. カーネルスタックを作成し、thread_info構造のtask_struct構造を作成するために、()を呼び出しdup_task_struct。
  2. プロセスの現在の数が制限値を超えていないことを確認してください。
  3. 子供自身や親プロセスを区別することができる。(統計情報)のプロセス記述の多くのメンバーは初期値に設定されます。
  4. 子プロセスのステータスは、それが、操作に入れることができないことを保証するために、TASK_UNINTERRUPTIBLEに設定されています。
  5. copy_processコールcopy_flags()、task_structのメンバーのフラグを更新。
  6. 新しいプロセスのための有効なPIDを割り当てるために()を呼び出しalloc_pid。
  7. クローンフラグを渡されたパラメータは、copy_processはコピーまたは開いているファイルを共有しました。
  8. モップアップ作業は、子プロセスへのポインタを返します。

copy_processの成功は、意図的に子プロセスは、実行するようになるカーネルは通常、子プロセスは、コピー・オン・ライトのオーバーヘッドを避けることができますすぐにこのexecを呼び出す場合戻るdo_fork関数は、関数が返されます。

プロセスの記述

別のプロセスは、タスク名でtask、通常のカーネルから始まるすべてのプロセスのために見て、カーネル開発者のタスクの観点から、カーネルは、上のプロセス・リストと呼ばれていると述べ任务队列、各タイプの双方向循環リンクリストれるtask_structプロセス記述子(として知られているprocess descriptor構成で定義されている)構造、<linux/sched.h>ファイル、プロセス記述子は、特定のプロセス情報を含みます。

/*进程描述符task_struct结构*/
struct task_struct {
#ifdef CONFIG_THREAD_INFO_IN_TASK
    /*
     * For reasons of header soup (see current_thread_info()), this
     * must be the first element of task_struct.
     */
    struct thread_info      thread_info;
#endif
    /* -1 unrunnable, 0 runnable, >0 stopped: */
    volatile long           state;

    /*
     * This begins the randomizable portion of task_struct. Only
     * scheduling-critical items should be added above here.
     */
    randomized_struct_fields_start

    void                *stack;
    atomic_t            usage;
    /* Per task flags (PF_*), defined further below: */
    unsigned int            flags;
    unsigned int            ptrace;
    /*
     * WARNING: on x86, 'thread_struct' contains a variable-sized
     * structure.  It *MUST* be at the end of 'task_struct'.
     *
     * Do not put anything below here!
     */
};

task_structこの構造は、プロセス管理カーネルのために必要なすべての情報が含まれているため、プロセス記述子に含まれるデータは、実行中のプログラムの完全な説明、を含むプロセス記述することができ、比較的大きいです。

  • プロセス開いているファイル、
  • プロセスのアドレス空間、
  • 保留信号、
  • プロセスなどの状態。

割り当てプロセス記述子

Linuxによってslab流通task_struct構造、これは達することができる对象复用缓存着色(キャッシュカラーリング)。を使用しslab、動的に生成されたtask_struct単純スタック構造の新しいスタック上部または下部を作成し、構造をstruct thread_info

x86プラットフォームの上struct thread_infoに<ASM / thread_info.h>で定義されたファイル

current現在のプロセスの記述を実行しているプログラムを入手

アクセスタスクは頻繁に彼のポイントする必要があるカーネルではtask_struct、ポインタを、カーネルコードの大部分は、プロセスによって処理されてはいるtask_structあなたがすることができ、行われcurrent宏、現在のプロセスの記述子を実行しているプロセスを見つけます。

ハードウェアアーキテクチャに応じて、このマクロは、実装が異なっている1
一部のハードウェアアーキテクチャは、アドレスを格納する特殊レジスタを使用することができ、このような現在のtask_struct構造を達成するために、ライン上のレジスタの非常に簡単で、直接、戻り値になりますが、一部のレジスタ少ないハードウェア・アーキテクチャ、私たちすることができますのみthread_info間接アドレスルックアップtask_struct構造を計算することにより、オフセット構造を作成することもできます。

current宏達成するための二つの方法:

  1. thread_info構造によって間接的なプロセスの記述子を検索します。
  2. 特別なプロセス記述の直接の戻り値を格納することで、識別子のプロセス記述子を見つけるために登録します。

構造thread_info

ヘッダファイルのパス:

.\linux源码目录\arch\arm\include\asm\thread_info.h
/*
 * low level task data that entry.S needs immediate access to.
 * __switch_to() assumes cpu_context follows immediately after cpu_domain.
 */
struct thread_info {
    unsigned long       flags;      /* low level flags */
    int         preempt_count;  /* 0 => preemptable, <0 => bug */
    mm_segment_t        addr_limit; /* address limit */

    struct task_struct  *task;      /* main task structure */
    __u32           cpu;        /* cpu */
    __u32           cpu_domain; /* cpu domain */
    struct cpu_context_save cpu_context;    /* cpu context */
    __u32           syscall;    /* syscall number */
    __u8            used_cp[16];    /* thread used copro */
    unsigned long       tp_value[2];    /* TLS registers */
#ifdef CONFIG_CRUNCH
    struct crunch_state crunchstate;
#endif
    union fp_state      fpstate __attribute__((aligned(8)));
    union vfp_state     vfpstate;
#ifdef CONFIG_ARM_THUMBEE
    unsigned long       thumbee_state;  /* ThumbEE Handler Base register */
#endif
};

各タスクのthread_info構造は、彼のカーネルスタックの最後に作成しました。構造task域タスクに格納されているポインタは、実際にはtask_struct事前に割り当てられてポインタ、および再利用task_struct資源、動的な割り当てと解放の消費によって引き起こさ避けることができる。アーキテクチャの紹介よりも弱い登録しthread_info、この新しい構造を独自の構造上の理由をアセンブリコードにコンパイルより簡単に計算を行います。

PIDストレージ

一意の識別値(処理識別値)によって、すなわちカーネルプロセスPIDの各工程を表します。PID以下のように表現番号、あるpid_t隐含类型2は、それが実際にはint型です。UnixおよびLinuxの旧バージョンとの互換性のために、PID最大のデフォルト設定は32768(short int型の最大の短整数)、この制限がで定義されています<linux/threads>各プロセスのカーネルはPID、独自のプロセス記述子に格納されています。

このPID制限は小さく、高速好転(プロセス実行サイクルラップ)、小さな値処理後実行通常、大きな数値のプロセス(プロセスの同時存在の最大数を可能にする)(プログラムは小さいで実行します変更する必要がある場合はPID値増加分布理由PID値)は、pid限界を、あなたが変更することができ/proc/sys/kernel/pid_max、天井を上げます

状態ドメイン

プロセス記述は、state域プロセスの現在の状態を記述し、システム内の各プロセスは、5つの状態のいずれかの工程において不可避です。

  1. プロセスが実行されているか、実行を待っている:実行をTASK_RUNNING。
  2. TASK_INTERRUPTIBLE割り込み:睡眠プロセスを実行するための状態を起こされるための条件の履行を待って、ブロックされています。
  3. TASK_UNINTERRUPTIBLE無停電3:受信した信号が目覚めされません場合でも。
  4. __TASK_TRACEDは、によるようなプロセスの他のプロセス、追跡ptraceデバッグ手順を追跡します。
  5. __TASK_STOPPEDプロセスが実行を停止する4、プロセスは操作に入れていません。

現在のプロセスのステータスを設定します。

ステータスプロセスの機能調整

set_task_state(task,state)/*将任务task的状态设置为state*/  

指定された状態にこの機能指定されたプロセスは、SMPシステムでは、再順序付け、または同等のために他のプロセッサを強制的にメモリバリアを設定します

task->state = state;/*设置状态位的状态为state*/

set_current_state(状態)とset_task_state(現在の状態)は、特にヘッダファイルに、同じ意味を有し<linux/sched.h>ています。

注:タスクのドメインが構成thread_info位置し、プロセスを指すようにポインタがtask_struct構造識別子を記載しました。

フォークとのvfork差

子プロセスのページテーブルエントリに親プロセスのfork関数のコピーは、ページテーブルエントリが書かれていないコピー
のvforkのページテーブルエントリ関数は親プロセスをコピーしません()、

現在のプロセスのフォークコピーは、子プロセスを作成する
フォークでのvforkのが、親プロセスが終了して続行子プロセスを待った後、
親プロセスの子プロセスを行うために別のスレッドで彼のアドレス空間で実行するように、親プロセスは子までブロックされますプロセスの終了

ページテーブルエントリ

オペレーティング・システム・メモリ・アドレスの管理を容易にするために、メモリアドレスは、ページ・テーブル・エントリであるページの数、各ページのアドレス、に分割されます。

カーネルスレッド

カーネルスレッドはカーネル空間で実行されている独立した標準的なプロセスであり、通常のプロセスの違いは、それは別のアドレス空間、ないことである5をすべてのカーネルスレッドが同じアドレス空間で実行されています。

カーネルスレッドのコマンドを確認します。

ps -ef 

カーネルスレッドを作成します。

linux/kthread.h既存のカーネルスレッド方式から新しいカーネルスレッドを作成するために提供される
--- kthread_create呼び出すことでない場合は、状態の新しく作成されたプロセスを実行することはできません、機能wake_up_process明確な彼が実行されないだろう、それを覚まします。

することによりkthread_run、プロセスを作成し、それをウェイクアップするために実装することができ、これは、上記の二つの機能のためのパッケージです。

#define kthread_run(threadfn, data, namefmt, ...)              \
({                                     \
    struct task_struct *__k                        \
        = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \
    if (!IS_ERR(__k))                          \
        wake_up_process(__k);                      \
    __k;                                   \
})

コードの動作効率を向上させるためには、カーネル関数はマクロパッケージ、今回マイナスに必要な関数呼び出しのオーバーヘッドの多くを使用しています。

カーネルスレッドの終了

カーネルスレッドが開始された後、それを呼び出すまで実行されますdo_exit()呼び出しを終了し、またはカーネルの他の部分kthread_stopの出口を、プロセスの終了時に、カーネルは彼のすべてのリソースを解放し、親プロセスに通知する必要があり、破壊のプロセスは一般的に、それ自体によって引き起こされ、それ表示または暗黙的なコールexitシステムコールは、自分自身を終了、Cコンパイラは、関数の後ろに配置されている主要なポイントに戻りexit暗黙終了する呼び出し、またはプロセス、受動的目的を達成するために、異常なシステムコールコード。

どんなにプロセスの最後に、タスクは行われませんdo_exitシステムコール完了するために、6

do_eixt作業が行われ

  1. task_structフラグのメンバーはPF_EXITINGに設定されている。(オフマークプロセス記述子フラグの設定します)
  2. )(del_timer_syncコールコアタイマーのいずれかを削除し、キューにはタイマーは、何のタイマハンドラが実行されますされていないことを確認してください。
  3. BSDプロセス・アカウンティング機能が有効になっている場合は、do_exit()呼び出しacct_update_integrals()、出力課金情報
  4. 何も彼らが使用するプロセス(あなたのメモリが共有されていないことを示す)は、それらを完全に解放していない場合は、プロセスのmm_structについてによって占めリリースにexit_mm()関数を呼び出します。
  5. プロセスは、キューを離れ、IPCが並んで待ってIF信号、sem__exit()関数を呼び出します
  6. exit_files()とexit_fs()を呼び出し、それぞれ減少し、参照カウントが低下した場合、ファイル・システムのファイル記述子の参照カウント0に、適切なリソースを使用していないプロセスを解放することができます。
  7. )(出口によって設定されたタスクの終了コードのexit_codeのtask_structメンバーに格納される終了コードを提供する、または任意の他のカーネル機構、いつでも親プロセスで検索するためにここに格納された終了コード下の出口アクションを完了します。
  8. Exit_notifyコールが養父、見つけるために、子プロセスを親プロセスに通知する(最後に親プロセスが、その後、彼はそう、彼は以下のサブプロセスが孤立になるだろう、養父を見つけ、彼の次のの子でなければなりません)、父親の先祖することができinitはまた、他のプロセスとすることができる。EXIT_STATE設定及びプロセス状態task_struct構造がEXIT_ZOMBLEあります。
  9. do_exitコール新しいプロセスにスケジュールスイッチ(他のプロセスをスケジュールするスケジューラをできるようにプロセッサ時間をあきらめるために、スケジューラを呼び出す)、状態はEXIT_ZOMBIEの過程にあるため、スケジュールされませんので、これは、プロセスによって実行されるコードの最後の部分でありますdo_exitが返されることはありません。

    フラグフラグは<linuxの\ sched.h>内で定義されています。

    /*
    * Per process flags
    */
    #define PF_IDLE         0x00000002  /* I am an IDLE thread */
    #define PF_EXITING      0x00000004  /* Getting shut down */
    /*...*/

プロセスとリソースが共有されていない場合は、関連するすべてのリソースが解放され、そしてEXIT_ZOMBIEの終了ステータスで、すべてのメモリがtask_struct構造とそれが占めている構造thread_info、カーネルスタックで、
この現時点でのプロセスの唯一の目的は、にあります親に情報を提供した後、親プロセスは、情報を取得する、それはすべての残りの部分は、システムに返さのメモリに保持された余波、との取引を行うためには、彼が亡くなったことを確認しました。

ではdo_exit、それは余波で取引を行うために前と次、親プロセス、プロセスを実行することはできません死んでてきましたが、システムはまだ彼のプロセス記述子を保持し、これはシステムがまだ子プロセスの終了後に彼のメッセージを取得することができるようにする方法を持つことができますが、それはプロセスの最後で、プロセスの記述は削除作業が子を取得するために、親プロセスまで別々に実行されるクリーンアップ作業後、情報で死亡したか、それは子プロセスのどのような情報を懸念していないカーネルに通知していたtask_struct構造のみだったが解除

ゾンビプロセスを取り除きます

---释放进程描述符

システムを実装するための責任wiat4によって、親プロセスは子の余波、彼の標準アクションを扱う呼び出します。

  • それは、その子プロセスが終了するの1までのプロセスを呼び出すハング、そして関数は、子プロセスのPIDが返されます、
  • とき、サブルーチンの終了関数ポインタを呼び出すと、終了コードが含まれているときに提供。
  • 最終的なリリースプロセス記述子は、呼び出すときrelease_task、彼は完成しました:
  1. 通話_exit_signal機能、関数呼び出し_unhash_process、後者の呼び出し元detach_pid関数からは、pidhash上のプロセスを削除するには、だけでなく、タスクリストからプロセスを削除します。
  2. 現在、ゾンビプロセスと最終統計とレコードを残りのすべてのリソースを解放_exit_signal。
  3. このプロセスは、最後のプロセス・スレッドグループで、死んだプロセスをリードした場合は、それがrelease_taskプロセスをリードする親プロセスの死者を通知します。
  4. release_taskコールput_task_structリリース进程内核栈thread_info结构共有ページ、およびリリースが呼び出すtast_structのシェアslab高速キャッシュを。

この時点で、进程描述符すべての排他的リソース上のすべてのプロセスが解放します。

孤立、ジレンマ

子プロセスが終了する前に、親、あなたがそうでなければ彼らの死についての情報を取得するために、親プロセスが存在しないため、プロセスが常に終了時に死んだ状態で孤児となり、彼らは余波を扱う、彼に父を見つけなければならない(削除処理の記述Fuが)。
これは、システムリソースの無駄、と無駄にメモリのコストだけではない、
解決策は、彼の死の時に親プロセスである、彼の先祖のinitプロセスを見つけるためではない父を、見つけるために、彼の現在のスレッドグループ内のプロセスを発見しました。

do_exit呼び出すexit_notify関数コールforget_original_parentバック呼び出して、find_new_reaper親プロセスの実行を見つけることを、このコードは、父を育成します初期化を見つけることがない場合は、現在のスレッドグループに彼を見つけました。


要約:

  • 各スレッドは、別のプログラムカウンタ、プロセス・スタック、及び登録プロセスのセットを有します。
  • プロセスは、2つのメカニズム、仮想プロセッサおよび仮想メモリを提供し、
  • そのためのカーネルスレッドは、共有メモリの唯一の手段であります
  • プロセスを作成し、fork
  • 実行可能ファイルが実行されているメモリ空間にロードされ、exec
  • プロセス記述子を取得し、current宏
  • current宏ハードウェア構成の実装に応じて、2つの実装があります。
  • プロセス記述子構造のtask_struct
  • 各プロセスのPIDは、それぞれのプロセス記述子に格納されています
  • プロセス記述子状態フィールドには、プロセスの現在の状態を説明し、
  • 5つの状態のプロセス
  • 状態設定処理
  • カーネルスレッドをチェック
  • 作成し、カーネルスレッドをウェイクkthread_run
  • カーネルスレッド出口の終わり
  • ページテーブルエントリ

プロセス間の関係

プロセス間の明確な継承関係がありますが、すべてのプロセスはinitプロセスPIDの子孫が1されている、各プロセスは、親プロセスと子プロセスを持っている必要があります。

ストレージとそのプロセスの

プロセス間の関係は、プロセス記述子に格納されtask_struct、それぞれが、task_struct親プロセスを指すポインタ含まれparent、子プロセスポインタポイントchildren

現在宏

current宏現在実行中のプロセスの記述子を見つけるために使用されるプロセスはtask_struct、特定の実装構造は、マシンに依存して変化します。

作成プロセス

読み出しの過程で新たなアドレス空間を作成し、実行ファイルを実行するプロセスを作成する工程と、Linuxでは、この手順は、子プロセスとしての二つの機能、現在のプロセスの電荷コピーの分岐に分割することができる(新規作成プロセスが)、(フォーク実行ファイルと機能を読んでいない)、実行可能ファイルは、子プロセス(新しいプロセス)でexec関数によって読み込まれ、実行を開始しています。

コピーを書くとき

子供は親プロセスのリソースを必要としない場合は、親のリソースフォークのコピーが白い作業なので、コピーが書かれている場合、子プロセスがすぐに幹部を呼び出した場合、子供は、親のみをコピーする、必要時にのみ機能、実行可能ファイルを実行し、終了し、あなたは親プロセスのリソースをコピーする必要はありません。

スレッド

Linuxのスレッドでは、特殊なプロセスであり、共有資源の手段であり、複数のスレッド間で同じリソースを共有することができ、複数のスレッドを含めることができ、同じプロセス7

システムコールを待ちます

アクションは、プロセスが一度呼び出され、プロセスそれを呼び出す保留されて待ってwait、それは破壊を完了するために戻った後、すぐにその子プロセスが終了するの1を待って、自分自身をブロックし、それは、情報を収集し、子プロセスを入れて正常への復帰を待ちます。

情報を収集するために子孫の親プロセスを意味

カーネルは、実装するための責任があるwait4(関数ファミリを待つ)のLinuxは通常、Cライブラリによって提供され、システムコールをwaitwaitpidwait3wait4ニュアンスを持っている機能が、プロセスの終了時にリターン・ステータスを達成することができます。

介して親プロセスのwait4システムコールは、プロセスが特定のプロセスが終了するのを待つする能力を持って、プロセスが実行した後に終了します終了、子プロセスを照会し、彼の親の呼び出しまで状態をゾンビに設定されますwait()、またはwaitpid遠く、唯一の完全なエンド。

機能を待って、子プロセスが終了するまで、自身をブロックすることで、子プロセスの終了の余波(破壊、削除処理の記述、彼のすべてのリソースを解放)に対処するために行います。

どのように瀕死のプロセス

またはから撤退するためのシステムコールの暗黙の呼び出し表示することで、プログラムを終了8を、この関数は、プロセスの終わりになるでしょうし、それが解放されたリソースを要する。この時点で、スレッドが死んだ状態であり、かつ実行することはできません。機能の家族のために待機する必要が破壊に向かって進行します。



  1. そのようなx86アーキテクチャ現在のマクロの実現として。PPCでは、レジスタの十分な数があり、単独プロセス記述子のPPCカーネル開発者はレジスタ、現在のマクロを開いているので、プロセス記述子へのアクセスは、重要頻繁操作であるのでただレジスタr2のtask_struct構造アドレスの格納された値の行に戻ります。

  2. 暗黙物理未知または無関係の種類を表すデータ型を指す。

  3. この状態ではタスクが、この状態で受信するので、信号に任意のプロセスをあまり使用応答しないため、状態は通常、すぐに行われるプロセスを待っている間に邪魔されずに、またはイベントを待機しなければなりません使用した場合でも信号は、対応していないpsとしてマークされて参照するためのコマンドをD、原因が、あなたが送って殺すことができないSIGKILL信号、彼はオフに無視します。通常、この状態のプロセスが処理されていない重要な何かを持っている必要があり、でも、セマフォを保持することができる、彼を殺すために方法を見つけることを余儀なくされてはならない。

  4. この状態は、典型的には、プロセスがデバッグ中にこの状態に入るときに、任意の信号を受信することに加えてSIGSTOP、SIGSTP、SGITTIN、SIGTTOU他の信号を、受信時に生じる。

  5. Linuxはシングルカーネル・オペレーティング・システムである。

  6. 人々は悲しいが、しかし、すべての後に、それはプロセスを終了することである。

  7. プロセスにおけるLinuxとスレッドの概念は非常にあいまいで、故意にスレッドやプロセスを区別しない、スレッドは単に共有リソースベールの手段です。

  8. 明示的または暗黙的なコール;暗黙呼び出し:コンパイラは、出口システムコールの戻り部分主要機能が追加される。

おすすめ

転載: www.cnblogs.com/lifo/p/11791605.html
おすすめ