Linuxオペレーティングシステムのプログラム開発
予選:
図1に示すように、プロセスの操作は:Linuxシステムであるのマルチタスクオペレーティングシステムの使用方法をとして、タスクスケジューリング部、 Linuxシステムの下でプロセスの概念は、オペレーションコードおよび実行に必要なデータ、パラメータ、および他のリソースを含むプログラムコードの最初の実行です。
図2は、プロセスおよび手順の間の差:一方では:プログラムの実行、実行可能なプログラム、ダイナミックコンセプトはあったので、Linuxシステムでは、プロセスは、プログラムコードを実行しているが、ディスクまたは他の上に格納されたプログラムを指し静的コード記憶媒体。一方:プロセスは、プログラムに基づいて実行され、メモリにロードされたプログラムは、複数のプロセスを形成するために繰り返すことができます!
。3、CPUのタイムスライス(1msの約Linuxシステム):各プログラムの時間に割り当てられ、すなわちCPUタイムスライスは、各スレッドは、そのタイムスライスと呼ばれる、プロセスの実行を許可されている時間期間が割り当てられます。
4、Linuxシステムプロセスは、巨視的顕微鏡(CPU)シリアルパラレル。巨視的に平行:複数の処理を同時に開くことができ、各プロセスはタイムスライスと優先順位を有しています。マイクロシリアル時:各タイムスライスでCPU、各プロセスは、優先度の高いプロセスの確率が実行されている大きなを実行する機会を持っています。タイムスライスの終わりには、プロセスがまだ実行されている場合、CPUは奪うと、別のプロセスに割り当てられます。タイムスライスの終了前に処理を終了するかは、ブロックされた状態を入力した場合、CPUはすぐに切り替え!CPUは、プログラムの一部のみを実行します。
5、MMUとマルチプロセスのシステム。
図6に示すように、PID(プロセスIDプロセスID):Linuxシステムでは、各プロセスが有するプロセスID(PID)を、すべてのプロセス使用ツリー構造組織。最初のプロセスが開始されたときにLinuxシステムのルート・プロセス、システム上の他のプロセスへのプロセスをさらに呼び出し。Linuxシステムでは、との間に明確なプロセスがあるの継承すべてのプロセスがある、のPID initプロセス1子孫。
図7に示すように、親と子プロセス:Linuxシステムは、各プロセスが持っている必要があり、親プロセスを、それに応じて、各プロセスは、サブプロセスのゼロ以上であってもよいです。すべてのプロセスと親プロセスが呼び出されてい弟。格納されたプロセス間の関係プロセス記述子task_structです。各task_structには、親のtask_structへのポインタが含まポインタの親もの子どもたちと呼ばれる、子プロセスのリストを。
図8に示すように、スレッドが作成され、別のスレッド、同じプロセス内の複数のスレッドに破壊することができ、同時に実行します。
図9に示すように、既存のプロセス、交換処理、initプロセス、デーモン
図10は、ゾンビプロセスは、孤立します
11、プロセス環境:
12、プロセスの記述:
13、グループ識別コード(gid-グループID):各ログインユーザが、少なくとも二つのIDをとるであろう、ユーザID(ユーザIDは、UIDと呼ばれる)、ユーザグループID(グループIDは、GIDと呼ぶ)は、それぞれファイルには、ユーザーIDとグループIDのいわゆる所有者です。
図14に示すように、PCB(進行制御ブロック- プロセス制御ブロック)、PCBシステム、プロセス制御およびプロセス記述を介し。Linuxシステムでは、PCBはあるtask_struct構造。
15、メモリ割り当て処理(32ビットOS)の模式図:すべてのプロセスと共有に比べカーネル空間およびユーザ空間、カーネル空間カーネル。
Linuxオペレーティングシステムの処理機能:
1、フォーク/のvfork、子プロセスを作成します
2、機能のEXECファミリー:EXECV / EXECL、execp /のexeclp、はexecve / execle; exec関数を使用することができ、現在のプロセスを置き換えるために新しいプロセスであり、元のプロセスと新しいプロセスが持つ同一のPIDを、あろうプロセス作成およびロード新規のプロセス・画像分離。
int型EXECL(のconstのchar *のパス、constのchar型*引数、...);
int型のexeclp(のconstのchar *ファイル、constのchar型*引数、...);
INT execle(CONSTチャー*パス、CONSTのchar *引数、...、CHAR * CONST envpを[])。
INT EXECV(CONSTチャー*パスチャー* CONST ARGV [])。
int型execvpの(のconstのchar *ファイル、CHAR * constのARGV []);
INTはexecve(CONSTチャー*パス、CONSTのchar * argvの[]、CHAR * CONST envpを[])。
説明:
pathパラメータを使用すると、パス名を含めて起動するプログラムの名前を示します
ファイルのパラメータは、ファイルコマンドの名前を示します
argパラメータは、パラメータは、一般的な最初のパラメータによって運ばれるプログラムは、あなたがいないパスで、実行したいコマンドの名前で開始し、引数NULLで終了する必要がありますを表し
argvのパラメータは、コマンドに渡されるパラメータであり、NULLの配列が終了します
envpをパラメータは、環境変数の配列です
3、GETPID、getppid:GET進行コード
setpgid 4:指定されたプロセスセットグループ識別コードを、はgetpgid:指定されたプロセスの取得グループ識別コード(のsetpgrp、のgetpgrp特殊パラメータ0)
5、のsetpriority:指定されたプロセス、プロセスグループ、ユーザ設定の優先順位、getpriority:指定された取得処理(プロセス)、プロセスグループ(PIN)またはユーザ(ユーザID)の優先度を、優先度は-20〜20値が大きいほど優先順位整数の間、大きいです。
6、待機/ waitpidの:中断または終了した子プロセスを待って、現在のプロセスを一時停止します。、パラメータの説明を待つ:待ち時間(int型*ステータス)pid_t、子プロセス割り込み、または終了状態の保存状態がNULLに設定することができ、子プロセスのリターンプロセスIDが中断または終了されます。waitpidを、パラメータ:pid_tはwaitpidのは、(PIDのpid_t、ステータスのint *、INTオプション) すべてのサブプロセスの同じグループ識別コードと、子プロセスを保存するステータスが中断され、または終了状態は、セットすることができる:PIDは:-1 0任意の子プロセスを表しますそれがNULLである;オプション; 0; WNOHANG(子プロセスが終了するが、すぐに返されない場合)、WUNTRACED(子が返された場合は、直ちに中止); WNOHANG | WUNTRACED(またはいずれか)、
7、プロセスの終了関数:
_exit: 、プロセスの実行が停止指示し、その使用のメモリ空間をクリアし、カーネルにそのさまざまなデータ構造をクリアします。終了()関数と_exit()関数があるの最大の違いは、するには、exitシステムコールを呼び出す前に、出口()関数のことであるケースを開くために、ファイルをチェックし、ファイルの書き込みバッファファイルの内容」、またはクリーンアップのI / Oバッファ。 "
atexitを:ISO Cの要件、プロセスはまで登録することができる32個の機能、これらの機能はされ、自動的に終了しますによって呼び出された関数が呼び出され、終了関数、および登録するには、コール関数のatexitこれらの関数を。
ON_EXIT:
Linuxオペレーティングシステムのセマフォと操作機能:
予選:
0、クリティカル領域が指す同じ時間だけが存在することができるでコードつのプロセスの実行コードセグメント。:デッドロックプロセスの修正後の重要な領域へのセマフォ、崩壊または「キル(キル)」ので、しかし、セマフォ上で保留中のいずれかが実行されることはありません、クリティカルセクションを終了しませんでした機会。
1、排他的なリソースとリソースの同期。リソース相互に排他的で:ながらリソースを指すのみ許可、アクセスそれへの訪問者を有するユニークかつ排他的な、例えば、デッドロック:プロセスA Aフットプリント、アプリケーションリソースB、BプロセスBのフットプリント、アプリケーションリソースAそれは、リソース専用ケース「デッドロック」になります。リソースの同期:相互に排他的に基づいて他のメカニズムを通じてリソースへの訪問者を達成するために、(ほとんどの場合)である整然としたアクセス。
図2に示すように、二つの主要なプロセス、同期と相互排他の交点との間の関係。
図3に示すように、処理リソースと同期して、いくつかの相互に排他的な方法:スピンロック、セマフォ、ミューテックスおよびアトミック変数。
図4は、信号量である一種を効果的プロセスミューテックス間でリソースとの同期を処理することができるロック機構、セマフォであるカウンタ。セマフォは示して利用可能なリソースの数を。二つセマフォ操作、P、およびV:P、セマフォを待っているセマフォ値が0、プログラム待機あり、信号値が0より大きい場合に信号マイナス1、プログラムは継続する(動作に必要な処理リソース) 。V、送信信号の量信号の大きさプラス1、(リソースを生成する処理)。
図5に示すように、Linuxで通信機構(IPC)は:パイプ、メッセージキュー、チャネル番号、信号値、共有メモリ(最速IPCモード)、共有マップファイル、ソケット(異なるマシン間のプロセス間通信)ように。
図6に示すように、セマフォ収集メカニズム:複数のプロセス(キュー構造)が得られるためであるより重要なリソース(セマフォ配列)機能するためにした後、これはセマフォ回収機構。プロセスが中断されている場合は、Linuxの動作状態は、待機キュー(にセマフォと、現在のプロセスを保存する必要がありますもし、sem_queue)。
7、スレッドが占有リソースを:共有メモリ、匿名パイプ、スペースのうちのmalloc、ソケット記述子、ファイルディスクリプタ記述子、スレッドロック。
注意: 2019年10月26日18時07分53秒を、リソースは、それらのスレッドがありますか?リソースと仮想メモリであるとの間の関係は何ですか?なぜリソースが別のプロセスによって占有することはできませんが、それを解放するために?呼ばれる別のポインタを使用して、異なるプロセス、および仮想空間(共有カーネル空間を削除)独立していることで、プログラムがメモリに各プロセスをロードし、その後、レジスタにされていない、これはメモリにロードされ独立していませんコード?非常にユニークであるレジスタなので、その相互に排他的なリソースがあるでしょうか?個人的な理解は、辞書信号によって実装されるデータ構造、およびキー信号の値が設定されています。
8、セマフォデータ構造(SEM):
SEM {構造体 のint semvalの値に、 セマフォの/ *現在の値* / INT sempid; / *最後のプロセス識別子セマフォ操作で* }。
図9に示すように、データ構造セマフォセット(sem_ds):
たsemid_ds {ストラクト 、構造体するipc_perm sem_perm / * IPC許可* / ; sem_otimeにロング / *前回セマフォ操作回(のsemop)* / sem_ctimeにロング; / *最後に、この構成変更時間* / 構造体のSEM * sem_base ; / * 最初のセマフォセマフォ配列ポインタをポイント * / 構造体もし、sem_queue * sem_pending; / * サスペンド操作保留中 * / 構造体もし、sem_queue ** sem_pending_last; / *最後の保留中の操作* / 構造体SEM_UNDO *アンドゥ、このアレイ上の/ *アンドゥ要求* / USHORT sem_nsemsに; / *セマフォセマフォ数でアレイ* / }。
10、キュー構造(各信号システム設定の量もし、sem_queue)
もし、sem_queue {構造体 構造体もし、sem_queue *次の; / *次のキュー・ノード* / 構造体もし、sem_queue ** PREV、キュー内の/ *以前のノード、*(Q-> PREV)== Q * / 構造体wait_queue *スリーパー; / *プロセス* /眠っている 構造体SEM_UNDO *使用アンドゥを; / *使用アンドゥ構造* / INT PID; プロセスID / *要求プロセス* / INT状態を、操作の/ *完了ステータスが* / たsemid_dsをストラクト SMAを*; / *操作セマフォ連想配列* / sembufストラクト *のSOPを; / *保留中の操作のアレイ* / nsops int型; / *操作の数* / }。
11、3つのデータ構造との関係
機能セマフォ操作(システムコール):
。1、semgetから(key_tのキー、NSEMSがintで、semflgをINT)、信号のセットを作成し、開き
2、semop ( int semid, struct sembuf *sops, unsigned nsops),根据索引值,对指定的信号量进行指定的操作(P、V操作)
一、sops参数指向类型为sembuf的一个数组
struct sembuf { ushort sem_num; /* 在数组中信号量的索引值 */ short sem_op; /* 信号量操作值(正数、负数或0) */ short sem_flg; /* 操作标志,为IPC_NOWAIT或SEM_UNDO*/ };
注:1、sem_op为负数,那么就从信号量的值中减去sem_op的绝对值,这意味着进程要获取资源,如果sem_op是正数,把它的值加到信号量,这意味着把资源归还给应用程序的集合。
命令(cmd) |
解 释 |
IPC_STAT |
从信号量集合上检索semid_ds结构,并存到semun联合体参数的成员buf的地址中 |
IPC_SET |
设置一个信号量集合的semid_ds结构中ipc_perm域的值,并从semun的buf中取出值 |
IPC_RMID |
从内核中删除信号量集合 |
GETALL |
从信号量集合中获得所有信号量的值,并把其整数值存到semun联合体成员的一个指针数组中 |
GETNCNT |
返回当前等待资源的进程个数 |
GETPID |
返回最后一个执行系统调用semop()进程的PID |
GETVAL |
返回信号量集合内单个信号量的值 |
GETZCNT |
返回当前等待100%资源利用的进程个数 |
SETALL |
与GETALL正好相反 |
SETVAL |
用联合体中val成员的值设置信号量集合中单个信号量的值 |