ch04: ☆☆☆context switch
92ページ、最初のパラグラフの最後の部分:
If several are available, it may not use the one that it cleaned, leaving any other threads waiting for the buffer that it cleaned sleeping forever.
意味はわかるのだけど、なんかこのままじゃいけないんじゃないかという気がするのです。
現在の訳はこう:
複数のバッファが利用可能であれば、自分が指定したバッファを利用しないこともある。その場合、そのバッファを待っている他のスレッドがあれば、それらは永遠に休眠状態から抜け出せなくなってしまう。
これは、空のバッファを取得するために、適当なバッファの書き出しを要求して、その完了を待機するスレッドの話。
どれでもいいからとりあえず何かで待っておいて、別に待ってたやつが必要なわけじゃないので、何でもいいから使っちゃえというところまではいい。ただ、そうすると、最初に指定していたバッファを待っていたスレッドがあると、それはブロックしたままになっちゃうよと言っているような気がする。それでは困るわけで、その解決策がこの後の文章にも出てこないような気がするのだけど、これでいいのだろうか? それとも解釈がおかしいですか?
ひょっとして、これに対する解決が、その後に説明されている wakeup_one なのか?
ここでmay notを禁止と考えてはどうでしょうか。前後が分からないのでitもcleanも具体的に何か分かりませんが、
「複数(のバッファ?)が利用可能な場合、自分がcleanしたものを使ってはいけない。・・・」というのは意味が通っている気がします。
投稿: himazu | 2005-07-25 23:51
himazuさんに賛成一票。直訳するとこんな感じでは?
「複数が利用可能な場合、そのスレッドがcleanしたバッファを待って永久に眠るようなスレッドを残したまま、そのバッファを利用してはならない」
#cleanの意味がわからんです。Mutexのフラグの解除?
投稿: Jadawin | 2005-07-26 10:31
clean は dirty buffer を書き出すという意味です。知らなかったけど、ちょうどこの章はサンプルとして見ることができますね。
http://www.informit.com/articles/article.asp?p=366888&seqNum=3
この文章自体の意味は、今の訳で間違っていないと思います。で、もう一度通して読んだら理解できました。
この文章の前にあるのは、イベントが発生した時に wait channel で待っているスレッドを全部 wakeup しないといけないという記述です。その後に、全部を wakeup しないとどうなるかという例が挙げられていて、この文章はその最後の部分なんですね。だから、間違った挙動で正しいのです。解決策は、後ではなく前に書いてあったのですね。もう少しわかりやすい書き方をした方がいいんじゃないかとは思います。
一文ずつ訳していると、前後のつながりを見失ってしまうことがあるようです。そのせいでご迷惑をおかけしました。どうもすみません。
投稿: utashiro | 2005-07-26 11:23
原文のままでは意味がわかりづらいので、こんな風にしました。
複数のバッファが利用可能であれば、自分が指定したバッファを利用しないこともある。そのバッファを待っている他のスレッドがあれば同時に覚醒しないと、それらは永遠に休眠状態から抜け出せなくなってしまうのである。
この後に、1つのスレッドだけを wakeup するための方法として wakeup_one について述べられます。この機能をはじめてカーネルに取り入れたのは、僕が知る限りでは Sun の NFS 実装ですね。いくつも走っている nfsd や biod を全部 wakeup するのは無駄だというのが理由でした。
投稿: utashiro | 2005-08-17 13:56