(Translated by https://www.hiragana.jp/)
競合状態 - Wikipedia コンテンツにスキップ

競合きょうごう状態じょうたい

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』

競合きょうごう状態じょうたい(きょうごうじょうたい、えい: race conditionレースコンディション、またはえい: race hazardレースハザード)は、システム処理しょり過程かていにおける欠陥けっかんであり、処理しょり過程かてい出力しゅつりょく結果けっかがイベントなどの順序じゅんじょやタイミングと予期よきしない(かつ危険きけんな)依存いぞん関係かんけいにある場合ばあいをいう。本来ほんらい意味いみは、2つの電気でんき信号しんごう競合きょうごうしていずれかが出力しゅつりょく影響えいきょうあたえる状態じょうたいである。

競合きょうごう状態じょうたい設計せっけい不十分ふじゅうぶん電子でんし工学こうがくシステム、とく論理ろんり回路かいろ発生はっせいするが、コンピュータソフトウェアでもよく発生はっせいする。

この問題もんだいもっと厄介やっかいなところは、毎回まいかいあやまった動作どうさ結果けっかになるわけではなく、タイミングによっては正常せいじょう動作どうさしてしまう場合ばあいもある、ということである[1]。そのため、原因げんいん判明はんめいしにくく対処たいしょむずかしい不具合ふぐあい(バグ)をこす。

電子でんし工学こうがく

[編集へんしゅう]

競合きょうごう状態じょうたい典型てんけいれい論理ろんり回路かいろシステムで入力にゅうりょく変化へんかするときに発生はっせいするものである。ある出力しゅつりょく入力にゅうりょく状態じょうたい依存いぞんする場合ばあい、それは定常ていじょう状態じょうたい信号しんごうかんして定義ていぎされるだけかもしれない。入力にゅうりょく状態じょうたい変化へんかするとき、電子でんしシステムの物理ぶつり特性とくせいによって出力しゅつりょく変化へんかするまである程度ていど遅延ちえんしょうじる。そのあいだ出力しゅつりょく定義ていぎされた状態じょうたい以外いがい不安定ふあんてい状態じょうたいとなる可能かのうせいがある。このような一時いちじてき障害しょうがいゆるすシステムもあるが、たとえばその出力しゅつりょく信号しんごうのメモリなどをふくむシステムのクロックとして使用しようされる場合ばあい、システムは設計せっけいされたものとはことなったいをするかもしれない。

たとえば、2入力にゅうりょくANDゲートで論理ろんり信号しんごう X とその否定ひてい NOT X を入力にゅうりょくにしている場合ばあいかんがえてみる。理論りろんじょう、その出力しゅつりょく(X AND NOT X)はONになることはない。しかし、信号しんごう X がそのまま入力にゅうりょくされるがわと NOT ゲートをとおして入力にゅうりょくされるがわ遅延ちえん時間じかんがあった場合ばあいみじか時間じかんではあるが、一時いちじてきにANDゲートの出力しゅつりょくがONになることがある。

適切てきせつ設計せっけい技法ぎほうにより設計せっけいしゃ競合きょうごう状態じょうたい認識にんしきして事前じぜんにそれを排除はいじょすることができる(カルノー)。ほかにもじゅん安定あんてい状態じょうたい (metastable state) が発生はっせいすることもある。

情報処理じょうほうしょり

[編集へんしゅう]

情報処理じょうほうしょりにおける競合きょうごう状態じょうたいは「イベントタイミングへの予期よきせぬ依存いぞんこす異常いじょうい」である[2]とく複数ふくすうプロセススレッド通信つうしんしながら動作どうさする場合ばあい並行へいこう計算けいさん)に発生はっせいするが、たとえ単一たんいつスレッドで動作どうさしている場合ばあいであっても、イベント駆動くどうがたプログラミングのような非同期ひどうき処理しょりによって複数ふくすう処理しょり実行じっこう順序じゅんじょ前後ぜんごすることや、シグナルによる原因げんいん発生はっせいすることもある。

以下いかは「read-modify-write」(「状態じょうたいみ、変更へんこう状態じょうたいみ」を意味いみする典型てんけいてき処理しょり)で発生はっせいする競合きょうごう状態じょうたいれいである。

並行へいこう動作どうさする2つのスレッド T1 と T2 がそれぞれ整数せいすうがた共有きょうゆう変数へんすうグローバル変数へんすうiを 1 ずつインクリメントしていくとする。理想りそうてきには以下いかのような順序じゅんじょ処理しょりしたい。

  1. Integer i = 0;
  2. T1 が i のみ、レジスタに格納かくのうする : 0
  3. T1 が i のをインクリメントする : (i の現在げんざい) + 1 = 1
  4. T2 が i のみ、レジスタに格納かくのうする : 1
  5. T2 が i のをインクリメントする : (i の現在げんざい) + 1 = 2

このれいでは、i の最終さいしゅうてきとして 2 を期待きたいしている。しかし、ふたつのスレッドは並行へいこう動作どうさし、ロックや同期どうきなどの機構きこう使用しようしないため、処理しょり結果けっか間違まちがったものとなる可能かのうせいがある。以下いかにそのような場合ばあいのシナリオをしめす。

  1. Integer i = 0;
  2. T1 が i のみ、レジスタに格納かくのうする : 0
  3. T2 が i のみ、レジスタに格納かくのうする : 0
  4. T1 が i のをインクリメントする : (i の現在げんざい) + 1 = 1
  5. T2 が i のをインクリメントする : (i の現在げんざい) + 1 = 1

i の最終さいしゅう期待きたいされている 2 ではなく 1 となる。

以下いかは「check-then-act」(「条件じょうけん確認かくにん(check)、それにつづく(then)条件じょうけんおうじた動作どうさ(act)」を意味いみする典型てんけいてき処理しょり[3])で発生はっせいする競合きょうごう状態じょうたいTime of check to time of use[4])のれいである。ふたつのタスクをしめ擬似ぎじコードである。

global integer A = 0;

// A のをインクリメントして "RX" を表示ひょうじする
// 端末たんまつからのみが発生はっせいするたびに起動きどうされるものとする
task Received()
{
    A = A + 1;
    print "RX";
}

// A が偶数ぐうすうのときだけそれを表示ひょうじする
// 1びょう間隔かんかく起動きどうされるものとする
task Timeout()
{
    if (A is divisible by 2)
    {
        print A;
    }
}

出力しゅつりょく結果けっか以下いかのようになるだろう:

0
0
0
RX
RX
2
RX
RX
4
4

ここで、以下いかのような順序じゅんじょでイベントが発生はっせいする場合ばあいかんがえる:

  1. タイムアウトによってタスク Timeout起動きどうされる。
  2. タスク TimeoutA調しらべ、偶数ぐうすうだったので、つぎの "print A" を実行じっこうしようとする。
  3. 端末たんまつからみが発生はっせいし、タスク Receivedえられる。
  4. タスク Received最後さいごまで動作どうさし、A をインクリメントして "RX" を表示ひょうじする。
  5. 制御せいぎょがタスク Timeoutもどされる。
  6. そのタスクは A を表示ひょうじするが、そのときに A の現在げんざい使用しようするため、5 が表示ひょうじされてしまう。

ミューテックスは、並行へいこうプログラミングにおけるこのような問題もんだい対処たいしょするために使つかわれる。

競合きょうごう状態じょうたい概念がいねんとして、データ競合きょうごうえい: data race)がある。データ競合きょうごう単一たんいつのデータにたいする同時どうじきが一貫いっかんせいこす現象げんしょうのことをす。データ競合きょうごうはそのデータへのアクセスをプロセッサがつアトミック命令めいれいのようなつぶちいさい排他はいた制御せいぎょ保護ほごすることによって回避かいひできるが、競合きょうごう状態じょうたい回避かいひできるとはかぎらない。アトミック操作そうさでなければならない金融きんゆうトランザクションのように、動作どうさのタイミングによらず処理しょり結果けっか一貫いっかんせいたも必要ひつようがある場合ばあいは、よりつぶおおきい排他はいた制御せいぎょ可能かのうなミューテックスなどの同期どうき調停ちょうてい機構きこう使つか必要ひつようがある。

競合きょうごう状態じょうたい実例じつれい

[編集へんしゅう]

ファイルシステム

[編集へんしゅう]

ファイルシステムにおけるファイルロック一般いっぱんてき解決かいけつほう提供ていきょうする。もっと面倒めんどうだが根本こんぽんてき解決かいけつさくとしては、あるファイルについてひとつのプロセスが排他はいたてきなアクセスけんち(デーモンのような動作どうさをする)、のプロセスがそのファイルにアクセスしたいときはプロセスあいだ通信つうしんでそのプロセスに依頼いらいするという方式ほうしきかんがえられる(もちろん、そのさいにプロセスレベルの同期どうき必要ひつようである)。

ネットワーク

[編集へんしゅう]

ネットワークでは、IRCのような分散ぶんさんチャットネットワークがあり、ユーザーはあらたなチャンネルを開始かいしさせるとそのオペレータ特権とっけんる。ことなるサーバを使用しようちゅう2人ふたりのユーザーがおな名前なまえのチャンネルを同時どうじ作成さくせいしようとする場合ばあい、それぞれのサーバは対応たいおうするユーザーそれぞれにオペレータ特権とっけんあたえてしまう。これはべつのサーバからの信号しんごうとどまえ特権とっけんあたえてしまうことから発生はっせいした。なお、現在げんざいではおおくのIRCサーバの実装じっそうでこの問題もんだい解決かいけつされている。

この場合ばあい競合きょうごう状態じょうたいでは、リソース共有きょうゆうのコンセプトでネットワークの状態じょうたいかくして、かくサーバが自由じゆう状態じょうたい変更へんこうしたのちでネットワークじょうのサーバにその変化へんか通知つうちしている。しかし、ネットワークによる遅延ちえん(レイテンシ)があるためにこのような競合きょうごう状態じょうたい発生はっせいするのである。この競合きょうごう状態じょうたい解決かいけつするには、なんらかの中心ちゅうしんとなるシステムを用意よういしてチャンネルの生成せいせい特権とっけん付与ふよ集中しゅうちゅう管理かんりする必要ひつようがある。ユーザーがそのような解決かいけつさくれられない場合ばあい競合きょうごう状態じょうたい検出けんしゅつしてからそれを訂正ていせいするなどの処理しょり必要ひつようとなる。

人命じんめいかかわるシステム

[編集へんしゅう]

競合きょうごう状態じょうたい致命ちめいてき問題もんだいこした事例じれいとして、放射線ほうしゃせん療法りょうほう機器ききセラック25(Therac-25)の事故じこがある。この装置そうち制御せいぎょをつかさどるリアルタイムOSには、競合きょうごう状態じょうたいによってこされるバグが存在そんざいしていたが、この判明はんめいしにくいバグが原因げんいんで、操作そうさコマンドを素早すばやんだ場合ばあい、セラック25ではXせんよう金属きんぞくせいターゲットをきちんと配置はいちしないままこうエネルギーの放射線ほうしゃせん照射しょうしゃする設定せってい可能かのうになっていた[5][6]。そもそもこの装置そうちは、従来じゅうらい搭載とうさいされていた電気でんき機械きかいしき安全あんぜん保護ほご装置そうち(ハードウェア・インターロック)をのぞいてソフトウェア制御せいぎょえてしまっていた。結果けっかとして顕在けんざいしたソフトウェアのバグがきばをむきし、6けん重大じゅうだいばく事故じここし、5にん患者かんじゃ死亡しぼうすることになった[7]

れいとして、オハイオしゅうの FirstEnergy しゃ電力でんりょく管理かんりシステムの事故じこがある。このシステムは警報けいほう装置そうち競合きょうごう状態じょうたい発生はっせいする問題もんだいがあった。3ほんのたるんだ送電そうでんせん同時どうじはずされたとき、競合きょうごう状態じょうたい発生はっせいして監視かんし要員よういん警報けいほうとどかなかった。このソフトウェアじょう問題もんだいによって2003ねんきたアメリカだい停電ていでん発生はっせいした。

コンピュータセキュリティ

[編集へんしゅう]

述語じゅつごたとえば認証にんしょうのための真理しんりかえ演算えんざん関数かんすう)のチェックと使用しようにかかわる競合きょうごう状態じょうたいというものがある。チェック時点じてん使用しよう時点じてん状態じょうたい変更へんこうできるなら、競合きょうごう状態じょうたい発生はっせいする。このような競合きょうごう状態じょうたい発生はっせいさせるバグがコンピュータセキュリティかかわるコードに存在そんざいすると、セキュリティホールになる可能かのうせいがある。たとえば、ファイルのアクセスけんをチェックしたのち実際じっさいのファイルオープンをする場合ばあい(あくまでもオペレーティングシステムうちのこと)、チェックとオープンのあいだにファイルをすりかえる(たとえばシンボリックリンクにする)と通常つうじょうアクセスできないファイルにアクセスできる(これは、オペレーティングシステムにバグがある場合ばあいはなしであって、一般いっぱん可能かのうというはなしではない)。

非同期ひどうき有限ゆうげん状態じょうたい機械きかい

[編集へんしゅう]

つねに1ビットだけ入力にゅうりょく変化へんかすると仮定かていしている非同期ひどうき有限ゆうげん状態じょうたい機械きかいは、同時どうじ複数ふくすう入力にゅうりょくビットが変化へんかすると障害しょうがい発生はっせいする。これにたいする解決かいけつさくとしては、マシンを設計せっけいするさいかく状態じょうたい検知けんちする入力にゅうりょくビットの変化へんかを1ビットに限定げんていすることである。

種別しゅべつ

[編集へんしゅう]
静的せいてき競合きょうごう状態じょうたい
ある信号しんごうとその否定ひてい信号しんごう入力にゅうりょくとしてあたえられるときに発生はっせいする可能かのうせいがある。
動的どうてき競合きょうごう状態じょうたい
一回いっかい遷移せんい期待きたいされているときに多重たじゅう遷移せんい発生はっせいする。これはゲートあいだ相互そうご作用さよう発生はっせいする。2段階だんかいよりおおいゲートを使つかわないことでふせぐことができる。
基本きほん競合きょうごう状態じょうたい
全体ぜんたいのフィードバック伝播でんぱ時間じかんよりみじか間隔かんかくで2かい入力にゅうりょく変化へんかすると発生はっせいする。入力にゅうりょく信号しんごうなんらかの遅延ちえん要素ようそれることで解決かいけつする場合ばあいがある。

脚注きゃくちゅう

[編集へんしゅう]
  1. ^ 競合きょうごう状態じょうたい(レースコンディション)とは - 意味いみをわかりやすく - IT用語ようご辞典じてん e-Words
  2. ^ Anomalous behavior due to unexpected critical dependence on the relative timing of events. FOLDOC. (2002) race condition.
  3. ^ In this idiom, the code first checks a condition, and then acts based on the result of the condition. Yu Lin, et al.. (2013) CHECK-THEN-ACT Misuse of Java Concurrent Collections. 10.1109/ICST.2013.41
  4. ^ Secure programs must determine if a request should be granted, and if so, act on that request. There must be no way for an untrusted user to change anything used in this determination before the program acts on it. This kind of race condition is sometimes termed a time of check - time of use (TOCTOU) race condition. Secure Programming HOWTO
  5. ^ 史上しじょう最悪さいあくのソフトウェアバグ」ワースト10を紹介しょうかい(うえ) | WIRED.jp
  6. ^ History's Worst Software Bugs | WIRED
  7. ^ ソフトウェアのバグによって6けん重大じゅうだい放射線ほうしゃせん事故じここされた「セラック25事故じこ」とは? - GIGAZINE

関連かんれん項目こうもく

[編集へんしゅう]

外部がいぶリンク

[編集へんしゅう]

参考さんこう文献ぶんけん

[編集へんしゅう]