質問

最近、開発中のアプリケーション(私ではない)での競合状態についての懸念を書き留める必要があることに気付きました。これは、技術的ではなく、直接の連絡ラインを持っていない利害関係者の注意を引く可能性が高いため、説明は書面で行う必要があります。

私はすでにこの記事を書きました。可能な限り技術的な詳細を説明し、アプリケーションで競合状態がどのように発生するかの例を示し、その影響を説明します。かなりうまくいったと思うが、完璧とはほど遠い。

問題は、読者をコンピューターサイエンスから保護しようとする限り、「実行のスレッド」のようなフレーズを排除するのが難しいことです。および「相互排除」正確さと実質を失うことなく。リスクは、あまりに手を振ると、これらの懸念が偽造ブーギーマンとして却下される可能性があることです。

とにかく、あなたへの私の質問は次のとおりです。どのようにあなたは非技術的な聴衆に競合状態を説明しますか? CPUスケジューリングを説明する勇気はありますか? 食事の哲学者を呼び出しますか?

あなたは私の状況の制約内で作業する必要はありません(しかし、もしあなたがそうすればとても助かります)。

役に立ちましたか?

解決

X社の銀行には1,000ドルあります。 Xは家賃2,000ドルを支払い、会社Yに提供されたサービスに対して10,000ドルの支払いを受け取りました。ただし、競合状態のため、Xは1,000ドルの赤字で破産申請中です。 =(

銀行が会社Xの口座をこのように処理する方法を説明するとよいでしょう。銀行スタッフAは現在の価値1,000ドルを受け取り、それに10,000ドルを加算します。銀行のスタッフBは現在の価値1,000ドルを受け取り、そこから2,000ドルを引きます。銀行のスタッフAは、値を11,000ドルに更新します。銀行員Bは、値を-$ 1,000に更新します。

他のヒント

間違った結果が悪いであることが容易にわかるためと、そのような環境で競合状態が簡単に作成されるため、銀行取引は良い例かもしれません。

アカウントに500ドルあります。 誰かが$ 50を引き出すと同時に$ 200を私に送金します。

今、銀行が競合状態を適切に処理しない場合、銀行は次のことを行います(もちろん、トランザクションは手動で処理されると仮定します) 店員Aは、残高に200ドルを追加する要求を確認し、残高が現在500ドルであることを確認します。 店員Bは、残高から50ドルを差し引くリクエストを確認し、残高が現在500ドルであることを確認します(店員Aはまだ送金していません)。

事務員Aは書類を仕上げ、口座残高を700ドル(500 +彼が追加する予定の200)に設定します。 その後、1分後に(店員Bはコーヒーを1杯飲まなければならなかったため)、店員Bは他の取引を完了し、残高を450ドル(チェックしたときの500から差し引く50を差し引いた値)に設定します)。

競合状態のため、残高は650ドルであったはずの450ドルになりました。結果は、2つのトランザクションの異なる部分が実行された順序に依存していました。

これは、競合状態がどのように悪いかの一般的な説明です。ここで、事務員の代わりに、アプリケーションが2つの個別のタスクを同時に処理する(つまり、「実行のスレッド」)とし、上記のように、両方とも値を読み取り、 they を読み取り、次に書き戻します。上記の順序でこれが発生すると、変更の1つが失われる可能性があります。 これは、アプリの特定の問題に関連付ける必要があります。

食事の哲学者のようなアプローチを取りますが、聴衆によっては、聴衆の文脈に類推しようとします。経営者と話していますか?次に、会議室や社用車の割り当て、ホテルの部屋の予約などに類推します。平均的な人と話していますか?食事の哲学者の例は素晴らしいです。あるいは、家畜の世話や椅子に座っているなど、似たような状況を考えることができます。

食事の哲学者の例をハイジャックするか、自分で作るかは、必ずメタファーを使用してください。

専門知識のない聴衆に向けて書いている場合は、説明を簡素化し、理解できるものに関連付けたいと思うでしょう。経験の浅いプログラマーに並列コンピューティングを教えるための論文Analogiesからの1つの説明( http:// portal .acm.org / citation.cfm?doid = 1189136.1189172 )はペンゲームの観点から説明しています:

  

私たちはと呼ばれるゲームをプレイします   ペンゲーム。ルールは単純です:I’ m   ペンを手に持って、   そして、私は“「1、2、3、行く」と言います。”   「行く」と言うと、”私からペンを取ります   ハンド。ペンを取得した人が勝ちます。   準備はいい? 1、2、3、行く。

次に、このゲームの結果を事前に予測できるかどうかを尋ねます。予測できない場合、正しい結果を保証できますか?これにより、同じメモリへの同時書き込みで誤った結果が得られる可能性があることに気付くはずです。

私は食事の哲学者を推薦するつもりでしたが、あなたはすでにそれを見つけたと思います。では、代替として、gridlockを類推として使用してはどうですか?

単一の都市ブロックの隣にある4つの通り(North ave、South ave、East通り、West通り)に沿って運転する通常の交通を想像してください。道路に車が1台か2台しかない場合、すべてがスムーズに動きます。安定した交通がある場合、一部の車は停止し、他の車が通り過ぎるのを待つ必要がありますが、これは管理可能な問題です。 1台の車が止まり、別の車が通過するのを待ってから、陽気な道を進みます。

今、同じ場所でのラッシュアワーの交通状況を写真に撮ってください。ウェストストリートを南方向に走行する1台の車が、私たちの街区のノースウェストコーナーの交差点を完全に通過できないとしましょう。その車は現在、北アベニューの西行きの交差交通をすべてブロックしています。 Westboundの車がNorthEastコーナー交差点を通過しようとしてスタックするのに時間がかかりません。East通りのNorthboundのすべてのトラフィックをブロックします。この状況が4つの交差点の周囲を完全に移動すると、車は移動できなくなります。それぞれが前の車が前方に移動するのを待っていますが、車を後方に引き出さずにグリッドロックを解放する方法はありません。

コンピューティングとの比較は簡単です。車はスレッドまたはプロセスであり、道路と道はプロセッサー、バッファー、またはコアです。ブロッキングの概念は、信号機や一時停止標識を使用して説明でき、プログラマー以外でも直感的に理解できるようになります。

プログラムを書く:

  1. 給与を待つ。
  2. お店に行きます。
  3. 食べ物を買う。
  4. プレートをオンにします。
  5. 皿の上に食べ物を置きます。
  6. プレートを20分間保ちます。
  7. 食べる
  8. 就寝。

今、2つのスレッド(あなた、妻)が同期なしでそれを実行しようとしています。

  • あなた:給料を待ってください。
  • 妻:お金がなくても店に行く、クラッシュする

  • あなた:プレートの電源を入れます。

  • あなた:プレートを20分間保ちます。
  • あなた:寝る。

  • 妻:他人の場所で食べる。

  • 妻:寝る。

ピーターは私道から抜け出したいと考えています。彼は車の邪魔にならないものを確認し、車に乗り込みます。息子のフランクは車の後ろに隠れます。ピーターは彼を見ることができず、彼を追いかけます。

ここで重要なことは、コンピューターの「検査」および「変更」 2つの別個のアクションになる傾向があるため、変更時に何かをチェックできない例は良いものです。

明白なことはどうですか?

競合状態とは、文字通り2人の競合です。

会社がプロジェクトに入札しています。入札で独立して働く2人の従業員が顧客にそれらを送信しますが、従業員の1人は古い情報を持っています。どちらの従業員も他方の従業員が入札を送信中であることを知らないため、誰が早いかによって、最初の入札は遅い従業員に置き換えられます。入札単価は時間とともに変化する可能性があるため、これにより混乱が生じます。

一緒に働くか、どちらか一方を停止するには、2人の従業員の間でコミュニケーションが必要です。

一般的な概念を説明する際の難しさの1つは、競合状態がさまざまな状況で現れることです。技術的でない視聴者にこれが一般的な問題タイプであるという感覚を与えることが目標である場合、複数の例を提供するようにしてください。

写真は1000語に相当します。それは本当です。タイムラインを描画してエンティティを配置し、時間の経過とともにその状態の変化を表示すると、1つの図で競合状態を非常に簡単に示すことができます。写真を適切に表示するには数回のやり直しが必要な場合がありますが、それを描くことは、説明するよりも速くポイントを取得する必要があることを常に発見しています。

並行性について考えることは本質的に難しいため、これを簡単な方法で説明するのは難しいと思います。金融取引の基本的な考え方は、人々が実際の生活からある程度慣れているため、始めるのに適した場所です。

どのような種類の取引でも、借方と貸方の2つの場所で同時に入力する必要があります。他の誰かが別のトランザクションを実行しようとすることにより、トランザクションが途中で中断されると、いずれかのアカウントで間違った残高が表示されます。

オペレーティングシステムアプリケーションによる構造化同時プログラミング(私が思い出すように)

貧しい国、ベゼルキスタンでは、2本の線がトンネル内の1つの線路に合流します。衝突があり、支配政権には解決策が必要です。

問題は、山岳地帯であり、エンジニアが盲目であることです。トンネルで衝突しようとしている2つの列車の事前警告はほとんどありません。

計画は次のとおりです。

  1. 分岐点に大きなボウルを置きます。

  2. 各エンジニアに小さな真鍮の猿を与えます。

トンネルに入ろうとすると、列車を止めます。ボウルをなでて、ボウルに真鍮の猿がいるかどうかを確認します。

サルがいる場合、他の誰かがトンネルを使用しているので、列車がトンネル内に完全に収まるまで待つ必要があります。

サルがいない場合、他の誰もトンネルを使用していません。だから、あなたは猿をエンジンコンパートメントからつかみ、ボウルに入れて、トンネルを通り抜けることができます。もちろん、指揮者が真鍮の猿を取り戻すことができるように、一時停止します。

当てはまりますか

彼らはまだ衝突を起こしました!

なぜですか?これが失敗する状況またはアクションのシーケンスは何ですか?


これは競合状態です。

書面で、競合状態が事故につながる方法を説明できます。

プレゼンテーションでは、並行性とロックについての推論を通じて視聴者を指導できます。

iは、データの競合状態の共有メモリバンクアカウントの例を使用します。

コンピュータは次のようなことを行うことを説明します。負荷バランス。 1を追加します。店舗残高;。銀行口座の残高を変更している2つのスレッドを検討します(あなたとあなたの妻は両方とも同時に1ドルを預けています)。

両方のスレッドが次の後に中断される場合:負荷分散。再開すると、1ドル失う可能性があります。

参照: http://wasp.cs.washington.edu/atomeclipse/handouts .pdf

あなたが述べたように、比conditionsであっても、競合状態を正確に記述するために、他の概念(相互排除、実行のスレッド)を導入する必要があることがよくあります。したがって、メタファーを使用して、最初にこれらの用語を定義する(または少なくともアイデアを理解する)ようにしてください。

簡単な例として、4方向の交差点(右側を運転する国に設定)を使用しましょう。交差点を北西、北東、南東、南西の4つの象限に分割します。各象限をリソースと呼び、各車を実行のスレッドと呼びます。これらの車は交通システムのみを尊重し、この交差点には一時停止標識や信号機がないため、車は減速したり交通を考慮したりせずに直進します。

これらの象限のうちの1つを複数の車で同時に使用することは悪いことであり、車がクラッシュすることを簡単に示すことができます。明らかな解決策の1つは、交通システムを設置することです。システムは、1つの象限が同時に1つの象限を通過しないようにします。すべてのリソースを使い果たすことなく、これを複雑に行うことができます。たとえば、南から来る車を左折して西に向かう(南東および北西の象限を使用)一方で、西から来る車を右折して南に向かう(南西の象限を使用) 。交通システムは相互排除を提供するか、共通リソース(交差点の道路の象限)の同時使用(複数の車による)を防止しています。

これは、少なくともこれらの定義の背景にあるアイデア、共有リソースへの同時アクセスが 悪いことがあり、相互排除がこの問題を解決できるというアイデアを提供します。これが確立された後、これらをより適切なメタファーにマッピングして、競合状態とは何か、共通リソースの相互排除がないことから生じる悪い状態の1つであることを示す必要があります。

少し時間がかかりますが、より複雑なメタファーにドリルダウンする前に、用語と全体像にある程度精通します。

利害関係者にお金について話すと、特に彼らが実際のお金を失っていると彼らがパニックモードに陥る場合があります。競合状態を誰に説明するかについての経済的指向の低いストーリー。

このストーリーはデッドロックの概念には対処しませんが、より伝統的な競合状態のシナリオと結果に対処します。

ストーリーはここから始まります:

設定:鉄道ネットワークで接続された3つの都市があります。電車には3つの都市すべてで使用されており、鉄道網はすべての標識を変更する手間を処理したくないため、どの都市から来てどの都市に行くのかを示す標識はありません時間。ネットワークは小規模であるため、列車の発着の具体的なスケジュールはありません。駅の監督者は、列車が出発するときに他の市の駅の監督者から電話を受けるだけです。監督者は出発時刻を記録し、すべての列車が同じモデルであるため、同じ速度で運転します。他の都市から駅の人々に「次の列車は都市Cに向かう」とアナウンスします。そのため、都市Cへの旅行を希望する人々は、列車を待って、都市Cに飛び乗って陽気に乗ります。

問題:しかし、ある日、列車がAからBからCへのルートを計画していたときに、AとBの中間で故障しました。幸いなことに、技術者は非常に熟練しており、短時間で列車を修理することができます。しかし、その同じ日、別の列車もCからB、Aへの異なるルートを計画していました。駅Bの監督者はAから列車が来るという電話を受け、まもなくCから別の列車も来るという電話を受けました。駅の監督者は、駅で待っている乗客に次のように発表しました。「最初に到着する列車は駅Cに向かい、列車の直後に駅Aに向かいます」乗客が荷物を収集し、それぞれのプラットフォームに行きました。監督は列車が来るのを見て、人々が都市Cに向かう予定のプラットホームにレールをリダイレクトしました。列車が実際に都市Aに行くことをほとんど知りませんでした。機械的な問題を解決した後、他の列車も駅に到着し、監督は喜んでそれを都市Aに行きたい乗客を含むプラットフォームに向けました。言うまでもなく、乗客は誰もが予定した場所に到着しませんでした監督者は、彼らが通常通りに到着すると想定した。

競合状態と多くのコンピューターサイエンス構成の問題は、人々がコンピューターではないことです。私が生徒にアルゴリズムを説明するたびに、彼らは「しかし、そのようにするのは理にかなっていない」と言います。それはさておき、レースの状態をレースとして説明する必要があります。できれば、実際にレースを試してもらうのが最も理にかなっています。そうすれば、彼らは物事がどのようにうまくいかないかを見ることができます。しかし...彼らは常識を使うことを許されていません。

だから、2人が赤、オレンジ、黄色の順に色付きのブロックのスタックを埋めるゲームがあるとしましょう。赤、オレンジ、黄色のブロックがたくさんあります。すべてのスタックは、正確に3ブロックの高さである必要があります。

最初のゲームでは、両方ともこれをできるだけ速くしようとしますが、独自のスタックでのみ動作します。

2番目のゲームでは、お互いのスタックにブロックをスタックすることを許可することで、彼らは一緒に作業しようとします。ただし、手に持っているブロックを変更することは許可されておらず、計画されたブロックを配置する必要があります。

このような状況がスタック1で発生することを想像できます。

player 1 grabs a red block
player 1 places red block         - player 2 grabs an orange block
player 1 grabs an orange block    - player 2 places an orange block
player 1 places an orange block

これで、2つのオレンジ色のブロックを持つスタックができました。人間のゲームでは、人々が常識を持っているため、これが決して起こらないことは明らかです。オレンジブロックが既に配置されていることを確認し、オレンジブロックを配置する決定を元に戻します。

次の動画も視聴できます: https://www.youtube.com/watch? v = TcGwNdbsAbc

ホワイトボードを使用して、簡単な会計タスクを実行しましょう。手元に100ドルあります。ホワイトボードに書きます。

アリスには合計100ドルの請求書がたくさんあるので、彼女は100ドルに注意し、リストに追加して5分後に戻ってボードに200ドルを書き込みます。

ボブは買い物をしています。彼はホワイトボードからその数を取り、50ドル相当の購入を差し引いてから、ボードに50ドルを書き込みます。

ボブが最初に戻ってきた場合、アリスが結果を書き込んだ後に200ドルが表示されます。アリスが最初に戻った場合、50ドルが表示されますが、これも間違っています。私たちが見たい は150ドルです。それを実現するためにどこかに予防策を追加する必要があります。

これは、合理的な直感で技術的ソリューションの議論を行うのに十分なはずです。

たとえば、ミューテックスとは、ホワイトボードのある部屋のドアをロックし、そこで作業を行わせることを意味します。楽観的な解決策とは、不在中に番号が変わった場合にチェックとやり直しの両方をさせることです。デッドロックについて話したい場合は、ボブがロックされた部屋の中からアリスに電話して急いでもらうように笑うことができます。

ウィキペディアのレース条件に送信します。

最初の部分はある程度意味があり、残りの部分(以下には示されていません)は、あなたがそれを理解していると仮定するため、スマートに見えます。

"競合状態または競合ハザードは、システムまたはプロセスの欠陥であり、それによりプロセスの出力および/または結果は、他のイベントのシーケンスまたはタイミングに予想外かつ重大に依存します。この用語は、2つの信号が互いに競合して最初に出力に影響を与えるという考え方に由来しています。"

理解するための重要なポイントは、最も頻繁に発生するタイミングの問題であり、時がかかるタイミングは時々異なるため、予測できないことです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top