優先ゆうせん順位じゅんい逆転ぎゃくてん

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』
優先ゆうせん順位じゅんい逆転ぎゃくてんれい
3つのタスク J1, J2, J3 の優先ゆうせん順位じゅんいは、J1 が最高さいこうで J3 が最低さいてい
1. J3 がセマフォ S1 を占有せんゆうする。その、より優先ゆうせん順位じゅんいたかい J1 の実行じっこうはじまり、J3 は一時いちじ停止ていしする(実行じっこう可能かのう状態じょうたい)。
2. J1 が S1 の解放かいほうちのためブロック状態じょうたいとなりいち停止ていしする。ただちに J3 の処理しょり再開さいかいされて S1 が解放かいほうされ、さだめられた時間じかんないに J1 の処理しょりもどるのであれば、このブロックは問題もんだいにはならない。しかし、では J3 より優先ゆうせん順位じゅんいたかいタスク J2 の実行じっこうがまずさき開始かいしされている。
3. J2 の実行じっこう、J3 の実行じっこう再開さいかいされ、S1 が解放かいほうされる。J1 はこの時点じてんでようやく S1 を占有せんゆうし、実行じっこう継続けいぞくできるようになる。
つまり、セマフォ S1 とまった関係かんけいいタスク J2 が S1 の解放かいほうさまたげてしまい、結果けっかとしてより優先ゆうせん順位じゅんいたかい J1 の実行じっこうをもさまたげている。

優先ゆうせん順位じゅんい逆転ぎゃくてん(ゆうせんじゅんいのぎゃくてん、Priority Inversion)とは、スケジューリングにおいて優先ゆうせん順位じゅんいたかタスク必要ひつようとしているリソース優先ゆうせん順位じゅんいひくいタスクが占有せんゆうしているときに発生はっせいする状態じょうたいである。ひく優先ゆうせん順位じゅんいのタスクがそのリソースを解放かいほうするまでたか優先ゆうせん順位じゅんいのタスクが実行じっこうをブロックされるため、実質じっしつてきふたつのタスクの優先ゆうせん順位じゅんい逆転ぎゃくてんする。ちゅう程度ていど優先ゆうせん順位じゅんいのタスクがその途中とちゅう動作どうさするなら、そのタスクはこう優先ゆうせん順位じゅんいのタスクとてい優先ゆうせん順位じゅんいのタスクの両方りょうほう優先ゆうせんして動作どうさしていることになる。

うんければ[1]優先ゆうせん順位じゅんい逆転ぎゃくてんがあっても被害ひがいをまぬがれるかもしれない。優先ゆうせん順位じゅんいたかいタスクの遅延ちえんにより致命ちめいてきなにかがきるまえに、うんく、てい優先ゆうせん順位じゅんいのタスクがリソースを解放かいほうして、それでうかもしれないからである。しかし一方いっぽう優先ゆうせん順位じゅんい逆転ぎゃくてん深刻しんこく問題もんだい原因げんいんとなる状況じょうきょう多々たたある。もしこう優先ゆうせん順位じゅんいのタスクがリソーススタベーション原因げんいんとなっているのにブロックされているなら、システム全体ぜんたい誤動作ごどうさこすかもしれないし、事前じぜん定義ていぎされた矯正きょうせい手段しゅだんたとえば、ウォッチドッグタイマによるシステム全体ぜんたいのリセット)のがねとなる可能かのうせいもある。火星かせい探査たんさせんマーズ・パスファインダー」で発生はっせいした問題もんだいは、リアルタイムシステムでの優先ゆうせん順位じゅんい逆転ぎゃくてんこした典型てんけいてきれいである(#外部がいぶリンク参照さんしょう)。

優先ゆうせん順位じゅんい逆転ぎゃくてんはシステムの性能せいのう低下ていかさせる。てい優先ゆうせん順位じゅんいのタスクは迅速じんそく処理しょりしなくてもよいからてい優先ゆうせん順位じゅんい設定せっていされている(たとえばそれはバッチ処理しょりかもしれないし、対話たいわがた処理しょりかもしれない)。同様どうように、こう優先ゆうせん順位じゅんいのタスクは時間じかんてき制限せいげん問題もんだいとなるからこう優先ゆうせん順位じゅんい設定せっていされる。対話たいわてきにユーザーにデータを提供ていきょうしている場合ばあいもあるし、なんらかのリアルタイムな応答おうとう保証ほしょうした処理しょりをしているかもしれない。優先ゆうせん順位じゅんい逆転ぎゃくてんてい優先ゆうせん順位じゅんいのタスクがこう優先ゆうせん順位じゅんいのタスクをブロックしてしまうので、システムの応答おうとう性能せいのう低下ていかまねき、保証ほしょうされた応答おうとう性能せいのう違反いはんとなる可能かのうせいもある。

この問題もんだい1970年代ねんだいからられているが、この状況じょうきょう予測よそくする確実かくじつ方法ほうほうはない。様々さまざま解決かいけつさく存在そんざいしている。もっと一般いっぱんてき解決かいけつさくつぎのようなものである。

  1. クリティカルセクション保護ほごするためにすべての不可ふかとする。
  2. 優先ゆうせん上限じょうげんプロトコル
  3. 優先ゆうせん継承けいしょう

みを不可ふかにして優先ゆうせん順位じゅんい逆転ぎゃくてんふせぐことができる場合ばあいpreemptibleinterrupts disabledふたつの優先ゆうせん順位じゅんいしかない。それ以外いがい優先ゆうせん順位じゅんいがない場合ばあい逆転ぎゃくてん不可能ふかのうとなる。ひとつしかロックデータ(可能かのうビット)がないので、ロックの順番じゅんばん間違まちがいもきないし、デッドロックも発生はっせいしない。クリティカルセクションはつね最後さいごまで実行じっこうされるので、ハングアップも発生はっせいしない。これはぜんみを不可ふかにした場合ばあいのみ有効ゆうこうであることに注意ちゅういされたい。特定とくていのハードウェアみのみ不可ふかにしたとしても、優先ゆうせん順位じゅんい逆転ぎゃくてんふせげない。

簡単かんたんなバリエーションとして、「単一たんいつ共有きょうゆうフラグロック」を複数ふくすうCPUシステムで使用しようすることがある。これは、共有きょうゆうメモリじょうにひとつのフラグを用意よういして、ぜんCPUについてプロセッサあいだのクリティカルセクションをビジーウェイトでロックするものである。プロセッサあいだ通信つうしんおおくの複数ふくすうCPUシステムでコストがたか低速ていそくである。したがって、そのようなシステムではリソースの共有きょうゆう極力きょくりょくしないよう設計せっけいしている。結果けっかとして、素朴そぼく方法ほうほうであってもおおくの実用じつようシステムでこれがうまく動作どうさしているのである。

このような単純たんじゅん手法しゅほう単純たんじゅんみシステムひろ使つかわれている。みシステムは信頼しんらいせい単純たんじゅんさ、リソースをなるべく使つかわないといったてん特徴とくちょうである。これらの手法しゅほうはクリティカルセクションが(たとえば100μみゅーびょう以内いないなどの)一定いってい時間じかん以内いないわるよう精密せいみつにプログラミングすることを要求ようきゅうする。汎用はんようのコンピュータのソフトウェア技術ぎじゅつしゃにとって、それはまった現実げんじつてき条件じょうけんではない。

このような手法しゅほう優先ゆうせん上限じょうげんプロトコル (Priority Ceiling Protocol) とている。優先ゆうせん上限じょうげんプロトコルでは、共有きょうゆうされたミューテックスプロセス(オペレーティングシステムのコードを実行じっこうする)が固有こゆうの(たかい)優先ゆうせんっている。そしてミューテックスをロックする処理しょりはそのプロセスがおこなう。ミューテックスにアクセスしようとするほかのタスクが上限じょうげん優先ゆうせんよりたか優先ゆうせんっていないかぎり、この方式ほうしきはうまく機能きのうする。

優先ゆうせん継承けいしょう (Priority Inheritance) では、てい優先ゆうせんタスクがこう優先ゆうせんタスクの優先ゆうせん継承けいしょうする。それによってちゅう程度ていど優先ゆうせんのタスクがてい優先ゆうせんタスクに先立さきだって動作どうさすることをふせぐ。これにはオペレーティングシステムの特殊とくしゅ設計せっけいようする。

ちゅう[編集へんしゅう]

  1. ^ たいていの場合ばあいうんほのかもしれないが、それでもそれは「うんかっただけ」である。

関連かんれん項目こうもく[編集へんしゅう]

外部がいぶリンク[編集へんしゅう]

いずれも英文えいぶん