適用範囲:Arm v8-A Architecture
回答:
Arm アーキテクチャの汎用イベントシグナルのメカニズム(WFE/SEV/SEVL命令経由で実装され、アーキテクチャ上暗黙的に振る舞います)は、通常、プロセッサが要求するリソースが競合していて、一時的にリソースを利用できない場合に使用されます。
基本的なシーケンスは以下の通りです:
- リソースの使用の可否をテストします。
- 使用できない場合はリリースが通知されるのを待ち、テストを繰り返します。
- 使用できる場合はリソースを要求します。
"リリースが通知されるのを待つ"コードでは特にWait-for-Event(WFE)命令を実行することで、リソースがリリースされたことをあらわすためにイベントシグナリングメカニズムを使用します。A32以前の命令セットでは、リソース競合コードは条件付き実行を利用して、WFEが必要かどうかを簡単かつ効率的に決定できます。A64では条件付き実行がサポートされていないため、効率的なリソース競合の対応には少し変更したアルゴリズムが必要です。
例として、単純なスピンロックを以下に取り上げます(レジスタの初期化コードは含んでいません):
sev
1: wfe
2: ldaxr w1, [w0]
cbnz w1, %1b
stxr w1, w2, [w0]
cbnz w1, %2b
条件実行ができないため、スピンロックの可用性テストに失敗した場合はロックを再ロードして再度テストを行う前にWFEに分岐します。最初にロックのロードを試みる前にコードがイベント待ちでハングアップしないことを保証するため、スピンロックを競うループに入る前には明らかに最初のSEVが必要となります。
しかしながらここに示したコードでは送信イベントはシステム内のすべてのコアにブロードキャストされます。これは安全ですが必要ではありません。イベントの目的はローカルプロセッサのループに入ったときにWFEを抜け出すことであり、他のコアはイベントを受信する必要がありません。
A64では、SEVL命令を提供することにより、システム内の他のコアを不必要にウェイクアップさせることなく、ローカルのイベント待機を解除できます。
上記のサンプルアルゴリズム(SEVL命令の使用を除く)は、A32および以前の命令セットで使用される"従来の"スピンロックよりも洗練されたソリューションを提供することに注意してください。
イベントメカニズムのアーキテクチャ上の定義は、競合しているロックに関係のないイベントがすでにシステムに保持されている可能性があることを意味します。A64アルゴリズムは、すべての保持されたイベントがクリアされることを保証し、それによってロックの可用性の"誤検知"の割合を減らします。