Linux カーネルは、異なるプロセス間の共有メモリメカニズムをどのように実装していますか?
さらに詳しく説明すると、各プロセスには独自のアドレス空間があります。たとえば、プロセス A のアドレス 0x1000 は、プロセス B のアドレス 0x1000 と比較すると、異なる場所です。
カーネルは、メモリの一部が異なるアドレス空間を持つ異なるプロセス間で共有されることをどのように保証するのでしょうか?
前もって感謝します。
Linux カーネルは、異なるプロセス間の共有メモリメカニズムをどのように実装していますか?
さらに詳しく説明すると、各プロセスには独自のアドレス空間があります。たとえば、プロセス A のアドレス 0x1000 は、プロセス B のアドレス 0x1000 と比較すると、異なる場所です。
カーネルは、メモリの一部が異なるアドレス空間を持つ異なるプロセス間で共有されることをどのように保証するのでしょうか?
前もって感謝します。
プロセス間通信メカニズム
プロセスは相互に通信し、カーネルと通信してアクティビティを調整します。Linux は、多数のプロセス間通信 (IPC) メカニズムをサポートしています。シグナルとパイプはそのうちの 2 つですが、Linux は、それらが最初に登場した Unix TM リリースにちなんで名付けられた System V IPC メカニズムもサポートしています。
シグナル
シグナルは、Unix TM システムで使用される最も古いプロセス間通信方法の 1 つです。これらは、非同期イベントを 1 つ以上のプロセスに通知するために使用されます。信号は、キーボード割り込みや、プロセスが仮想メモリ内の存在しない場所にアクセスしようとするなどのエラー状態によって生成される可能性があります。シグナルは、シェルがジョブ制御コマンドを子プロセスに通知するためにも使用されます。カーネルが生成できる定義済みシグナルのセット、またはシステム内の他のプロセスが生成できる一連の定義済みシグナルがあります。kill コマンド (kill -l) を使用して、システムの一連のシグナルを一覧表示できます。
パイプ
一般的な Linux シェルはすべてリダイレクトを許可します。例えば
$ ls | 広報 | lpr
ディレクトリのファイルを一覧表示する ls コマンドからの出力を、それらを改ページする pr コマンドの標準入力にパイプします。最後に、pr コマンドからの標準出力が lpr コマンドの標準入力にパイプされ、結果がデフォルトのプリンターに出力されます。パイプは、あるプロセスからの標準出力を別のプロセスの標準入力に接続する単方向のバイトストリームです。どちらのプロセスもこのリダイレクトを認識せず、通常どおりに動作します。プロセス間にこれらの一時的なパイプを設定するのはシェルです。
Linux では、パイプは 2 つのファイル データ構造を使用して実装されます。これらは両方とも同じ一時 VFS i ノードを指し、それ自体がメモリ内の物理ページを指します。図は、各ファイル データ構造に、さまざまなファイル操作ルーチン ベクトルへのポインターが含まれていることを示しています。1 つはパイプへの書き込み用、もう 1 つはパイプからの読み取り用です。
ソケット
1 つのデータ ファイルからレコードを読み書きする多数の協調プロセスがあるとします。そのファイル アクセスを厳密に調整する必要があります。初期値が 1 のセマフォを使用し、ファイル操作コードの周りに 2 つのセマフォ操作を配置できます。ファイルにアクセスする最初のプロセスはセマフォの値を減分しようとし、成功します。セマフォの値は現在 0 です。結果が-1になるため、セマフォの値は失敗します。そのプロセスは、最初のプロセスがデータ ファイルで終了するまで中断されます。最初のプロセスがデータ ファイルの処理を完了すると、セマフォの値がインクリメントされ、再び 1 になります。これで、待機中のプロセスが起動され、今度はセマフォをインクリメントする試みが成功します。
tldp.orgから引用。
Linux には 2 種類の共有メモリがあります。
A と B がそれぞれ親プロセスと子プロセスの場合、それぞれが独自の pte を使用して共有メモリにアクセスします。共有メモリは fork メカニズムによって共有されます。それで、すべてが良いですよね? (詳細については、カーネル関数の copy_one_pte() および関連する関数を参照してください。)
A と B が親でも子でもない場合、公開鍵を使用して共有メモリにアクセスします。
A がキーを使用して System V shmget() を介して共有メモリを作成し、それに対応して、カーネルがプロセス A のファイル (ファイル名は「SYSTEMV+key」) を内部 RAM である shmem/tmpfs に作成するとします。ベースのファイルシステム。kenrel によってマウントされます (shmem_init() を確認してください)。また、共有メモリ領域は shmem/tmpfs によって処理されます。基本的に、プロセス A が共有メモリ領域にアクセスすると、ページ フォールト メカニズムによって処理されます。プロセス B がプロセス A によって作成された共有メモリ領域にアクセスしたい場合、プロセス B はプロセス A が使用するのと同じキーで shmget() を使用する必要があります。その後、プロセス B はファイル ("SYSTEMV+key") を見つけて、ファイルをプロセス B のアドレス空間。