[Linux] マルチスレッドの概念を再理解する

1. 物理メモリとディスクの関係

物理メモリを理解するにはどうすればよいですか?

物理メモリの幅は1バイトで、
C言語を使用するとchar型(1バイト)を定義し、1バイト単位で仮想アドレス空間上のメモリにマッピングできます。

メモリがバイト単位で分割されていると思ったら実は間違い


  • ディスクから物理メモリへのデータのスワップ、またはその逆のデータのスワップは高頻度の作業です。物理ディスクは機械的なデバイスです。周辺機器としては、全体として非常に遅くなり、マシン全体の効率が低くなります
    。 IO によりアドレス指定操作が多すぎるため、非効率になります。
  • ディスクに書き込むスペースが 100MB ある場合、ディスクに 1 回書き込むのと、100 回書き込み、毎回 1MB のデータを書き込むのとではどちらが効率的ですか?
  • 必要なシーク操作は 1 回だけなので、ディスクへの 1 回の書き込みの方が明らかに高速です。
  • OSとディスクがIO連携を行う際、バイト単位ではなくブロック(4KB)単位で行われることを説明します。
  • 1 ビットのみを変更したい場合は、IO4KB も必要です。ブロックとしての 4KB は全体であるためです。

ファイルを 4KB 単位でメモリにロードするには、2 つの側面を考慮する必要があります

1. ファイルシステム + コンパイラが
周辺ディスクから 4KB を読み込みたい場合、ファイルシステムが 4KB を認識し、ファイル自体が 4KB として格納されていることが前提となるため、ファイルがディスク上にある場合、4KBファイル
はブロック単位には実行可能プログラムも含まれ
、ダイナミック ライブラリもディスク上に格納する必要があり、4KB 単位でディスク上に格納する必要があります


2. オペレーティング システム + メモリ
ディスクに 4KB の形式でデータが保存される場合、物理メモリにも 4KB のデータを保存するためのスペースが提供されます。

物理メモリ上にデータを格納する空間をページフレーム
、ディスク上のデータブロックをページ
フレームメモリと呼び、実際にメモリ管理を行う場合もその単位は4KBとなります。


メモリ管理の本質: ディスク内の特定の 4KB ブロック (データ コンテンツ) を物理メモリの 4KB スペース (データ保存スペース) に配置します。

物理メモリをそれぞれ 4KB に分割する必要があるのはなぜですか?

オペレーティング システムはこれらの構成を管理する必要があります
。管理の本質は最初に説明します。カーネルには

対応する構成を管理するための対応する構成データ構造体構造体ページがあります。
構造体ページは、この状態を含む構造体です。構成を
整理し、
アレイ方式で管理する


配列には添字があり、物理メモリ内のブロックには 0 ~ n の番号が付けられます。物理
メモリ内のどの位置が占有されているかをクエリする場合は、対応する配列の添字を見つけることで、対応する構造内の対応する状態を確認できます。割り当てられていない場合は、
setステータスを1にする


ブロックに保存した場合、余分なスペースは無駄になりますか?

コードへのアクセスがわずか 10 バイトであり、それを 4KB ブロック単位でディスクにロードすると、追加の 2KB のスペースが生じることになります。

データにアクセスしている隣接または近くのデータの早期ロードを可能にする局所性原理の特性

アクセスするデータの近くのデータをプリロードすることで、将来の IO の数を減らします
。より多くのデータをロードする本質は、データのプリロードです。

まだ理解していない場合は、クリックして表示:局所性の原則の詳細な説明


2. 仮想アドレスから物理アドレスへの変換

仮想アドレスは 32 ビットに相当します
仮想アドレスは全体として使用されるのではなく、10 +10 +12 に分割されます


ここに画像の説明を挿入

現在のページ テーブルには 2^10 行が必要です。
最初の 10 ビットのバイナリ シーケンスに従って、ページ テーブル 1 の対応する位置を見つけます。


ここに画像の説明を挿入
ページ テーブル 1 の左側は最初の 10 ビットを表し、右側は別のページ テーブルの開始アドレスを表します。次の
10 ビットに従って、ページ テーブル 2 の対応する位置を見つけます。
ページ テーブル 2 の左側は、 2 番目の 10 ビット、右側はページ フレームの開始アドレス
に対応する物理アドレス (ページ フレームの開始アドレス) + 仮想アドレスの下位 12 ビットに対応するアドレス データを表します。本質的にページ内オフセットです。

ページフレーム内の任意のアドレスに移動します

3. ページフォルト割り込み

物理メモリを適用した後、すぐに使用されない場合があります。すぐに物理メモリを適用すると、メモリは常に占有されてアイドル状態になり、効率的なパフォーマンスではありません。


実際に malloc メモリを適用する場合、オペレーティング システムは仮想アドレス空間に適用するだけで済みます。実際にアクセスすると、オペレーティング システムは自動的にページ テーブルを適用または埋めて、特定の物理メモリを適用します。


ここに画像の説明を挿入
MMU はページ テーブルを見つけることができませんが、スペースが適用されていることは事実であり、ページ フォールト割り込みがトリガーされます。OS は
適切な処理方法を実行します。つまり、ページ テーブルを満たすために物理メモリを適用します。そして戻ってコードの実行を続けます。

4. 文字定数領域はなぜ変更できないのですか?

hello world は定数領域にあり、読み取りのみ可能で変更はできないため、*s='w' は間違っています


s に格納されるのは、
*s アドレッシングが指す文字の仮想開始アドレスであり、仮想アドレスから物理アドレスへの変換が伴います。


ページテーブルを参照して操作権限を問い合わせると、読み取り権限のみで変更権限がないことが判明したため、MMU(メモリ管理ユニット)が異常となり、OSが例外を認識してシグナルを送信します。ユーザーモードでシグナル処理
実行し、プロセスを終了します。

5. スレッドのデメリット

1. パフォーマンスの低下
作成されたスレッドが多すぎて、実行されているのは少数で、ほとんどのスレッドが前後にスケジュールされているため、パフォーマンスが低下します。つまり、マルチスレッドの作成は不合理です。


2. 堅牢性の低下
スレッドに問題がある場合、プロセス全体に影響を及ぼす可能性があります。


3. アクセス制御の欠如
各実行フローは、同じアドレス空間を通じて同じリソースを参照します。

堅牢性の低下の検証

デッドループは合計 3 つありますが、実行フローが 1 つしかない場合、3 つのデッドループは実行できません。
すべて実行すると、実行フローは 3 つになる必要があります。


3 つの実行フローがあることを示しています


ここに画像の説明を挿入
LWP は軽量プロセス、つまりスレッドと呼ばれ、
各スレッドの PID が同じであるため、同じプロセスに属していることを示し、
PID と LWP が同じであるため、メインスレッドであることを示します。


スレッド 2 に不正な操作が設定され、スレッドがクラッシュしました


ここに画像の説明を挿入

実行時にセグメンテーション違反が発生します。スレッドは最初は実行できますが、セグメンテーション違反が発生するとプロセスがクラッシュします。

マルチスレッド プログラムでは、いずれかのスレッドがクラッシュし、最終的にはプロセスがクラッシュします。

アクセス制御のための認証の欠如

ここに画像の説明を挿入
グローバル変数を定義すると、スレッド 1 とメイン スレッドはグローバル変数のアドレスとグローバル変数のデータを出力し、スレッド
2 はグローバル変数のアドレスとデータを出力し、データを出力します。


1 つのスレッドのデータが変更されると、それに応じてすべてのスレッドのデータも変更されます

グローバル変数を例に挙げると、マルチスレッドのシナリオでは、複数のスレッドが同じグローバル変数を参照します。

おすすめ

転載: blog.csdn.net/qq_62939852/article/details/130733236