シングルプロセッサシステムでは、所与の瞬間にのみプログラムは、物理CPUの数に応じて、マルチプロセッサ・システム上で同時に実行中のプロセスの実際のデータを実行することができます。
プロセスの優先度
概略的分割で、リアルタイムと非リアルタイム処理の処理へのプロセス。
厳しい時間制限付き1.ハード・リアルタイムプロセスは、特定のタスクは、指定された時間内に完了しなければなりません。
2.ソフトリアルタイムプロセスは、ハードリアルタイムプロセスの弱められた形、迅速できるだけ早く結果を取得する必要がありますが、それでも多少遅れることが強制です。
3.プロセスのほとんどは無特定の時間に制約のある通常のプロセスである、彼らは重要で優先順位を割り当てることができます。
以下の動作は、タイムスライスの割合がかなり重要それに対応するプロセスに与えられ、タイムスライシングプロセスに応じて、図のCPU時間が割り当てられ、ディスクが回転する時に対応するフローシステムは、スキャナCPU隣周囲が対応し、正味の効果はありますすべてのプロセスにもかかわらず、実行する機会を持っていますが、重要なプロセスは、二次プロセスよりも多くのCPU時間を取得します。
様々なプロセスは、異なるプロセスを実行するように、カーネルは関係なく、プロセスの実行前に、プロセスから制御を取り戻すだろう、時間が経過し実行した後、一定の時間を実行してきた。この方法では、プリエンプティブマルチタスクと呼ばれていますミッションに、プロセスが先取り動作環境が保存されている、プロセスが実行を再開し、そのプロセス環境にも完全に復元され、タイムスライスの長さは変化の過程の重要性に応じて異なるものになります。
プロセスのライフサイクル
ディスパッチャは、プロセス間で切り替えたとき、システムは、各プロセスの状態を知っていなければなりません。
プロセスは、次の状態を持っていることがあります。
1.ファイル名を指定して実行:現時点では、プロセスが実行されています。
2.待ち:プロセスを実行することができますが、CPUが別のプロセスに割り当てられているので許可なしに、タスクスケジューラは、次回のプロセスを選択するように切り換えることができます。
3.スリープ:プロセスは、それが外部イベントを待っているため実行できません、眠っている、プロセススケジューラは、次のタスクスイッチを選択することはできません。
4.終了:プログラムの実行状態の終了後、
5.ゾンビ:子プロセスが終了するのではなく、親が資源回復をwait4呼び出しません。
パス1:プロセスがスリープ状態に状態を実行しているからステートスイッチ、イベント発生を待つ必要があります。
パス2:リソーススケジューラのCPUは、プロセスから引き出され、状態が待機状態の動作状態から切り替えられました。
パス3:プロセスの状態を実行するために、1つのスリープ状態から切り替えることはできませんが、イベントのために待機した後、最初のバック状態を待つように。
パス4:現在のプロセスにCPU時間を割り当てるためのスケジューラは、そのステータスが動作モードに待機状態から切り替えられました。
パス5:プログラムの実行が終了した後、状態は停止状態に動作状態から切り替えられました。
プリエンプティブマルチタスク
Linuxのプロセス管理構造は、2つの状態に必要:ユーザモードとカーネルモードを、
処理が正常にだけ自分のデータにアクセスすることができ、ユーザモードになり、他のアプリケーションに干渉しないことができるシステム。
プロセスは、システムのデータや機能にアクセスしようとする場合は、カーネルモードために、ユーザーモードから切り替える必要があり、以下の2つの方法で切り替えます:
1.システムコールは、カーネルモードに、プロセスを開始します。
2.割り込みは、それは予測不可能起こったのか何回、自動的にトリガ。
プリエンプティブなスケジューリングモデルは、他の状態の状態をプリエンプトすることができるプロセスを決定するために、次のカーネル・レベルを確立しました。
1.通常のプロセスは、常に他のプロセスによってプリエンプトすることさえつかむことができます。
2.システムのカーネルモードの呼び出し、他のプロセスが横取りすることはできませんが、割り込みシステムコールを先取りすることができます。
3.プロセス割り込みが最も高い優先度を有し、ユーザーモードとカーネルモードを先取りすることができます。
プロセスの状態task_struct->状態
カーネルは、関連するが、周りのtask_struct構造が確立されて回転するのメンバーは、プロセスとカーネル・サブシステムを連結される処理するためのアルゴリズムを必要とします。
次のようにフィールドを含む状態のプロセスは、以下のとおりです。
1つの 構造体task_struct { 2 揮発性 長い 状態。 3 }
状態は、プロセスの現在の状態を指定するには、次のいずれかを使用できます。
TASK_RUNNING-プロセスが実行可能である、プロセスは、スケジューラCPU時間によって割り当てされている可能性が実行されている、それが行われ、次のスケジューラを待って自分の時間をスケジュールすることができる。状態は、プロセスが外部イベントを待たずに、すぐに実行できることを保証します。
TASK_INTERRUPTIBLE-プロセスが中断することができ、カーネルはプロセスにシグナルを送り、スリープ状態に入る、いくつかのイベントや他のリソースを待つ必要がある限り、スケジューラが実行を再開するためのプロセスを選択すると、イベントが発生したことをTASK_RUNNINGへの状態のプロセスを示しています。
カーネル指標ため障害者のためのTASK_UNINTERUPTIBLE-、睡眠を中断することはできません。この状態のプロセスは、外部からの信号によりウェイクアップすることができない、それだけで、カーネルの実父で目が覚めることができます。
TASK_STOPPED-は、プロセスが故意に実行を停止することを示しています。
TASK_TRACED-は通常デバッギングプロセスとプロセスを区別するために使用されます。
両方のプロセスのステータス・フィールドの状態のために次の定数はまた、終了ステータスをクリアするために使用されるEXIT_STATEフィールドを使用することができます。
EXIT_ZOMBIE-ゾンビ状態。
前に、唯一のより多くのスレッドがコールが発行されるまで待機EXIT_DEAD待ちシステムコールが発行されており、プロセスが完全にシステム状態から削除され、状態は同じプロセスのために理にかなっています。
プロセスリソース制限状態 - >シグナル - > RLIM []
Linuxは、システムリソース・プロセスの使用に一定の制限を課して、次のように、その構造が定義されている、制約をリソースへのメカニズムを提供します。
1つの 構造体RLIMIT { 2 __kernel_ulong_tのrlim_curが。 3 __kernel_ulong_t rlim_max; 4 }。
rlim_cur-現在のプロセスのリソース制限、ソフトリミットと呼ばれます。
最大許容値を制限rlim_max-、ハードリミットと呼ばれます。
setrlimitシステムは、増加または電流制限を減少したが、指定された値rlim_maxを超えることができない、はgetrlimitシステムが電流制限をチェックするためにコールされるコール。
1つ の#include <SYS / TIME.H> 2 の#include <SYS / RESOURCE.H> 3 4 int型はgetrlimit(INTのリソース、構造体 RLIMIT * RLIM)。 5 int型はsetrlimit(int型のリソース、constの 構造体 RLIMIT * RLIM)。
次のように処理リソース制限パラメータは次のとおり
あなたは、リソースの制限(デフォルト設定)の特定の種類を使用しない場合は、設定RLIM_INFINITYをrlmi_max、例外は次のとおりです。
1.開いているファイルの数 - デフォルトは1024です。
2. MAX_THREADS / 2として定義されたユーザごとのプロセスの最大数、; MAX_THREADSは、スレッド情報を管理するためのメモリの1/8の場合には、スレッドの数が利用可能な指定、グローバル変数を作成することが可能であり、計算にメモリ20件のスレッドの最小可能量が与え進めます。
生成処理
新しいプロセスが生成されたフォークとexecシステムコールを使用します
子プロセスと呼ばれ、現在のプロセス同一のコピーを生成1.フォーク。
代わりに、現在実行中のプロセスを、実行可能バイナリファイルからアプリケーションをロードする2. EXEC。
Linuxはまた、フォークに似たクローンシステムコールを、提供していますが、新しいプロセスは親プロセスとは独立していない、あなたは親プロセスでいくつかのリソースを共有することができ、あなたは、リソースの種類を指定することができます共有して複製する必要があります。スレッドを実装するために使用されるクローンが、唯一のシステム呼び出しは、あなたも、スレッドの実装を完了するためにユーザ空間のライブラリを必要とすることを行うのに十分ではありません。
プロセスを終了します
进程必须用exit系统调用终止,这使得内核有机会将该进程使用的资源释放回系统;该函数的实现就是将各个引用计数减1,如果引用计数为0,则说明没有进程继续使用对应的结构,那么将相应的内存区域返还给内存管理模块;
进程ID号
进程总会分配一个号码用于其命名空间的唯一标识,称为PID;用fork或者clone产生的每个进程都有内核自动的分配了一个新的唯一的PID;
分配一个空闲的PID,本质上等同于寻找位图中第一个值0的比特,接下来将该比特设置为1;反之,释放一个PID可以通过将对应的比特从1设置为0来实现;
除了PID之外,还有以下几种ID类型:
1. 线程组ID(TGID):处于某个线程组中的所有进程都有统一的线程组ID;如果进程没有线程组,那么其PID和TGID相同;线程组中的主进程被称为组长,通过clone创建的线程的task_struct->group_leader成员指向组长的task_struct;
2. 进程组ID:独立进程可以合并成进程组(使用setpgrp系统调用),进程组成员的task_struct->pgrp属性都是相同的,即进程组组长的PID;进程组简化了向组所有成员发送信号的操作;另,用管道连接的进程包含在同一个进程组中;
3. 会话ID:几个进程组可以合并成一个会话;会话中所有进程都有相同的会话ID,保存在task_struct->session成员中;会话ID可以使用setsid系统调用设置;
对于命名空间而言,子命名空间中的所有PID对父命名空间是可见的,但是子命名空间无法看到父命名空间的PID;为此,需要区分局部ID和全局ID;
全局ID:内核本身和初始命名空间中的唯一ID号;
局部ID:属于某个特定命名空间,不剧本全局有效性;