Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> プロセス間通信についての学習経験

プロセス間通信についての学習経験

  

プロセス:プロセスは、独立したアドレス空間の命令シーケンスを参照します。

プロセスの5つの状態:新規、準備完了、実行、スリープ、ゾンビ

プロセス相互通信:異なるプロセス間にはいくつかの「接触」がありますこのような接触は単純かつ複雑です。メカニズムが異なり、複雑さも異なります。通信は広義であり、大量のデータの伝送だけでなく制御情報の伝送も指しますが、使用方法は基本的に同じです。

基本的なプロセス通信メカニズム

1.伝統的なUNIX-IPCメカニズム:シグナルとパイプ

2.SystemVのIPCメカニズム:共有メモリ、セマフォ、メッセージキュー< Br>

3. Unix BSD版のソケット

4. Remote Procedure Call(RPC)

シグナル:Unixシステムで使われている最も古いプロセス非同期イベントのシグナルを1つ以上のプロセスに送信するために使用される通信方法の1つ。シグナルはDOSではINTに、Windowsでは Windows
ではイベントにたとえることができます。シグナルが発生すると、対応するシグナルが対応するプロセスに送信されます。

シグナルメカニズムの実装

1.シグナルには、処理されるシグナルとブロックされたシグナルが含まれます。

2.ブロックされたシグナルが生成された場合、保留されたままになります。ブロックが解除されるまで。

3.システムは、各プロセスがすべての可能なシグナルを処理する方法を保存します。

4.システムは、プロセスがこのシグナルを無視するのか、カーネルに処理させるのかを判断します。プロセスはシステムコールを実行することによってデフォルトのシグナル処理を変更します。

シグナルの処理

1.シグナルセットを初期化すると、シグナルセット内のシグナルのみが考慮されます。

2.シグナルプロセッサをインストールします。いわゆるシグナルプロセッサはシグナルのためのある処理方法を指定することです。設置するときは、必ず特定の信号に正しい信号処理機能を持たせてください。

シグナル関連関数

int sigaction(int signo、const struct sigaction * act、struct sigaction * oact);プロセス用のシグナルプロセッサをインストールし、struct sigactionデータ構造体はシグナル処理を節約するために使用されますデバイスに関する情報

int sigemptyset(sigset_t * set);シグナルセットを空にします。

int sigfillset(sigset_t * set);すべてのシグナルを含むようにシグナルセットを設定し、シグナルを操作する前にシグナルセットを初期化する必要があります。

int sigaddset(sigset_t * set、int signo); signoに対応する新しいシグナルをシグナルセットに追加します。

int sigdelset(sigset_t * set、int signo);シグナルセットからsignoに対応するシグナルを削除します。

int sigismember(const sigset_t * set、int signo);シグナルがシグナルセット内にあるかどうかを確認します。

int sigprocmask(int how、const sigset_t * set、sigset_t * oset);プロセスのシグナルマスクを設定します。信号マスクを使用して、特定の期間、一部の信号セットの信号をブロックできます。

パイプライン通信:これは最も古いUnix IPCツールで、1つのプロセスは1つのパイプからデータを書き込み、もう1つのプロセスはパイプのもう一方の端からデータを読み取り、パイプファイルとも呼ばれます。送信と受信の両方がパイプを使用して通信されるので、それらはパイプ通信と呼ばれます。通信方式は一方向です。パイプタイプは次のように分けられます。名前なしパイプ、名前付きパイプ

パイプ通信のアイデア

1.送信プロセスは、パイプの端からデータストリームを連続的に書き込むことができます。指定されたパイプファイルの最大長範囲(例えば、4096バイト)内では、1書き込み当たりに書き込まれる情報の長さは可変である。

2.受信プロセスは、必要に応じてパイプのもう一方の端からデータを読み取ることができ、読み取り単位の長さも可変です。

基本的なパイプ呼び出し関数

int do_pipe(int * fd);パイプを作成する

static int pipe_release(構造体inode * inode、int decr、int decw);パイプ解放

不明なPipeline II

各ファイルデータ構造に、異なるファイル操作ルーチン用のベクタテーブルテーブルへのポインタが含まれていることを示します。1つは書き込み用、もう1つはパイプラインから読み取り用です。これは通常のファイルを読み書きするための一般的なシステムコールとの違いを隠します。書き込みプロセスがパイプラインに書き込むと、バイトは共有データページにコピーされ、パイプラインから読み取られると、バイトは共有ページからコピーされます。

名前付きパイプライン:FIFOとも呼ばれます。一時的なオブジェクトではなく、ファイルシステム内のエンティティで、mkfifoコマンドで作成できます。システムは、書き込みプロセスがFIFOをオープンする前にFIFO読み取りをオープンするプロセスと、書き込みプロセスがデータを書き込む前に読み取られるプロセスを処理する必要があります。匿名パイプと同じデータ構造と操作を使用します。


(書き込み側) [Fd1]
→ pipe(fd)→ [Fd0](読み出し)

セマフォ:セマフォとシグナルは別物で、シグナルは規約を実装する固定値で、セマフォは特定の情報を記録する変数です。一度に1つのプロセスしか持っていません。

セマフォのデータ構造:セマフォを表現するにはsemid_dsデータ構造を使用します。システム内のsemid_dsデータ構造はすべて、semaryポインタベクトルテーブルによって指されます。各セマフォ配列にはsem_nsemsがあり、これはsem_baseによってポイントされるsemデータ構造体によって記述されます。

セマフォメカニズムの実装

1.セマフォにはP、Vの2つの操作しかありません。 。

2.セマフォを論理的に整理するためのセマフォメカニズムの概念の1つが、セマフォグループです。論理的に明確で管理しやすいように、関連するセマフォをセマフォグループに作成します。

3.使用前に初期化する必要もあります。指定されたセマフォが生成または削除されるセマフォグループを生成または開く。

4.セマフォはセマフォグループに属していなければなりません。そうでなければシステムで使用することはできません。

5.セマフォおよびセマフォグループはシステムによって自動的にクリーンアップされないため、プロセスが終了する前に生成されたセマフォを時間内にクリーンアップする必要があります。

セマフォ関連関数

int semget(key_t key、int nsems、int semflg);新しいセマフォグループを作成するか、既存のセマフォグループを取得します。

int semop(int semid、struct sembuf * sop、int nsops); P操作とV操作では、一度に1つ以上のセマフォを操作します。

Int semctl(int sem_id、int semnum、int cmd、共用体semun arg);セマフォの使用法に関する情報を取得したり、セマフォを制御したりするために使用されます。

共有メモリ

共有メモリはプロセス通信の重要な方法であり、プロセスに直接通信する手段を提供します。 オペレーティングシステム

1つ以上のプロセスが、それぞれの共有プロセスのページテーブル、そのアドレスによって参照される仮想アドレス空間のメモリを介して通信します。同じである必要はありません。共有メモリへのプロセスアクセスが制御され、セマフォなどのメカニズムが共有メモリアクセスの同期を実装します。

共有メモリの単純な原則

新しく作成された各メモリ領域にはshmid_dsが使用されます。表現するデータ構造これらのデータ構造はshm_segsベクトルテーブルに格納されています。 Shmid_dsデータ構造体は、この共有アクセスの大きさ、それを使用しているプロセスの数、および共有メモリがそれらのアドレス空間にどのようにマップするかを示します。共有メモリの作成者はこのメモリへのアクセスを制御し、そのキーはパブリックまたはプライベートです。十分な権限がある場合は、共有メモリを物理メモリにロックすることもできます。このメモリを共有したいすべてのプロセスはシステムコールを通して仮想メモリにアタッチされなければなりません。これにより、この共有メモリを記述するプロセス用の新しいvm_area_structデータ構造が作成されます。プロセスは、仮想アドレス空間内のメモリの場所を共有するか、またはLinuxによって十分な空き領域を選択するかを選択できます。この新しいvm_area_struct構造体は、shmid_dsが指すvm_area_structのリストに入れられます。 vm_next_sharedとvm_prev_sharedを介してそれらを一緒に接続します。

Copyright © Windowsの知識 All Rights Reserved