TVarはどのように機能しますか?私が読んだところによると、すべてのトランザクションを受信するとすぐに実行しようとしますが、トランザクションが完了すると、現在実行中の他のトランザクションが無効になり、再起動する必要があります。これはTVarの仕組みですか?
この場合、100ミリ秒ごとに1ミリ秒の長さのトランザクションが発生する場合、処理に200ミリ秒かかるトランザクションは決して完了しないことを意味しますか?
TVarはどのように機能しますか?私が読んだところによると、すべてのトランザクションを受信するとすぐに実行しようとしますが、トランザクションが完了すると、現在実行中の他のトランザクションが無効になり、再起動する必要があります。これはTVarの仕組みですか?
この場合、100ミリ秒ごとに1ミリ秒の長さのトランザクションが発生する場合、処理に200ミリ秒かかるトランザクションは決して完了しないことを意味しますか?
2つのトランザクションが個別にアクセスする限り、TVars
相互に無効にすることなく、両方を同時にコミットできます。
トランザクションがいつ無効になるかを明確にするために、次のシナリオを考えてみましょう。
t :: TVar Int
初期化され0
、経由で読み取られるとします。readTVar t
A
B
が開始されます。writeTVar t 1
の前にB
コミットするとしA
ます。B
STMシステムは、不整合がないかどうかをチェックし、この時点でコミットしても安全であると結論付けます。これで、writeTVar t 1
有効になります。A
が無効になります。(コミットが許可された場合、アトミック性の違反が発生します。)0
t
A
A
HaskellのSTMシステムに関する元の論文[1](セクション6.5を参照)は、あなたの質問に答えます。
「飢餓は可能です。たとえば、非常に長い時間実行されるトランザクションは、短いトランザクションと繰り返し競合する可能性があります。実際には飢餓が発生する可能性は低いと思いますが、それ以上の経験がなければわかりません。」
[1]ティム・ハリス、サイモン・マーロウ、サイモン・ペイトン・ジョーンズ、モーリス・ハーリヒー。並列プログラミングの原則と実践に関するACM会議2005(PPoPP'05)。
100ミリ秒ごとに1ミリ秒の長さのトランザクションが発生した場合、処理に200ミリ秒かかるトランザクションは決して完了しないことを意味しますか?
トランザクションは、同じに接触した場合にのみ競合するTVar
ため、1ミリ秒のトランザクションの一部が200ミリ秒のトランザクションの影響を受けるすべての変数を回避した場合、200ミリ秒のトランザクションを完了できます。さらに、STM
モナドは内部で許可されるものについて非常に厳密であるため(メモリアクセスと純粋な計算のみ!)、トランザクションの長さの間にこのような不一致があることは非常にまれです。通常、それらはほんの数メモリの読み取り/書き込みの長さであり、すべてのIO
その他の計算はトランザクション外で行われます。さらに、特定のトランザクションが他のトランザクションによって永久にブロックされるかどうかは、スケジューリングの問題です。GHCの現在のスケジューラーがどのように見えるかは100%わかりませんが、古い(またはより高い失敗率)トランザクションを優先することはもっともらしいようです。
とは言うものの、livelockは、の非常に現実的な問題でありSTM
、従来のロック同時実行の実装におけるデッドロックと同じくらい陰湿で、推論するのが困難です。
TVarはどのように機能しますか?
あなたはおそらくこの論文を楽しむでしょう: