オペレーティングシステム——第二章ノート(四)

6845 ワード

一.プロセス通信プロセス通信とは、プロセス間の情報交換を指す.1.低級通信-プロセス間の反発と同期信号量メカニズムは有効な同期ツールであるが、通信ツールとしての欠点は以下の通りである:(1)効率が低い(通信量が少ない)(2)通信はユーザーに不透明である(プログラマーが実現し、オペレーティングシステムは共有メモリのみをコード操作に提供する).高度なプロセス通信ユーザは、オペレーティングシステムが提供する通信コマンドのセットを直接利用して、大量のデータを効率的に伝送する通信方式である.オペレーティングシステムはプロセス通信の詳細を隠し、ユーザーに透明で、通信プログラムの作成上の複雑さを減らします.二.プロセス通信のタイプの高度な通信メカニズムは、4つのクラス1共有メモリシステム(オペレーションストレージ方式)が相互に通信するプロセスが、いくつかのデータ構造または共有ストレージ領域を共有し、プロセス間でこれらの空間を通じて通信することができることに帰結することができる.a.共有データ構造に基づく通信方式(低級)b.共有記憶領域に基づく通信方式(高級)例:2台のホスト間のQQメッセージの伝送は送信側にキャッシュ領域を開き、送信したデータを格納し、物理メディアの伝達を通じてネットワークカードを通じて受信側のバッファに伝達する.質問:なぜQQで送信されたメッセージがブラウザに表示されないのですか?解答:各アプリケーションには独自のポートがあり、ポートを介してそれぞれのコンピュータ上のバッファを見つけ、そこからデータを送信または取得する1)共有データ構造に基づくプロセス共通のデータ構造により、プロセス間の情報交換を実現する.生産消費の問題のように、共有データ構造を定義します.n個の長さの境界バッファです.プログラマ:共通データ構造の設定とプロセス間の同期の処理を提供します.OS:共有メモリを提供します.特徴:複雑で低効率で、比較的少ないデータを伝達するのに適しています.2)共有記憶領域(大量の情報伝達に適用され、下位同期処理はオペレーティングシステムによって制御される)に基づいてメモリに共有記憶領域を画定し、各プロセスは共有記憶領域におけるデータの読み書きによって通信を実現することができる.プロセスが通信する前に、システムに共有ストレージ領域の1つのパーティションの取得を申請し、そのパーティションのキーワードを指定する.システムが他のプロセスに分けられた場合、そのパーティションの記述子を申請者に返し、申請者は取得した共有ストレージパーティションを本プロセスに接続する.その後、この共通記憶パーティションは、通常のメモリのように読み書きすることができる.マルチプロセスは、この領域を介して通信する.②メッセージングシステム(送受信方式)最も広く使われているもので、プロセス間のデータ交換はフォーマットされたメッセージ単位である.下部の複雑な操作を遮断します.単機:オペレーティングシステムの下位プログラミングにおけるメッセージングシステム呼び出し;コンピュータネットワーク:メッセージをメッセージと呼ぶ.プログラマは、システムが提供する通信コマンド(原語)のセットを直接利用して通信する.(④クライアント-サーバシステム)③パイプ通信(中間ファイル方式)いわゆる「パイプ」とは、通信を実現するために読み取りプロセスと書き込みプロセスを接続するための共有ファイルであり、pipeファイルとも呼ばれる.共有ファイルに入力した書き込みプロセスは文字ストリームの形式で大量のデータをパイプに送る.一方、パイプ出力を受信するリードプロセスは、パイプからデータを受信(リード)する.はUNIXシステムで創始された.そのパイプメカニズムは3つの協調能力を提供する必要がある:反発、同期、相手が存在するかどうかを確定する.例:パイプのファイル削除操作:
#include
#include
#include
#include
#include
#include
#include
#define FIFO “/tmp/myfifo”
main(int argc,char**argv)
{   char buf_r[100];
    int fd;
    int nread;
  /* */
   if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
  printf(“cannot create fifoserver
”) printf(“Preparing for reading bytes…
”); memset(buf_r,0,sizeof(buf_r)); /* */ fd=open(FIFO,O_RDONLY|O_NONBLOCK,0); if(fd==-1) { perror(“open”); exit(1); } while(1) { memset(buf_r,0,sizeof(buf_r)); if((nread=read(fd,buf_r,100))==-1) { if(errno==EAGAIN) printf(“no data yet
”); }else printf(“read %s from FIFO
”,buf_r); sleep(1); } pause();/* , */ unlink(FIFO);// }

スレッドの書き込み:
#include
#include
#include
#include
#include
#include
#include
#define FIFO_SERVER “/tmp/myfifo”
main(int argc,char**argv)
{   int fd;
    char w_buf[100];
    int nwrite;
/* */
fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);
if(argc==1)
{     printf(“Please send something
”) exit(-1); } strcpy(w_buf,argv[1]); /* */ if((nwrite=write(td,w_buf,100))==-1) { if(errno==EAGAIN) printf(“The FIFO has not been read yet.Please try later
”); } else printf(“write %s to the FIFO
”,w_buf); }

プログラミング操作ネーミングパイプの例:
#include
 #include
 #include
 #include
 #include
 #include
// 
 int main(int argc,char *argv[])
{
   //pipefile=”/tmp/mypipefile”
   // mkfifo FIFO 
  if((mkfifo(pipefile,0666))<0){
perror(“failed to mkfifo”);
exit(1);}
 printf(“mkfifo successes.name is %s
”,pipefile); return 0; } // int main(int argc,char *argv[]) { if(argc!=2) { printf("not enough params,give pipefile name
"); exit(1); } char *pipefile; pipefile=argv[1]; char buf[100]; int fd,i; printf("read open namedpipe!
"); fd=open(pipefile,O_RDONLY,0); // open , printf("ok! namedpipe opened for read!
"); i=read(fd,buf,100); // , buf[i]=0; printf("ok! reaed from namedpipe: %s!
",buf); return 0; } // int main(int argc,char *argv[]) { if(argc!=2) { printf("not enough params,give pipefile name
"); exit(1); } char *pipefile; pipefile=argv[1]; int fd; char *test="test strings!"; printf("open namedpipe --%s for write!
",pipefile); fd=open(pipefile,O_WRONLY,0); // open , printf("ok! namedpipe --%s opened for write!
",pipefile); sleep(10); printf("write wake up! hahaha!
"); write(fd,test,strlen(test)); printf("OK! namedpipe write successfully!
"); exit(0); }

④Client-Server system 3.メッセージング通信の実現方法1)直接通信方式2)間接通信方式3.メッセージングシステムの実現単機とネットワーク環境下の高度なプロセス通信は広く「メッセージング」方式を採用し、考慮すべき問題:1通信リンクの確立②メッセージフォーマット③同期方式4.スレッドプロセスの発生を認識するのは効率を高めるためであり,プロセス効率が低くスレッド効率が高い.1.スレッドの導入マルチプログラム管理:効率を追求する目的の下で「同時」を実現プロセスを利用して実現するマルチプログラムシステムにおけるプロセスは資源を持つことができる独立した単位である.独立して資源をスケジューリングし、割り当てることができる基本単位の同時度は勝手に設定されていない:同時プロセスの数は多すぎるべきではなく、切替頻度は高すぎるべきではない.制限同時性の問題点:プロセス実体情報量が大きく、プロセスに対する管理操作が多ければ多いほど、運行時間との比が大きくなり、運行効率が低い.2.スレッドの属性マルチスレッドOSでは、1つのプロセスは複数のスレッドを含み、各スレッドはCPUを利用する基本単位である.1)軽量エンティティ:独立した運用を保証するために必要なリソースを少しでも少なくしないでください.(TCB)2)独立したスケジューリングと割り当ての基本単位:スケジューリングの切り替えが迅速で、コストが小さい.3)同時実行可能.4)プロセスリソースの共有:プロセス内のスレッドと同じプロセスアドレス空間、オープンファイル、信号量機構などを共有することができる.3.スレッドの情報TCBはどんな情報を管理しますか?状態パラメータ識別子、運転状態、優先度、レジスタ状態、スタック、プライベートメモリ、信号シールドなど.運転状態:実行、準備、ブロック4.スレッドの作成と終了マルチスレッドOSでは、アプリケーションの起動時に通常1つのスレッド(初期化スレッド)だけが実行され、必要に応じて複数のスレッドが作成されます.5.マルチスレッドシステムにおけるプロセスプロセスは、システムリソースが複数のスレッドを含むのは実行エンティティではなく、スレッドがプロセス範囲内で実行エンティティとして機能するために使用されるだけである.6.スレッドの管理高周波使用に適したキー共有データとプログラムセグメント;unlockとlockの2つのロック操作原語;2)条件変数は反発ロックとともに反発ロックを使用して臨界領域への反発を保証するが、条件変数を利用してスレッドブロック注意が条件を満たさない場合、wait条件変数:○1反発ロックを解放○2プロセスブロック条件変数指向キューで○3が起動した後に反発ロック3を再設定する)信号量私用信号量(private samephore)はプロセスのスレッド間同期に使用され、データ構造はアプリケーションのアドレス空間に格納されます.特定のプロセスに属し、OSはその存在を感知しない.共通信号量(public samephore)は、異なるプロセス間または異なるプロセスにおけるスレッドの同期に用いられ、データ構造はOSによって管理され、保護されたシステム記憶領域に格納される.五.スレッドの実現方式1.カーネルスレッドKST(kernel-level thread)はカーネルに依存し、システムコールを利用してOSカーネルによってカーネル空間で作成、取り消し、切り替えなどのスレッド作業を完了する.タイムスライスはスレッドに割り当てられるので、マルチスレッドのプロセスはより多くのCPU時間を得る.2.ユーザスレッドULT(user-level thread)は、システム呼び出しを利用する必要がなく、OSコアに依存しない.プロセスは、スレッドライブラリ関数を使用して、ユーザースレッドを作成、同期、スケジューリング、管理制御します.スケジューリングはアプリケーションソフトウェアの内部で行われ、通常は非優先式とより簡単なルールを採用し、ユーザー状態/コア状態の切り替えを必要とせず、kstよりも高速である.3.コンビネーションカーネルはマルチKSTスレッドの管理をサポートし、同時にユーザーアプリケーションレベルのスレッド管理を許可する.
PS: 1.KSTの長所と短所:マルチプロセッサシステムの下でマルチスレッドパラレル1つのスレッドがシステム呼び出しを開始してブロックすることができ、他のスレッドの実行に影響を与えないモードの切り替えはオーバーヘッドが大きい.2.ULTメリットとデメリット:ユーザースレッドのメンテナンスはアプリケーションプロセスによって完成する;カーネルはユーザースレッドの存在を知らない.スレッド切り替えにはカーネル特権は必要ありません.ユーザースレッドスケジューリングアルゴリズムは応用に対して最適化することができる.マルチスレッドの実装はプラットフォームに関係なくシステム呼び出しによるプロセスブロックが発生すると、プロセス全体のすべてのスレッドはプロセス単位でcpuを割り当てることができず、マルチプロセッサシステムに優位性がない