2016-11-01 8 views
2

私は約Read-copy-update (RCU)を読んでいます。私はSMPの場合に正しく理解しているかどうかはわかりません。私が知る限り、RCUはUpdateが原子的に実行されることを保証します。例えば単一のリンクされたリストの場合、古い要素を新しい要素と交換することは、ポインタを変更することによって行われるため、1つの操作で実行できることは明らかです。しかし、二重リンクリストの場合にRCUが依然として原子的に実行されるようにする方法はありますか?与えられた要素には2つのポインタポイントがあります(nextとprev)。この要素のすべての変更がこれらの2つのポインタを変更する必要があります。 これらの2つのポインタをアトミック操作として変更する方法を確認するにはどうすればよいですか? どのようにLinuxで行われますか?Linux RCUと二重リンクリスト

答えて

1

私は同じ質問をしていました。a reply to a commentan introduction article to RCUからポール・マッケニー(私が収集したものから、RCUの背後にあるアイデアの複数の発明者の一人です)によって抽出されました。

質問:私は例のバックリンクの省略が 良いことであるかどうかと思いまして

。 の発行には、1つのポインタを置き換えるものが1つしか含まれていないため、省略すると技法が簡単になります。

第2、バック、ワンはどうですか?アトミック2ポインタ の更新がサポートされていないと、クライアントに 二重リンクの一貫性のないビューが表示されることなく、p-> prev-> next = qおよびp-> next-> prev = q更新を実行できますリスト?それとも実際には問題ではないですか?

こちらの記事に感謝します。次の記事を楽しみにしています!

答え:あなたは記事を気に入って、優れた質問をありがとうございました

うれしいです!私は、以下を含むいくつかの答えを与えることができます: 生産システムでは、簡単なテクニックは非常に良いことです。 RCU保護下で - > prevポインタをトラバースすると便利な例を示してください。このような例がいくつかあることを考えれば、これをどのようにサポートするのが最善かを考え出すことができます。 一貫性が過大評価されています。 (しかし、誰もがこれについて私に同意しているわけではありません!) アトミックな2ポインターの更新でも、次のような一連のイベントを考えてみましょう:(1)タスク1はp = p-> nextタスク1がちょうど処理した2つのタスク(1)タスク1はp = p-> prevを実行し、開始したところで終了しません!二重ポインタアトミック更新でさえ、矛盾が解消されません! ;-) 一貫性が必要な場合は、ロックを使用してください。 上記の例では、ポインタを順番に割り当てるだけで、double-pointerアトミック更新と同等のレベルの整合性をサポートできます。たとえば、list_del_rcu()からprev-pointer poisoningを削除するだけです。しかし、これを実行すると、現在、ポインタの中毒がキャッチしているバグをキャッチする能力が犠牲になります。

Linuxカーネルが双方向のリンクリストのRCU保護されたトラバーサルを許可することは間違いありませんが、実装する前に迫っている必要があります。

したがって、基本的に、LinuxはRCUを実行しているときに両方向に逆方向にトラバーサルを「許可」しません。コメントに記載されているように、Double Compare And Swapのような新しいハードウェアメカニズムを使用することもできますが、どこでも使用できないため、前述のようにメモリの一貫性の問題が発生する可能性があります。

関連する問題