回答ありがとうございます。

> [1] CPU1_Read
> [2] CPU2_Write
> [3] CPU1_Read
> のようなパターンでは意味があります. つまり, [1] で CPU1 が読み込
> んだ (そしてキャッシュに入れた) 領域に対して [2] で CPU2 が書き込
> み, その書き込んだデータを [3] で CPU1 が読み込むようなときには,
> [2] で CPU2 が書き込んだデータを [3] で CPU1 が確実に読み込めなけ
> ればなりません. ということで, CPU1 は CPU2 がデータを書き込んだと
> いう情報を元に自らの持つキャッシュを更新するかデータを無効にする
> 必要があります.
> # producer-consumer とか semaphore では必要そうな感じ.

例えばセマフォですと、swapとかtest&setのような不可分命令を用いなけ
れば、CPU1_Read -> CPU2_Read -> CPU1_Write -> CPU2_Writeのようにな
ってしまう可能性がありうまくないですし、swapを使うということは、セ
マフォの場所が予め判っているわけだから、マルチCPU下では非キャッシ
ュ領域使用とかCPUでパージするなどソフト的に行ってもなんの問題もない
気がするのです。共有領域がソフト的に明示であるということにより。

わざわざハードで搭載するということは、その状態を検知するのが非常に
難しい/時間が掛かるためなんではないかと思うのですが、セマフォのよう
にそんなに高速性が要求されなかったり、メッセージキューなどのように
相手や用い方が判っているような場合は、なくても問題が少ないんではな
いかと思うのです。なのでこういった使われ方以外の、何かソフト側では
想定しきれない(しかも1R-2R-1W-2Wパターンは起き得ない)用途があるの
かなと。

実は私の想定が甘々で、セマフォなどでもスヌープがないと全然わからな
い/高速性が要求されるなどあるのかもしれませんが、MMUのようにハード
でないと非常に困る、もしくはスヌープのパフォーマンス劣化に見合うと
いう状況があれば知りたいと思います。


goron