.やっぱり単純に、負け戦はするな、ということです。うん。あくまでも一般論として、過去にあったことをあったこととして「しょうがない」と割り切るのも必要なことだ。それは、未来に同じことを繰り返すべきではないということとは全く矛盾しない。だいたい、久間大臣だって長崎の人なんだから、原爆肯定の意図なんて含んでるわけないじゃん。単に失言癖が酷いだけだろう。 .もっとも、そんなナーバスなことを何もこんな選挙前の大変な時期に言わんでもいいだろうとは思うし、そういう脇の甘い人を大臣に据えておくべきかどうかという点で、辞めるのもしょうがなかろうとは思うが。一方で、こんなしょうもないネタで騒がないで欲しい、というのが正直なところ。参院選において、もっと大切な争点はいっぱいあるだろうに。 |
.前に書いた XFree86 のライセンスネタ。良く見たら xc/lib の下にも XFree86 ライセンス 1.1 が使われてた。だめじゃん。 .まあ NetBSD のように OS の主要コンポーネントの一部として配布している版とのリンクに関しては問題がないような気もするけれども。 .Debian GNU/Solarisという選択肢 - なんで Linus は毎度毎度厨房臭いんだろう。ちなみに 6/12 の Linus の投稿。 .NAV2007 が Windows2000 を切ったので失望しました。 |
. . . . .以下未読。 |
.wakeup-before-sleep condition - 単純に「sleep するまえに wakeup されると困っちゃう状態」だと思います。wakeup(9) は割り込みハンドラから呼ばれることがあるので(newlock2 以降は無視)、sleep する前に割り込みが入って、そこで wakeup(9) が呼ばれてしまうと永遠に起きなくなってしまいます。これを避けるためには、「割り込みが発生した後には sleep しないようにする」か「確実に sleep してから割り込みが発生するようにする」必要があります。 .ところで、誰か、「割り込みレベル上げた状態で sleep するとどうなるか」ということについてちゃんと解説したドキュメントって見たことありますかね。 .悪魔本にはこんな風に書いてある: 1. Prevent interrupts that might cause process-state transitions by raising the hardware-processor priority level to splhigh.まあなんか雲を掴むような書き方ですな。実際にデバドラ書きたい場合にはもっと単刀直入な情報が欲しいのに、どうもそういうことは manpage にも書いてない。 .wakeup-before-sleep でぐぐると、こんなのがでてくる。manpage に本当に必要なのは、こういう情報なんじゃないのかねぇ。まあ newlock2 以降は tsleep/wakeup ってのは obsoleted なので、今更追加しても遅きに逸した感が。 |
. . . |
.あくまでも伝統的な 4.4BSD カーネルの話。つまり、LWP導入前でユニプロセッサでカーネルプリエンプションが発生しないカーネル。 .tsleep() するときに spl を上げているとどうなるのか。悪魔本読んでも今一つ腑に落ちなかったが、ソースを見ると一発でわかる。あの本は、ソースを読むための副読本なので、本だけ読んでてもよく分からないのである。 .(伝統的な) tsleep() は、今回関係ないところを完全に端折るとこう書いてある: s = splhigh(); mi_switch(); splx(s);これで九割方言い尽くしてるわけです。 .とりあえず話を簡単にするために、全くプリエンプションされないとすると、アクティブな唯一のプロセス以外は全員自発的に tsleep() して寝てることになる。このとき、ほとんどのプロセスは spl が低い状態で tsleep() に突入しているから、そういうプロセスを起こしてやると mi_switch() の直後の splx() で spl が低い状態になる。 .あるいは spl を上げた状態で tsleep() に突入しているプロセスがあったとしても、tsleep() から戻った時点ですぐに spl を下げるのがマナーなので、tsleep() から復帰した直後に spl が下げられることが期待できる。 .つまり、マナー良く実装されたカーネルでは「spl を上げた状態で (t)sleep すると、別プロセスにスイッチしている間 spl は下がり、自プロセスに復帰すると元のレベルに上がる」と定式化できる。あるいは、擬似的に「spl はプロセスごとに固有の設定値を持つ」と考えても、99%のケースで(つまりカーネルの深淵を覗かない限り)正しい。 .ここで一つ大きな疑問が。起きられるプロセスが一つも居なかったらどうなるの? .それは置いておいて、ここから導けるノウハウは次のようになる:
.にしてもなあ、「tsleep の中」という 1% のために、「spl はプロセスごとに固有の設定値を持つ」と言いきれないもどかしさ。「tsleep の中」と「tsleep の外」は、プログラマにとっては大きな違いがあるんだが、モノリシックカーネルではそこには明確なレイヤ分けが無い。 .モノリシックな UNIX カーネルを新しく書くならば、tsleep の中と外は明確に別のモジュールにするべきかもしれない。というか、とりあえず今の NetBSD は sys/kern の下にいろんな物がありすぎだ。 .さて、起きられるプロセスが一つも居なかったらどうなるか。ちゃんと悪魔本に書いてある: If whichqs is zero, there are no processes to run, so unblock interrupts and loop; this loop is the idle loop.やっぱりこの本は名著だと思う。「今日中にデバドラを一つ書かないといけない」みたいなケースでは全く役に立たないが。 .「モノリシックな UNIX カーネルを新しく書くならば」という話をするならば、そもそも sleep/wakeup というインターフェースをやめた方が良い気がする。wakeup-before-sleep なんて問題が起こるのは(あるいは、それを各デバドラでケアしてやらなければならんのは)、どう考えてもインターフェースが悪い。かわりに pthread の状態変数みたいなもんを実装するのが正しい。 .第1回:オープンソースって無料で使えるの? - んで、結局のところ、オープンソースって無料で使えるの? |