ディレクトリ
- 知識の蓄積
- ミューテックスの処理
- プロセスの同期
- プロセス通信
- グアンチェン
- プロセスとスレッドの違い
- スレッドの実装
知識の蓄積
(注:以下を読むときに見つけるために、このモジュールを直接スキップすることをお勧めします)
1.並列と並行の違い
並行性:2つ以上のイベントが同じ時間間隔で発生します
並列:2つ以上のイベントが同時に発生します
2.ユーザーモードとコアモード
ユーザー状態(目の状態、通常の状態):ユーザープログラムまたはコア以外のオペレーティングシステム、非特権命令のみを実行します
コア状態(管理状態、特別な状態):オペレーティングシステムカーネルを実行し、非特権命令と特権命令を実行します
3.プリミティブ
プリミティブとは、分割または中断されることなく特定の機能を実行する一連の操作を指します。プリミティブは並行性を達成できません!
プロセス制御プリミティブ:プロセスの確立、プロセスのキャンセル、プロセスの待機、およびプロセスのウェイクアップ。
4.マルチコアCPUとマルチCPUの違い
マルチコアCPUとシングルコアマルチCPUの違いは、主にパフォーマンスとコストです。マルチコアCPUは最高のパフォーマンスを発揮しますが、コストは最も高くなります。マルチCPUは低コストで安価ですが、パフォーマンスは比較的低く、現在ほとんどがマルチコアCPUです。
5.シングルプロセスマルチスレッドおよびマルチプロセスシングルスレッド
シングルプロセスマルチスレッドとマルチプロセスシングルスレッドの比較は、後者よりも高速です。これは、マルチプロセスシングルスレッドCPU切り替えが1つのプロセスから別のプロセスへであり、シングルプロセスマルチスレッドCPU切り替えがプロセス内でのみ、各プロセススレッドには保存する独自のコンテキストスタックがあり、プロセス間の切り替えにより多くの時間が消費されます。
マルチプロセスシングルスレッドにも利点があります。それは保護メカニズムを提供し、プロセス(ノード)の内部読み取りエラーが発生すると、マスターが再起動できるようにして、Nginx、JAVAなどの他のプロセス(マスターを含む)を作成します。シングルプロセスマルチスレッドでは、1つのスレッドに障害が発生すると、プロセス全体がハングする可能性があり、シングルプロセスマルチスレッドの実現も非常に困難です。
6.オペレーティングシステムカーネルとは:
オペレーティングシステムカーネルは、ほとんどのオペレーティングシステムの中核部分を指します。これは、メモリ、ファイル、周辺機器、およびシステムリソースの管理に使用されるオペレーティングシステムの部分で構成されています。オペレーティングシステムカーネルは通常、プロセスを実行し、プロセス間の通信を提供します。
7.重要なリソースと重要な地域
-
重要なリソース
重要なリソースは、一度に1つのプロセスのみが使用できる共有リソースです。各プロセスは相互に排他的な方法を採用しており、共有リソースはクリティカルリソースと呼ばれます。重要なリソースに属するハードウェアには、プリンター、テープドライブなどが含まれ、ソフトウェアには、メッセージキュー、変数、配列、およびバッファーが含まれます。プロセスは相互排除を使用して、そのようなリソースの共有を実現します。 -
クリティカルセクション
クリティカル領域(クリティカルセクション)と呼ばれるコードの各工程のアクセス重要なリソースには、入力した後、クリティカルセクションを入力するだけの処理を可能にする、他のプロセスが入ることを許可されていません。ハードウェアクリティカルリソースかソフトウェアクリティカルリソースかに関係なく、複数のプロセスが相互に排他的にアクセスする必要があります。**複数のプロセスが同じクリティカルリソースを含むクリティカルセクションは、関連クリティカルセクションと呼ばれます。クリティカルセクションを使用する場合、通常、あまり長く実行することはできません。クリティカルセクションで実行されているスレッドが終了しない限り、このクリティカルセクションに入る他のすべてのスレッドは中断され、待機状態になり、プログラムのパフォーマンスにある程度影響します。ランニングパフォーマンス。 -
クリティカルセクションは軽量の同期メカニズムです。相互排他やイベントなどのカーネル同期オブジェクトと比較すると、クリティカルセクションはユーザーモードのオブジェクトです。つまり、スレッドは同じプロセス内でのみ相互排他的です。ユーザーモードとコアモードを切り替える必要がないため、相互排他よりもはるかに作業効率が高くなります。クリティカルセクションの同期速度は非常に高速ですが、プロセス内のスレッドの同期にのみ使用でき、複数のプロセスのスレッドの同期には使用できません。https://blog.csdn.net/weixin_41413441/article/details/80548683
から転送
プロセスとスレッドは相互に排他的です。
- 相互排除は競合するリソースによって生成されます
- 資源競争は問題をもたらす:デッドロック問題、飢餓問題
- プロセスを相互に排除するには、一度に1人のビジターのみがリソースにアクセスできる必要があります。これは一意で排他的です。ただし、相互排除では、訪問者がリソースにアクセスする順序を制限できません。つまり、アクセスは順不同です。
- ミューテックスは、プロセスの相互排除に使用されます。ミューテックスのロックとロック解除は、共有リソースへの個別のアクセスを調整するように設計された同じプロセスで対応して使用する必要があります。
- 相互に排他的な実装方法:(1)クローズ割り込み(2)ロック(3)ハードウェア命令(TS、スワップ)(4)セマフォ(整数セマフォ、レコードセマフォ、およびセマフォ、セマフォセット) )
プロセスとスレッドの同期:
- 同期は協力によって形成されます。
- 特定のプロセスは、同じタスクを実行するために分業とコラボレーションを必要とします。協力の各プロセスは予測できないスピードで独立して進行するため、特定の調整ポイントで作業を調整するために相互に調整されたプロセスが必要です。協調プロセスの1つがコーディネーションポイントに到達すると、パートナープロセスから送信されたメッセージまたはシグナルを受信する前に、他の協調プロセスがコーディネーションシグナルまたはメッセージを送信して起動し、実行を継続するまで、ブロックする必要があります。互いのメッセージまたはシグナルを待っている協調プロセス間のこの調整された関係は、プロセス同期と呼ばれます。ほとんどの場合、同期はすでに相互排他を実現しています。特に、すべての書き込みリソースは相互に排他的でなければなりません。いくつかのケースは、複数の訪問者が同時にリソースにアクセスできるようにすることを意味します。
- セマフォは、プロセスの同期に使用されます。セマフォは、あるプロセスで解放し、別のプロセスで取得できます。これは、限られた数のユーザーでリソースを制御するように設計されています。セマフォは必ずしも特定のリソースではなく、プロセスの概念です。たとえば、プロセスAとBの2つがあります。プロセスBは、プロセスAが特定のタスクを完了するのを待ってから、独自のステップを実行する必要があります。このタスクは必ずしも必要ではありません。それは特定のリソースをロックすることです、またはそれはいくつかの計算またはデータ処理に使用することができます。
- 同期の実装方法:(1)セマフォ(記録されたセマフォ、And-typeセマフォ、セマフォセット)(2)管理(注:これら2つのメソッドは待機する権利を実現します)
- プロセス同期メカニズムが従うべき原則は、アイドルイールド、ビジー待機、限定待機、および待機する権利です(プロセスが独自のクリティカルセクションに入ることができない場合、プロセスが「ビジー待機」状態になるのを避けるために、プロセッサをすぐに解放する必要があります)。
プロセス通信
- 同時プロセス間の相互作用は、同期と通信の
2 つの基本要件を満たしている必要があります。2。プロセス同期はプロセス通信の一種です。セマフォを変更することで、プロセスは接触を確立して操作を調整し、相互に作業を調整できます。**ただし、セマフォとPV操作は信号のみを転送でき、データを転送する機能はありません。**場合によっては、プロセス間で交換される情報量は非常に少ないですが(特定の状態情報のみが交換されます)、多くの場合、大量のデータをプロセス間で交換する必要があります。たとえば、情報のバッチやファイル全体を転送する必要がある場合があります。完了する新しい通信メカニズム。プロセス間で情報を交換するプロセスは、プロセス通信IPCと呼ばれます。 - 高度な通信には、共有ストレージシステム(一部の場所は共有メモリ領域と呼ばれる)、メッセージングシステム(一部の場所はメッセージキューと呼ばれる)、およびパイプ(一部の場所は共有ファイルになる)の3つのタイプがあります。
- プロセス同期とプロセス通信の比較
同期は主に重要なセクション、相互排除、セマフォです
プロセス間通信はパイプライン、メモリ共有、メッセージキュー、セマフォ、ソケットです
チューブ:
- 管理プロセスの定義:管理プロセス(英語:モニター、モニターとも呼ばれます)はプログラム構造であり、管理プロセスは、データ構造と、並行プロセスで実行できる一連の操作を定義します。管理データを変更します。
- 管理を導入する理由:セマフォメカニズムの導入により、プロセス同期の記述の問題が解決されますが、各プロセスに散在する多数のセマフォ同期操作は管理が容易ではなく、システムのデッドロックにつながる可能性があります。特定の重要なリソース上のすべてのプロセスの同期操作は、いわゆる秘書プロセスを形成するために集中されます。この重要なリソースにアクセスするプロセスは、最初に秘書に報告する必要があります。秘書は、プロセスによる同じ重要なリソースの相互排他的な使用を実現します。
- 重要な機能:管理プロセスは高度な同期プリミティブであり、管理プロセスでは常に1つのアクティブプロセスしか存在できません。これはプログラミング言語のコンポーネントであるため、コンパイラーはそれらが特殊であることを認識しています。
- パイプとパイプの違い:パイププロセスはプロセスの同期を実現し、パイプはプロセス通信を実現します。
- チューブの実現:Hallチューブ、Hansenチューブ(Java実装リファレンス記事)
スレッドの紹介
-
スレッドを導入する理由:プロセスはリソースの所有者であるため、システムは作成、取り消し、および切り替え時に大きな時空間オーバーヘッド(I / Oデバイス、メモリスペース、PCB)を支払う必要があります。並行性の度合いを高めるために、スレッドが導入されています。
-
プロセスとスレッドの違い
プロセス:特定のデータセットで実行中のアクティビティに関する特定の独立した機能を持つプログラム。プロセスは、システムによるリソースの割り当てとスケジューリングのための独立したユニットです。プロセスには、少なくともメインスレッドとワーカースレッドが含まれます。
スレッド:プロセスのエンティティは、CPUのスケジューリングとディスパッチの基本単位です。これは、プロセスよりも小さく、独立して実行できる基本単位です。スレッド自体は、基本的にシステムリソースを所有せず、動作中のいくつかの必須リソースのみを持ちます(プログラムカウンター、レジスタのセット、スタックなど)が、プロセスが所有するすべてのリソースを、同じプロセスに属する他のスレッドと共有できます。
相違点:
(1)プロセスとスレッドの主な違いは、オペレーティングシステムのリソース管理方法が異なることです。プロセスには独立したアドレススペースがあります。プロセスがクラッシュした後、プロテクトモードの他のプロセスには影響しません。スレッドには独自のスタック変数とローカル変数がありますが、スレッド間に個別のアドレス空間はありません。
(2)スーパーバイザは、スレッド同期ではなくプロセス同期を実現します。
(3)スレッド通信とは、メインスレッドと、プロセスのスコープ内のワーカースレッドまたはワーカースレッドとの間の通信です。プロセス通信は、通常、異なるプロセスのスレッド間の通信を指します。アドレス空間が異なるため、オペレーティングシステム関連のメカニズムを使用して「転送」する必要があります。 "、共有ファイル、パイプ、ソケットなど。
スレッドの実装
-
カーネルサポートスレッド(KSP):
利点:オペレーティングシステムがスレッドを制御し、シングルプロセスマルチコアパラレルを実現できます。
短所:スレッドのスケジューリングと切り替えはコア状態で実行する必要があるため、ユーザーモードスレッドをコア状態に切り替える必要があります。これは、ユーザープロセスでのユーザー状態でのスレッド切り替えにはコストがかかります。 -
ユーザーレベルのスレッド(ULT):
利点:(1)カーネルはユーザーレベルのスレッドの存在を完全に認識せず、ユーザーは任意の数のスレッドを作成できます。(2)スレッドの切り替えをカーネルスペースに変換する必要がないため、モード(ユーザーモード、コアモード)間の切り替え時間を節約できます。(3)スケジューリングアルゴリズムはプロセス固有であり、OSの低レベルスケジューリングアルゴリズムに依存しない(4)マルチスレッドは、スレッドメカニズムをサポートしないプラットフォームに実装できます。短所:(1)ラウンドロビン方式は、プロセスを1つの単位としてスケジュールする(プロセスにタイムスライスを割り当てる)のに使用されますが、 KSPはスレッドを1つの単位として使用します。リソースの偏在を引き起こします。(2)スレッドがブロックされると、プロセス内の他のスレッドもブロックされます。KSPでは、プロセス内の他のスレッドは引き続き実行できます。(3)ULTはマルチプロセッサによるマルチプロセッシングに適していません。カーネルはプロセスに一度にコアを与えるため、プロセス内の1つのスレッドしか実行できません。スレッドがCPUを放棄するまで、他のスレッドは待機することしかできません。
-
混合スレッド:
利点:KST + ULT。結合スレッドでは、同じプロセスの複数のスレッドを同時に複数のプロセッサで並列に実行でき、スレッドをブロックするときにプロセス全体に注意を払う必要はありません。
実装方法:
(1)多対1モデル(マルチユーザー1コア)。具体的な形式はULTに似ています。ユーザースレッドがカーネルにアクセスする必要がある場合のみ、カーネル制御スレッドにマップされます。
(2)KSPと同様に、1対1モデル(1ユーザーと1コア)はシステムスレッドの数を制限する必要があります
(3)多対多モデル(マルチユーザーマルチコア)、プロセスを作成できますマルチプロセッサシステム上で複数のスレッドが並列に実行されます。これにより、スレッド管理のオーバーヘッドが削減され、多対1モデルのように効率が向上します。