記事のディレクトリ
2.4古典的な同期プロセス
2.4.2ダイニング哲学者
食事する哲学者を解決するセマフォ記録1.
分析した後は、テーブル上の箸は、一度に哲学者の使用を可能にする、重要なリソースです。箸の排他的な使用を実現するために、箸は、セマフォ、これら5つのセマフォによって構成されるセマフォ配列を表すことができます。これは次のように説明されています。
Var chopstick: array[0, …, 4] of semaphore;
所有信号量均被初始化为1, 第i位哲学家的活动可描述为:
repeat
wait(chopstick[i]);
wait(chopstick[(i+1) mod 5]);
…
eat;
…
signal(chopstick[i]);
signal(chopstick[(i+1) mod 5]);
…
think;
until false;
:次の解決策をとることができ
、ほとんどの4人の哲学者だけ左側に、最終的には少なくとも一つの哲学者が食べることができることを保証しながら、箸を拾うために許可されている時に(1)を、そしてあなたが使用して終了したときに、それは彼が2を費やして解放することができますより多くの哲学者が食べることができるようにすることを唯一の箸、。
哲学者の左右2本の箸が用意されてい唯一の(2)は、彼は箸の食事を拾うことができました。
(3)彼の左と右の箸が他を得る取得哲学箸の所定の奇数と偶数哲学反対。この規定は、1になり、1番2番哲学競争箸; 3,4-哲学箸3競争。5人の哲学者の最初の競争箸の奇数は、取得した後、競争偶数箸に行くこと、そして最終的には常に2本の箸を取得し、食べるために哲学があるでしょう。
2.使用し、
食事する哲学者の問題は、である、食後ために、2つの哲学を各重要なリソース(箸)を得るために必要とされ、同期が前述した、それは本質的に、信号機構で利用可能です最も簡単な解決策。
semaphore: =(1,1,1,1,1)のVaRのchopsiick配列[0、...、4]。
processiの
繰り返しは
考えます。
Sswait(箸[(I + 1)MOD 5]、箸[I])。
食べる;
Ssignat(箸[(I + 1)MOD 5]、箸[I])。
偽まで。
2.4.3リーダ - 作家問題
問題の書き込み- 1.記録の使用は、読者の解決セマフォ
リーダライタプロセス読み書きやミューテックスWmutexを設定間の相互排他を実現するために。加えて、その後の処理を読み取るReadcountの数を表す整数変数を設定しました。そのため、長い読書の過程でリーダーがあるのでとして、彼らは、書き込み・ライター・プロセスに許可されていません。したがって、ときにのみReadcount = 0は、リーダープロセスのみウェイト(Wmutex)操作を実行する必要があり、リーダーを読み取るには進歩を表します。待機(Wmutex)操作が成功した場合、リーダーは、それに応じて、プロセスを読んReadcount + 1の操作を行うことができます。同様に、Readcountを行った後リーダープロセスがその値である0をデクリメントする場合にのみ、信号(Wmutex)操作を実行するために必要とされるので、ライターの書き込み処理という。Readcountは、より多くの読者のプロセスをアクセスすることができ、重要な資源であるので、したがって、我々はそれのためのミューテックスrmutexを設定する必要があります。
読者 - 次のように作家の問題を説明することができます。
Var rmutex, wmutex:semaphore∶ =1,1;
Readcount:integer∶ =0;
begin
parbegin
Reader:begin
repeat
wait(rmutex);
if readcount=0 then wait(wmutex);
Readcount∶ =Readcount+1;
signal(rmutex);
…
perform read operation;
…
wait(rmutex);
readcount∶ =readcount-1;
if readcount=0 then signal(wmutex);
signal(rmutex);
until false;
end
writer:begin
repeat
wait(wmutex);
perform write operation;
signal(wmutex);
until false;
end
parend
end
2.使用して、読者に対処するための一連のメカニズムをセマフォ - 問題を記述すること
ヴァールRN整数;
L、MX:semaphore: = RN、1。
開始
parbegin
リーダー:開始
リピート
SWAIT(L、1,1)。
SWAIT(MX、1,0)。
...
読み取り操作を実行します。
...
Ssignal(L、1)。
偽まで。
エンド
ライター:開始
リピート
SWAIT(; L、RN、0 MX、1,1)。
書き込み操作を実行します。
Ssignal(MX、1)。
偽まで。
エンド
parendの
終わり
2.6プロセス間通信
プロセス間通信の2.6.1タイプ
1.共有メモリシステム
- 共有データ構造に基づいて通信モード
- 共有ストレージ領域に基づいて通信モード
2.メッセージングシステム
、かスタンドアロンシステム、マルチマシンシステム、又はコンピュータネットワーク、メッセージパッシング機構は、最も広く使用されているプロセス間通信機構の間です。メッセージング・システムでは、プロセス間のデータ交換は、フォーマットされたメッセージ(メッセージ)単位であり、コンピュータネットワークにおいて、再びメッセージパケットと呼びます。プログラマは、システムが提供する通信コマンド(プリミティブ)のセットと直接通信します。オペレーティングシステムは、大幅に通信プログラミングの複雑さ、およびアプリケーションの広い範囲へのアクセスを簡略化し、通信の実装の詳細を隠蔽します。通信システムは、高度なメッセージング通信です。なぜなら、その異なる実装のさらに直接的な通信及び間接通信方法に分けられます。
前記導管(パイプ)通信
、いわゆるもパイプファイルとして知られているそれらの間で共有ファイルの通信を達成するために、読み出し処理と書き込み処理とを接続するための「パイプライン」とは、。パイプに大量のデータを形成するパイプライン送信処理(共有ファイル)(すなわち、書き込み処理)、文字ストリームへの入力を提供し、受信した処理は、パイプ(即ち読取処理)の出力を受け付け、パイプから(読み出し)を受信しますデータ。送受信プロセスが通信するためのパイプの使用であるので、それはまた、連通管を知られています。このように、第一のUNIXシステムでは、それは効率的にも他の多くのオペレーティングシステムに組み込まれるデータ、大量のを転送することができるからです。
両者間の通信を調整するために、パイプラインは、次の3つの領域の調整のための機構を提供しなければなりません。
- プロセスパイプ/書き込み操作の読み取りを実行しているとき、すなわち、相互に排他的で、他のプロセスが待たなければなりません。
- 書き込み処理パイプに書き込まれたデータの一定量を、そのデータを除去した後の工程を読んで、その後、彼を起こしていることを知って、待ち時間にスリープ状態に入ることを同期手段。読み取り処理は、空のパイプを読み取ると、睡眠がパイプに書き込みデータに書き込み処理の後まで待つべき、それだけでウェイクアップします。
- 他の側面があるか否かを決定する際に、のみ通信する、他が既に存在するかを決定します。
2.6.2実装のメッセージング通信
1.直接通信
手段を送信すると、ターゲット・プロセスにメッセージを送信するために、OSによって提供されるプロセスを使用してコマンドを送信します。このとき、必要な送受信プロセスが明示的に他の識別子に提供されています。:一般的に、システムは、次の2つの通信コマンド(プリミティブ)を提供し
、送信(受信、メッセージ)受信機プロセスにメッセージを送信し、
受信(送信者、メッセージ)送信者によって送信されたメッセージを受信するステップと、
例えば、プリミティブ送信(P2を、M1)に示す受信M1 P2にメッセージを送信する工程と、プリミティブが受信(P1、M1)は、受信されたメッセージによって表されているが、M1 P1を送信しました。
いくつかの場合において、受信処理は、送信プロセスの複数と通信することができる、従って、それが事前送信処理で指定することができません。例えば、印刷サービスを提供するためのプロセスは、それがいずれかのプロセスから「印刷要求」メッセージを受信することができます。このような用途のために、受信処理で受信したソースプリミティブパラメータメッセージの処理は、プリミティブのように表すことができる受信、通信が終了した後の値である:
受信(ID、メッセージ)。
消費者問題 - 我々はまた、プロデューサーを解決するために、直接通信プリミティブを利用することができます。プロデューサーは、製品(メッセージ)を生成するときに、[送信プリミティブプロセスを消費者にメッセージを送信し、消費者は、プロセスを受信使用したメッセージを取得するために原始的です。メッセージが生成されていない場合はプロデューサーのプロセスがメッセージを超える送信するまで、消費者は待たなければなりません。生産者 - 次のように記述することができ、消費者の通信プロセスがあります。
repeat
…
produce an item in nextp;
…
send(consumer, nextp);
until false;
repeat
receive(producer, nextc);
…
consume the item in nextc;
until false;
2.間接通信システム
(1)で作成し、メールボックスの破壊。
プロセスは、新しいメールボックスを作成するプリミティブメールを作成するために使用することができます。クリエータープロセスは、メールボックス名、メールボックス属性(パブリック、プライベートまたは共有)を指定する必要があり、共有メールボックスのために、名前が共有者に与えられるべきです。プロセスは、もはやメールを読むために必要がある場合、メールがアンドゥプリミティブを元に戻すために使用することはできません。
(2)メッセージを送受信します。
あなたはプロセスのメールボックスとの間の通信に使用したい場合は、メールボックスが共有され、通信システムが提供する以下の通信プリミティブによってしなければなりません。
送信(メールボックス、メッセージ);指定したメールボックスへのメッセージ;
(メールボックス、メッセージ)を受信し、指定されたメールボックスからメッセージを受け取ります。
また、ユーザー・プロセスによって作成されたオペレーティングシステムによって作成されたメールは、作成者は、メールボックスの所有者です。したがって、メールボックスには、次の3つのカテゴリに分けることができます。
- プライベートメールは
、ユーザー自身のプロセスのための新しいメールボックスを作成し、そのプロセスの一部としてすることができます。メールボックスの所有者がメールボックスからメッセージを読み取ることができ、他のユーザーは、自分のにメッセージを送信できるメールボックスを構成しています。プライベートメールは、このような使用することができる単方向通信リンクの実現のメールボックスを。メールボックスを所有しているプロセスの終了時に、メールボックスが消えます。 - 公共のメールボックス
で構成され、オペレーティング・システムを作成し、システムが利用できるように、すべての使用承認プロセスを。承認プロセスは、それが自分のメールボックスに送信されたメッセージから読み取ることができ、メールボックスにメッセージを送ることができます。もちろん、一般的なメールボックスがある必要があり、双方向の通信リンクがメールボックスを達成しています。一般的に、公共のメールボックスは、システムの動作中は常に存在しています。 - メールボックスを共有する
、それが作成する際のプロセスによって作成されるか、または作成された後、それが共有されて示し、共有プロセス(ユーザー)の名前を指定する必要があります。メールボックスの所有者と共有者は、独自のメッセージを送信するためにメールボックスから奪う権利を持っています。
送受信プロセス間のメールボックス通信を使用する場合は、4つの関係を次の
1.一对一关系。这是可为发送进程和接收进程建立一条两者专用的通信链路,使两者之间的交互不受其他进程的干扰。
2.多对一关系。允许提供服务的进程与多个用户进程之间进行交互,也称为客户/服务器交互。
3.一对多关系。允许一个发送进程与多个接收进程进行交互,使发送进程可用广播方式,向接受者(多个)发送消息。
4.多对多关系。允许建立一个公用信箱,让多个进程都能向信箱中投递消息;也可从信箱中取走属于自己的信息。
2.6.3問題のメッセージングシステムの実装
1.通信リンクは
、通信リンクを介しを確立する必要があり、送受信プロセス間の通信を可能にします。通信リンクを確立するには、2つの方法があります。最初の方法は次のとおりです。通信の前に、送信プロセス、コマンド(プリミティブ)「接続の確立」、明示的で誰に要求は、通信リンクシステムを確立するために、使用後のリンク、チェーンによっても明示的に除去道路。
このアプローチは、主にコンピュータネットワークで使用されています。第二の方法は、リンクの確立を要求することなく、システムが自動的にリンクを確立します誰にシステム(プリミティブ)の使用のみによって提供される送信コマンドを明確なプロセスを送信することです。このアプローチは、主に、スタンドアロンシステムで使用されています。
通信リンクの接続方法であって、2つのカテゴリに分ける順番に通信リンク:① ポイント-ポイント接続の通信リンクを 2つのノード(プロセス)を接続するだけリンク、② マルチポイント接続リンクこれは、(N> 2)のノード(プロセス)の複数のリンク接続を指します。異なる通信方式によれば、リンクは、2つの方法に分けることができる:① 単方向通信リンク、受信プロセスにメッセージを送信するための唯一の送信工程と、② 双方向リンクは、処理Aによって処理Bを許可いずれかにメッセージを送信し、また、プロセスは、プロセスB Aにメッセージを送信することができ
メッセージのフォーマット
一部OSで、メッセージは処理および記憶のオーバーヘッドメッセージを低減する比較的短い固定長のメッセージ形式を使用することです。不便であることをユーザに送信するが、より長いメッセージ、このアプローチは、オフィスオートメーションシステムで使用することができ、ユーザの通信のための高速スクラッチパッドを提供します。いくつかのOSでは、別の可変長メッセージフォーマットを使用することは、すなわち、メッセージの長さは、プロセス変数を送信されます。システムは、長いメッセージ処理と保管になると、あなたはより多くのオーバーヘッドが支払わなければならないが、ユーザーが容易になります。両方のメッセージ・フォーマットは、利点と欠点を持っているので、(コンピュータネットワークを含む)多くのシステムでは、同時に使用されます。
3.プロセスの同期モード
- ブロックされたプロセスの送信、受信処理をブロックしました。
- ブロックされていないプロセスを送信、受信処理をブロックしました。
- 送信側と受信側のプロセスがブロックされていません。
2.6.4メッセージバッファキュー通信機構
1.メッセージ通信機構のキューデータ構造をバッファ
- メッセージバッファ。通信メッセージバッファキューに、データ構造の主な用途は、メッセージ・バッファです。
- PCBデータ通信に関する項目。使用する場合、メッセージバッファキュー通信機構が同時に提供されるメッセージバッファキューは、セマフォ操作のためのメッセージキューに追加されるべきであるとの同期を達成するために、及びPCBプロセスにおける場所にそれらを。
プリミティブ送信2.
図に示すように、透過領域Aが設けられ、自身のメモリ空間内にあるべきで、プリミティブを使用する送信メッセージを送信する前に送信処理は、メッセージのボディは、伝送プロセス識別子、メッセージの長さなど、送信します情報は、それを埋め、その後、ターゲット(受信)プロセスにメッセージを送信するために、プリミティブの送信を呼び出します。まず、I、I内のバッファ領域に送信された情報のコピーを次に適用する緩衝液中で透過領域集合のプリミティブa.size長メッセージ送信に係ります。メッセージキューI MQ受信プロセス内ハングアップすることができるようにするために、プロセスは、受信した識別子jを取得する必要があり、それからj.mq.に掛け 重要なリソースがキューに属しているので、待たなければなりません前と挿入操作の後に実行され、信号操作を行いました。
procedure send(receiver, a)
begin
getbuf(a.size,i); 根据a.size申请缓冲区;
i.sender∶ =a.sender; 将发送区a中的信息复制到消息缓冲区之中;
i.size∶ =a.size;
i.text∶ =a.text;
i.next∶ =0;
getid(PCB set, receiver.j); 获得接收进程内部标识符;
wait(j.mutex);
insert(j.mq, i); 将消息缓冲区插入消息队列;
signal(j.mutex);
signal(j.sm);
end
3.プリミティブ受信します
接收原语描述如下:
procedure receive(b)
begin
j∶ =internal name; j为接收进程内部的标识符;
wait(j.sm);
wait(j.mutex);
remove(j.mq, i); 将消息队列中第一个消息移出;
signal(j.mutex);
b.sender∶ =i.sender; 将消息缓冲区i中的信息复制到接收区b;
b.size∶ =i.size;
b.text∶ =i.text;
end
2.7スレッド
2.7.1スレッドの基本的な考え方
1.処理動作
プログラムを同時に実行することができ、システムは、一連の動作についてなければならないようにします。
- プロセスを作成します。
- 失効プロセス
- プロセススイッチ
プロパティスレッド2
- ライトエンティティ
- 独立のスケジューリングとディスパッチの基本単位
- 同時に実行することができます
- リソース共有プロセス
3.スレッドの状態
(1)ステータスパラメータ。
OS内の各スレッドは、スレッド識別子とステータスパラメータのセットを用いて記述することができます。いくつかの状態パラメータは、多くの場合があります:プログラムカウンタPCとスタックポインタの内容を含む、状態を登録する①、②スタックは、スタックは通常、ローカル変数とリターンアドレスに格納され、③の状態を実行中のスレッドは、スレッドが中に記述するために使用されますどのような動作状態;④優先度、実行のスレッドの優先度が記載;⑤独自のローカル変数のコピー・スレッドを記憶するためのスレッド固有のメモリと、⑥信号遮蔽、すなわちいくつかの信号に対して遮蔽します。
(2)スレッドが実行されています。
従来のプロセスと同様に、スレッド間のような制約がありますスレッドが実行時にも断続的に持っている結果として、資源と相互協力関係を共有しました。したがって、さらに次の3つの基本的な状態を有するときにスレッドの実行、:①実行状態を、プロセッサがスレッドを表し得られる動作、②準備状態、スレッド手段は種々の条件を用いて行った、CPU一度に行うことができます状態;③状態ブロッキング、スレッドを指すが停止した状態で、実行中の妨害事象です。
4.作成し、スレッドの終了
マルチスレッドOS環境では、起動時にアプリケーション、通常は一つだけ実行スレッドは、スレッドとして知られている「スレッドを初期化します。」これは、スレッドの数を作成するために行く必要があります。新しいスレッドを作成する場合、必要がスレッド(またはシステムコール)を作成する関数を使用し、そのようなメインスレッドポインタ、スタックの大きさなどのスケジューリングの優先へのエントリポイントとして適切なパラメータを提供します。実行スレッドで関数を作成し、後で使用するためにスレッドの識別子を返します。
二つの方法でスレッドを終了:1は自分の仕事の後に自発的な終了を完了するためのスレッドです。他には、何らかの理由で誤ったスレッドであるか、操作中に他のスレッドを終了することを余儀なくされているように見えます。
5.マルチスレッドOSオペレーティング
システムの基本単位は、リソースを持っているように、マルチスレッドOS、プロセスが使用され、通常のプロセスは、複数のスレッドが含まれていないし、それらのリソースを提供するが、プロセスとして、この時間はもはや行われエンティティ。プロセスにおけるマルチスレッドOSは、次のプロパティがあります。
- システムリソースの割り当て単位として
- 複数のスレッドを含むことができ
- プロセスは、実行可能なエンティティではありません
2.7.2同期・スレッド間通信
1.ミューテックス(ミューテックス)
ミューテックスは、リソースへのプロセス間の排他的アクセスを実現するための比較的単純なメカニズムです。動作時間と空間は、低い相互排他ロック、およびキーと共有ブロックを使用して高周波数データのため、より適切であるからです。ミューテックスは、2つの状態、即ち、アンロック(UNLOCK)とオフロック(ロック)状態を有することができます。ミューテックスの操作に応じて、利用可能な2つのコマンド(機能)。前記ロックは、ロック解除ミューテックスを開くためのロック解除操作ミューテックスを遮断するように動作可能です。
2.条件変数
の各条件変数については、通常は、ミューテックス、条件変数でリンクされます作成する場合には、ミューテックス、と組み合わせて使用されます。短期のためのシンプルなミューテックスロックは、主にクリティカルセクションを入力するための相互排除を確実にするために使用します。リソースが利用可能になるまで、条件変数は、待望のスレッドが待機するために使用されています。
操作オフ最初のスレッドの実行mutexロック成功した場合には、クリティカルセクションを入力し、[リソースの状況を理解するためには、リソースの状態を記述するために使用されるデータ構造を検索します。我々は、所望のリソースが、ビジー状態Rで待機状態にスレッド、および実行リソースを解放するためのロック解除操作ミューテックス待ちで見つかった場合、リソースがアイドル状態にある場合、そのスレッドがリソースを使用できることを示し、その後、リソースの設定ビジー状態は、その後、ミューテックスでロック解除操作を実行します。
3.セマフォメカニズム
- プライベートセマフォ
スレッドが呼び出すことができる、セマフォを使用して、同じプロセス内のスレッド間の同期を達成するために必要とプライベートセマフォを作成するために、セマフォコマンドを作成し、そのデータ構造は、アプリケーションのアドレス空間に格納されますインチ すべてのための特定のプロセスに属するプライベートセマフォは、OSはそのため、一度異常終了または終了のプライベートセマフォ通常の発生によって占められ、民間セマフォの存在を知りませんが、セマフォが宇宙ケースを占領放出しませんでした、システムは、0(空)に復元することはできません、またそれは次のスレッドの要求にそれを伝えることができます。 - 公共セマフォ
公共セマフォは時々達成するために、異なるプロセスのスレッド間の同期セットに異なるプロセスです。それはすべてのプロセスでの使用のためのパブリック名を持ち、従って、共通のセマフォと呼ばれるため。システムメモリ領域に格納されたデータ構造は、それに割り当てられたスペースに保護され、OSによって管理され、それはまたセマフォシステムを知られています。一般的なセマフォの終了時にセマフォ乗員が解除されていない場合は、OSが自動的にスペースの量の回復を通知し、次のプロセスに通知します。目に見える、公共セマフォは比較的安全な同期メカニズムです。
スレッドとユーザレベルスレッドの2.7.3カーネルサポート
1.カーネルサポートスレッド
ここでの処理の両方のプロセスでユーザスレッド、またはシステムスレッドは、その作成は、また、取り消し及びハンドオーバこと、また、同じカーネルのサポートで実行され、スレッドのカーネルサポート所謂カーネルの実装に依存します。さらに、また、カーネル空間内の各スレッドは、スレッド制御ブロックが設けられているサポートカーネル、カーネルは、制御ブロックに基づいており、糸の存在を検知するために、その制御のために。
2.ユーザーレベルのスレッド
ユーザレベルスレッドが唯一のユーザ空間に存在します。スレッドと他の機能との間のこのスレッド、アンドゥ、同期通信を作成するため、システムコールを使用することなく、全てを達成します。ユーザレベルスレッドを切り替えるため、通常、アプリケーション・プロセスの多くのスレッド間で発生し、その後、またカーネルのサポートを必要とします。スケジューリングおよびスイッチングのためのルールの切り替え処理よりも簡単なルールに起因して、スレッドのスイッチング速度が特に速いですので。見ると、このスレッドは、カーネルに関連しています。
2.7.4スレッド制御
1.スレッドのカーネルのサポートを実装
ユーザレベルスレッドを達成するために2を
- 実行時(ランタイムシステム)
、いわゆる「ランタイムシステム」は、本質的にスレッドの作成および破壊のための機能、スレッドの同期および通信機能の実現を含む関数(手順)を管理および制御するためにスレッドの集合でありますスレッドスケジューリング機能と上のようにします。これらの機能のため、カーネルに関連するユーザレベルスレッドを作成するためです。すべてのランタイムシステムの機能は、ユーザ空間に存在し、ユーザとカーネルレベルのスレッドとの間のインターフェースとして。 - 制御のカーネルスレッドは
、このスレッドは、また、軽量プロセスLWP(軽量プロセス)として知られています。各プロセスは、他のローカル・ストア・スタックに加えて、スレッド識別子、優先順位、ステータスを含む、ユーザーレベルのスレッドと同様、各LWPは独自のデータ構造(例えば、TCB)を有し、LWPの複数を有してもよく、 。彼らはまた、プロセスが所有するリソースを共有することができます。LWPは、カーネルが提供するシステム・サービスを呼び出すことによって得ることができるようにユーザレベルスレッドを実行するとき、それは、それがカーネル・スレッドのサポートのすべての属性を持っていますその時点でLWPに接続されている限り。