4

Linux カーネルは、異なるプロセス間の共有メモリメカニズムをどのように実装していますか?

さらに詳しく説明すると、各プロセスには独自のアドレス空間があります。たとえば、プロセス A のアドレス 0x1000 は、プロセス B のアドレス 0x1000 と比較すると、異なる場所です。

カーネルは、メモリの一部が異なるアドレス空間を持つ異なるプロセス間で共有されることをどのように保証するのでしょうか?

前もって感謝します。

4

3 に答える 3

3

プロセス間通信メカニズム

プロセスは相互に通信し、カーネルと通信してアクティビティを調整します。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 つまたは複数の読み取りプロセスによって読み取られます。Linux は、メッセージ キューのリストである msgque ベクトルを保持しています。各要素は、メッセージ キューを完全に記述する msqid_ds データ構造を指します。メッセージ キューが作成されると、新しい msqid_ds データ構造がシステム メモリから割り当てられ、ベクターに挿入されます。 ここに画像の説明を入力
  • System V IPC メカニズム: Linux は、Unix TM System V (1983) で初めて登場した 3 種類のプロセス間通信メカニズムをサポートしています。これらは、メッセージ キュー、セマフォ、および共有メモリです。これらの System V IPC メカニズムはすべて、共通の認証方法を共有しています。プロセスは、システム コールを介して一意の参照識別子をカーネルに渡すことによってのみ、これらのリソースにアクセスできます。これらの System V IPC オブジェクトへのアクセスは、ファイルへのアクセスがチェックされるのと同じように、アクセス許可を使用してチェックされます。System V IPC オブジェクトへのアクセス権は、システム コールを介してオブジェクトの作成者によって設定されます。オブジェクトの参照識別子は、リソースのテーブルへのインデックスとして各メカニズムによって使用されます。これは単純なインデックスではありませんが、インデックスを生成するには何らかの操作が必要です。
  • セマフォ: 最も単純な形式のセマフォは、複数のプロセスで値をテストおよび設定できるメモリ内の場所です。テストと設定の操作は、各プロセスに関する限り、割り込み不可またはアトミックです。一度始めたら、それを止めることはできません。テストおよび設定操作の結果は、セマフォの現在の値と設定値の加算であり、正または負の値になります。テストとセット操作の結果によっては、セフォアの値が別のプロセスによって変更されるまで、1 つのプロセスがスリープ状態になることがあります。セマフォを使用して、一度に 1 つのプロセスのみを実行する必要がある重要なコードの領域である重要な領域を実装できます。

1 つのデータ ファイルからレコードを読み書きする多数の協調プロセスがあるとします。そのファイル アクセスを厳密に調整する必要があります。初期値が 1 のセマフォを使用し、ファイル操作コードの周りに 2 つのセマフォ操作を配置できます。ファイルにアクセスする最初のプロセスはセマフォの値を減分しようとし、成功します。セマフォの値は現在 0 です。結果が-1になるため、セマフォの値は失敗します。そのプロセスは、最初のプロセスがデータ ファイルで終了するまで中断されます。最初のプロセスがデータ ファイルの処理を完了すると、セマフォの値がインクリメントされ、再び 1 になります。これで、待機中のプロセスが起動され、今度はセマフォをインクリメントする試みが成功します。 ここに画像の説明を入力

  • 共有メモリ: 共有メモリを使用すると、1 つ以上のプロセスが、すべての仮想アドレス空間に表示されるメモリを介して通信できます。仮想メモリのページは、各共有プロセスのページ テーブルのページ テーブル エントリによって参照されます。すべてのプロセスの仮想メモリで同じアドレスにある必要はありません。すべての System V IPC オブジェクトと同様に、共有メモリ領域へのアクセスは、キーとアクセス権のチェックによって制御されます。メモリが共有されると、プロセスがメモリをどのように使用しているかについてのチェックはありません。メモリへのアクセスを同期するには、System V セマフォなどの他のメカニズムに依存する必要があります。 ここに画像の説明を入力

tldp.orgから引用。

于 2013-07-06T14:27:59.560 に答える
1

Linux には 2 種類の共有メモリがあります。

  1. A と B がそれぞれ親プロセスと子プロセスの場合、それぞれが独自の pte を使用して共有メモリにアクセスします。共有メモリは fork メカニズムによって共有されます。それで、すべてが良いですよね? (詳細については、カーネル関数の copy_one_pte() および関連する関数を参照してください。)

  2. 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 のアドレス空間。

于 2018-09-30T15:37:34.327 に答える