Web教材一覧ハードウェアとソフトウェア

排他制御

学習のポイント

タスク管理での排他制御について学習します。なお、排他制御はデータベースの観点からも重要です。それに関しては「データベース:排他制御」を参照してください。

キーワード

排他制御、専有ロック、共有ロック、デッドロック、セマフォ


マルチタスクでは、複数のタスクがメモリや磁気ディスクの同じ場所をアクセスする場合があります。そのとき、双方で更新を行う場合には、一貫性を失うことが起こるため、一方のタスクが終了するまで、他方のタスクがアクセスしないようにする必要があります。それを排他制御といいます。

ロック方式
記憶装置の更新を行うタスクは、そに必要となる個所を他のタスクが更新をしないように、ロックをかけます。これをロック方式といいます。ロックには、次の二つがあります。
   専有ロック:他のタスクに参照も更新もさせない。
       他のタスクは、その資源に専有ロックも共有ロックもかけられない
       更新時に専有ロックをすることが多い。
   共有ロック:他のタスクに参照は許すが、更新はさせない
       参照時に、データが途中で変えられないために共有ロックをかけることが多い。
       他のタスクは共有ロックできるがが、専有ロックをかけられない
デッドロック
ロック方式の欠点にデッドロックがあります。
タスクAは、資源aを専有ロック、資源bを共有ロックする必要があり、タスクBは、資源bを専有ロック、資源aを共有ロックする必要があるとします。タスクAは、資源bをタスクBで占有されているため、実行できないし、タスクBは、資源aをタスクBで占有されているため、実行できません。このように双方が実行できなくなる状況をデッドロックといいます。
 デッドロック状態の検出は、次の方法で行われます。
   ロック モニター スレッドがタイマ監視をしており、一定時間状態が変化しないことで検出する
   応答がないのを人間が発見して、割り込みをかける。
 デッドロック状態を解消するには、次の手段になります。
   タスクAかタスクBの一方を強制的に終了させる
   資源aか資源bの一方を強制的にロックを外す
 デッドロックの発生を予防するには、次の工夫があります。
  専有ロックする資源の粒度(ロックする範囲)を小さくする
    他のタスクがロックした個所をアクセスする確率が小さくなる
  専有ロックをアクセスする時間を短縮する
    他のタスクとの同時アクセスが発生する確率が小さくなる
  ロックする資源の順序を同じにする
    タスクAもタスクBも、資源a→資源bの順にすればデッドロックになりにくい
セマフォ
セマフォ方式の仕組み
セマフォ方式では、対象となる資源についてセマフォ変数という変数を設定し、その変数の値により、他のタスクにこの資源の利用を許すか禁止するかを示します。そして、P操作(Doun)とV操作(Up)によりセマフォ変数の値を変化させます。
  • P操作:資源を利用するために確保する操作。セマフォ変数から1を減じる。その結果、
       セマフォ変数≧0:タスクが資源を確保する
       セマフォ変数<0:タスクを待ち状態にする
  • V操作:資源を解放する操作。セマフォ変数に1を加える。その結果、
       セマフォ変数>0:資源待ち他のタスクがないので何もしない
       セマフォ変数≦0:待ち状態のタスクから一つのタスクを実行可能状態にする
セマフォ方式の例
タスクA,B,Cがある資源にアクセスする場合、次のようになります。
        ①   ②   ③   ④   ⑤   ⑥   ⑦
        ┌───┬───┬───┬───┬───┬───┬───┐
 セマフォ変数 │ 1 │ 0 │ -1 │ -2 │ -1 │ 0 │ 1 │
        └───┴───┴───┴───┴───┴───┴───┘
          ┌───┬───────┬───┐
   タスクA   │P操作│   実行   │V操作│
          └───┼───┬───┼───┼───┐
   タスクB       │P操作│ 待ち │ 実行 │V操作│
              └───┼───┼───┼───┼───┐
   タスクC           │P操作│ 待ち │ 実行 │V操作│
                  └───┴───┴───┴───┘

  • ①:初期状態では、資源はどのタスクにも使われていない。セマフォ変数=1としておく。
  • ②:タスクAが資源を要求。P操作(-1)が行われる。その結果、セマフォ変数=0≧0なので、タスクAは資源を確保して、実行状態になる。
  • ③:タスクBが資源を要求。P操作(-1)が行われる。その結果、セマフォ変数=-1<0なので、タスクBは、資源が解放されるまで待つ。
  • ④:タスクCが資源を要求。P操作(-1)が行われる。その結果、セマフォ変数=-2<0なので、タスクCは、資源が解放されるまで待つ。
  • ⑤:タスクAの実行が終了したので、資源を解放しV操作(+1)が行われる。その結果、セマフォ変数=-1≦0なので、待ち状態のタスクからタスクBが実行可能状態になり実行に入る。
  • ⑥:タスクBの実行が終了したので、資源を解放しV操作(+1)が行われる。その結果、セマフォ変数=0≦0なので、待ち状態のタスクからタスクCが実行可能状態になり実行に入る。
  • ⑦:タスクCの実行が終了したので、資源を解放しV操作(+1)が行われる。その結果、セマフォ変数=1>0なので、何もせず①と同じ状態に戻る。
セマフォの目的
このような操作により、資源のほうからタスクの状態を制御することにより、
   共有リソースの排他アクセスの制御
   複数のタスク間の同期を取る
などを行うことができます。

過去問題:「排他制御」( haita-seigyo