プロフィール

kosaki

Author:kosaki
連絡先はコチラ

ブログ検索
最近の記事
最近のコメント
最近のトラックバック
リンク
カテゴリー
月別アーカイブ
RSSフィード
FC2ブログランキング

スポンサーサイト このエントリーをはてなブックマークに追加

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


スポンサー広告 | 【--------(--) --:--:--】 | Trackback(-) | Comments(-)

シーケンスロック その1 このエントリーをはてなブックマークに追加

3/13 ある人から文章指導をたくさんいただきました。
初版から細かいところの表現が結構変わってます。
でも内容は変わってません。

文章へたくそですいません。

----

どうも管理人です。

ひらメソッドで有名なひらさんの

スピンロックから始めるLinuxカーネル入門

を読んでいて感動したので僕もなにか書こうかと思い、今回はシーケンスロックです。

シーケンスロックってのはスピンロックと同じく、カーネル内部で使われるロックで、ユーザーからは見えません。
カーネルは1クロックでも速く動いてほしいとみんなが思っているので、状況に応じて色々なロックが使われていますが、スピンロックやらシーケンスロックってのは、そのロックの種類のことです。


しかしひらさんは凄い。
技術的な解説を技術屋に分かるように説明するだけでもたいしたモノだといわれるこのご時世に
ちゃんとお笑いまで仕込んであるんですから。
書いてある内容があまりにまともなので、ついつい真面目モードで読んでいると要所要所で襲ってくる

トイレの鍵!

なんで、そんなに強調するんだ(;゚д゚)ァ....



さて、とにもかくにもシーケンスロックです。

まず、問題提起から。

なんでスピンロックじゃあかんのやろ?
スピンロックってロック競合ない限り、世界で一番速いロックちゃったっけ?
教科書的には(セマフォとかとの対比で)そう書いてあるし、ひらパワポ見るとロック競合せん限り、xchg命令1命令やんか

ダメなんです

もちろん、ここで言ってるのは、そもそもLinuxのspin_lockってHyper Threading対応で
rep nop(*1) 入ってるから1命令ちゃうよねー、とかそういう事を話しているのではないのである。
もっと根本的な話。

spin_lockって読み手と書き手の区別ない
すると、読み手も当然のように以下のコード(
ひらパワポから抜粋)を通るのである。


spin_lock(lock){
while( trylock(lock)==0)
;
}
trylock(lock){
int num=0;
asm("xchg num.lock");
return;
}


くわ! オイラ読み手のはずなのに変数に書いてるよ。しかもご丁寧にバスロック付きだよ!

てなわけで、

・書き手1人、読み手(すごく)たくさん
・ロック範囲がすごく狭く、かつ、しばしば呼ばれるので1クロックでも惜しい

のような状況において、

神様、どんなに使いにくくてもいい。読み手がbus writeしないロックはないのでしょうか(つД`)

などと、開発者が思ってしまっても仕方がないことなのである。

*1 Pentium4以降はpause命令というインストラクションが追加されている。こいつで明示的にもう1つのスレッドを優先していいよーって言ってあげないとHyperThreadingで効率が落ちるんだね。
で、こやつが昔のCPUでうまく無視できるように rep nop とbit列が同じになるようになっているので、アセンブラで書くときは(最近までツールが対応してなかったせいもあり)みんな rep nop って書いてたのさ。
repは繰り返し(repeat), nopは無動作(No OPeration)で昔のCPUから見ると無動作を繰り返せ?なんか無意味なことやらせよんなー。となるが無動作なので別段問題は起きない


その2へつづく
関連記事
linux | 【2006-03-09(Thu) 23:52:51】 | Trackback:(0) | Comments:(2)
コメント
このコメントは管理人のみ閲覧できます
2007-10-11 木 08:57:32 | | # [ 編集]
このコメントは管理人のみ閲覧できます
2007-12-18 火 18:42:43 | | # [ 編集]
  1. 無料アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。