2016-01-12 17 views
6

に私はロバート・ラブによってLinuxカーネル開発のLinuxカーネルを勉強しています。atomic_tは、Linux

ご存知のように、本書は、Linuxの古いバージョンを使用しています。それは

atomic_tは "揮発性int型のカウンタを" 持っている2.6バージョンにあります。しかし、新しくLinux版のatomic_tには "int counter"がありません。なぜこの揮発性が消えたのですか?

+0

たぶんそれは、マルチCPUシステムでは十分ではありませんので、?または、APIが変更された可能性がありますか?もっと最近のリソースを取得するには、Linuxカーネルには固定された内部APIがありません。 – Olaf

+0

も[Cに必要な揮発性であるのはなぜ?]参照(https://stackoverflow.com/questions/246127/why-is-volatile-needed-in-c)と関連します。 – edmz

答えて

5

volatile変数はアトミック変数ではありませんので。 volatileを使用する唯一の点は、可能性のあるコンパイラの最適化を防止することです。これは、望ましくない並行アクセスを防止することと同じではありません。その点で

volatileの使用が正しいなることはほとんどありません。

あなたはSemantics and Behavior of Atomic and Bitmask Operationsでそれについての詳細を読むことができます。

それのごく一部を引用:

* WARNING:atomic_read()や障壁を意味するものではありませんatomic_set()! *

いくつかのアーキテクチャはatomic_readのための即時性をある程度()と atomic_set()を保証するために揮発性のキーワード、障壁、またはインライン アセンブリを使用することもできます。これは、明示的に均一に保証されていない、そして将来的に変更される可能性があり、 のでatomic_tのすべてのユーザーが(atomic_readを扱うべきである)とatomic_set()コンパイラ またはプロセッサによって並べ替えたり、完全に離れて最適化することができるシンプルな Cステートメントとして、およびそれぞれのユースケースに対して適切なコンパイラおよび/またはメモリ のバリアを呼び出します。そのようにしないと、 のコードが、別のアーキテクチャまたはコンパイラ の最適化、または コンパイラがatomic_t変数にアクセスするセクションを最適化する方法を変更する無関係なコードの変更さえ使用されたときに突然破損する可能性があります。 YOUが警告されています*

! *

+0

ありがとうございます。しかし、私はなぜカーネルがint変数のstructを使うのかを知りたい。私はなぜ単に "atomic_t counter;"(intがatomic_t型として定義されている場合)を使用するのではなく、 "int counter"という1つの属性しか持たないatomic_t構造体を使用するのですか? –

+1

私が指摘した文書によると、変数を構造体にラップして型として定義するのは、通常のC整数型にキャストするのを防ぐためです。 – jweyrich