がUnderstanding the Linux kernel (Bovet & Cesati),
て読んでいたカーネル同期の章では、スピンロックの取得コードがに沸くと述べている:Linux/SMPスピンロックが不必要に遅くなっていますか?
1: lock:
btsl $0, slp
jnc 3
2: testb $1, slp
jne 2
jmp 1
3:
今、私はもともとループを入れ子にしているために、あなたのようなものを実装することができ、無駄なように見えたと思いました:
1: lock:
btsl $0, slp
jc 1
これはずっと簡単です。しかし、lock
が他のCPUに影響を及ぼし、btsl
のタイミングが単純なtestb
のタイミングよりも大きいため、なぜ彼らはそれを行ったのか分かりません。
私がを持っていないことの1つは、が私の頭を浮かべることができなかったことです。その後のスピンロックのリリースです。この本は、それは次のように得られることを述べて:
lock:
btrl $0, slp
私の質問は基本的になぜですか?lock/mov-immediate
のコンボは高速です。
カーネルがバグフリー(カーネル内の他の多くの場所であることが前提)の規則に従って、古い状態は1になるので、キャリーフラグに古い状態を取得する必要はありませんあなたがまだそれを取得していなければそれをリリースしようとはしません)。
そしてmov
、btrl
よりもはるかに高速である、少なくとも386
にだから私は何をしないのですか?
後のチップでこれらの命令のタイミングが変更されましたか?
本の印刷以降にカーネルが更新されましたか?
本は間違っている(または簡略化された説明を表示していますか?
私は、より速い命令が満足しないCPU間の同期を含むいくつかの面を見逃しましたか?