りんかいいきかんり
臨界領域のスケジューリング原則
臨界領域と臨界資源
同時プロセスでは共有変数に関連するプログラムセグメントが臨界領域となり,共有変数が表すリソースが臨界リソースとなる.
りんかいいきスケジューリングの原則は一度に1つのプロセスのみが臨界領域内に入る を実行することを許可する.既存のプロセスが臨界領域にある場合、他のビューが入るプロセスは を待つ.臨界領域内に入るプロセスは限られた時間内に出入りし、待機プロセスの1つを に一度に進入させるべきである.
臨界領域管理を実現するいくつかのエラーアルゴリズム両方のプロセスは、相手が臨界領域にいないと判断し、同時に臨界領域 に入った.両方のプロセスは、相手が臨界領域にいると判断し、 を永久に待つ.
臨界領域管理を実現するPetersonアルゴリズム
このアルゴリズムは、各プロセスにフラグを設定します.フラグがtrueの場合、このプロセスが臨界領域に入ることを示します.また、どのプロセスが臨界領域に入ることができるかを示すインジケータturnを設定します.
上記の例では、turnが1に割り当てられ、後に0に割り当てられると仮定すると、スレッド0は臨界領域に入るべきであり、スレッド1はflag[0]&&turn=0のために待機し、スレッド0が臨界領域にアクセスした後に臨界領域リソース–flag[0]=falseを解放する.このときflag[0]&&turn=0は成立せず、スレッド1は臨界領域を実行できる
臨界領域管理を実現するハードウェア施設
オフわりこみプロセスは臨界領域に入る前にオフに中断し、臨界領域を脱退する時にオフに中断し、オフに中断する間、プロセススケジューラは端末機または機会を失い、スレッドを切り替えることなく、臨界領域の反発実行 を保証した.関割込み欠点:交差実行プログラムの能力を制限し、関割込み方法はマルチCPUシステムに適していない.関割込み権利はユーザーに非常に危険である を与える.
命令のテストと確立
TS命令による臨界領域管理(反発)を実現するアルゴリズムは以下の通りである.
TS命令によるプロセスが食べるアルゴリズムは以下の通りである.
そうかんめいれい
臨界領域と臨界資源
同時プロセスでは共有変数に関連するプログラムセグメントが臨界領域となり,共有変数が表すリソースが臨界リソースとなる.
りんかいいきスケジューリングの原則
臨界領域管理を実現するいくつかのエラーアルゴリズム
臨界領域管理を実現するPetersonアルゴリズム
このアルゴリズムは、各プロセスにフラグを設定します.フラグがtrueの場合、このプロセスが臨界領域に入ることを示します.また、どのプロセスが臨界領域に入ることができるかを示すインジケータturnを設定します.
boolean flag[2];
int turn;
void procedure0()
{
while(true)
{
flag[0]=true;
turn=1;
while(flag[1]&&turn==1) /* flag[1] false,P0 ; flag[1] tureP0 , P1 ,P0 */
{
/* donothing*/
}
visit();/* */
flag[0]=false;/* ,procedure0 */
/*remainder section*/
}
}
void procedure1()
{
while(true)
{
flag[1]=true;
turn=0;
while(flag[0]&&turn==0)
{
/* donothing*/ ;
}
visit();/* */
flag[1]=false;/* ,procedure1 */
/*remainder section*/
}
}
void main()
{
flag[0]=flag[1]=false;
/*start procedure0 and procedure1*/ ;
}
上記の例では、turnが1に割り当てられ、後に0に割り当てられると仮定すると、スレッド0は臨界領域に入るべきであり、スレッド1はflag[0]&&turn=0のために待機し、スレッド0が臨界領域にアクセスした後に臨界領域リソース–flag[0]=falseを解放する.このときflag[0]&&turn=0は成立せず、スレッド1は臨界領域を実行できる
臨界領域管理を実現するハードウェア施設
オフわりこみ
命令のテストと確立
TS(X){
x=true, x=false;
return true;
return false;
}
TS命令による臨界領域管理(反発)を実現するアルゴリズムは以下の通りである.
bool TS(bool &x){
if(x){
x=false;
return true;
}
}
TS命令によるプロセスが食べるアルゴリズムは以下の通りである.
bool s=true;
cobegin
process Pi(){
//i=1,2,3...n;
while(!TS(s))
s=true;
}
そうかんめいれい
void SWAP(bool &a,bool &b){
bool temp=a;
a=b;
b=temp;
}