某日記

(前期)

平成19年7月2日(月曜日)

6/29

旧士幌線跡めぐり。

6/30

札幌に戻ってトセイ。

査収物:

春行きバス(4) / 宇佐美 真紀

美味しんぼ(99) / 雁屋 哲,花咲 アキラ

7/1

帰ってきた。

査収物:

ないしょのつぼみ(3) / やぶうち 優

エンブリオ(1) / 鳴瀬 アツシ

おもいで―二宮ひかる短編集 / 二宮 ひかる

ひろなex.(1) / すか

五日性滅亡シンドローム(1) / ヤス

今日

なんだよこの現象。どうもいろんなコミックが洋書扱いになってる模様。

上のリストでは、「ひろなex.」がちゃんと和書なのに、同じレーベルの「五日性滅亡シンドローム」は洋書とか意味不明。

日刊メルッ太くん - つまりメルトダウン四コマ。

ナンシーより緊急連絡。部屋の中で遭難しました。

夜を徹した作業により脱出路を確保、なんとか復旧。

平成19年7月3日(火曜日)

今日

ゆりしーキター - というか、何この露骨な選挙対策。

やっぱり単純に、負け戦はするな、ということです。うん。あくまでも一般論として、過去にあったことをあったこととして「しょうがない」と割り切るのも必要なことだ。それは、未来に同じことを繰り返すべきではないということとは全く矛盾しない。だいたい、久間大臣だって長崎の人なんだから、原爆肯定の意図なんて含んでるわけないじゃん。単に失言癖が酷いだけだろう。

もっとも、そんなナーバスなことを何もこんな選挙前の大変な時期に言わんでもいいだろうとは思うし、そういう脇の甘い人を大臣に据えておくべきかどうかという点で、辞めるのもしょうがなかろうとは思うが。一方で、こんなしょうもないネタで騒がないで欲しい、というのが正直なところ。参院選において、もっと大切な争点はいっぱいあるだろうに。

平成19年7月4日(水曜日)

今日

前に書いた XFree86 のライセンスネタ。良く見たら xc/lib の下にも XFree86 ライセンス 1.1 が使われてた。だめじゃん。

まあ NetBSD のように OS の主要コンポーネントの一部として配布している版とのリンクに関しては問題がないような気もするけれども。

Debian GNU/Solarisという選択肢 - なんで Linus は毎度毎度厨房臭いんだろう。ちなみに 6/12 の Linus の投稿

NAV2007 が Windows2000 を切ったので失望しました。

平成19年7月5日(木曜日)

昨日の査収物

かるた(2) / 竹下 けんじろう - どういう終り方だ。

P2!(3) / 江尻 立真 - 乙女さん不法侵入の巻。

椿ナイトクラブ(6) / 哲弘 - IMR 大活躍の巻。

サナギさん(4) / 施川 ユウキ - 半分読んだ。

以下未読。

エム×ゼロ(4) / 叶 恭弘

めっちゃキャン(4) / 九十九 森, 国広 あづさ

キスよりも早く(1) / 田中 メカ

今日の査収物

小川とゆかいな斎藤たち(2) / 茶匡

そらのカナタの!(1) / おのなんとかさん

白雪ぱにみくす!(1) / 桐原いづみ

どきどき魔女神判!

今日

今日のウィキペ: JR北海道ナハ29000形客車 -

なお、形式番号の29000はバーベキューの主材料である肉にかけた語呂合わせである

京都所の583系等 - 2 編成廃車。

mremap(2) ねえ。というか、ユーザランドから仮想メモリを操作するシステムコールって、もうちょっと整理して欲しいよねん。もっと粒度の細かいシステムコールを用意して、mmap とかはシステムコールじゃなくてライブラリ関数として実装するとか。

平成19年7月6日(金曜日)

wakeup before sleep

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.
...
5. Call mi_switch() to request that a new process be scheduled; the hardware priority level is implicitly reset as part of switching to the other process.
(pp.89, The Design and Implementation of the 4.4BSD)
まあなんか雲を掴むような書き方ですな。実際にデバドラ書きたい場合にはもっと単刀直入な情報が欲しいのに、どうもそういうことは manpage にも書いてない。

wakeup-before-sleep でぐぐると、こんなのがでてくる。manpage に本当に必要なのは、こういう情報なんじゃないのかねぇ。まあ newlock2 以降は tsleep/wakeup ってのは obsoleted なので、今更追加しても遅きに逸した感が。

平成19年7月8日(日曜日)

昨日

すっかりJNUG総会/BoFのことを忘れていたナリよ。

ドトールで原稿書き。

今日

秋葉。

夜中。原稿書き。

査収物

「ひとひら」オリジナルドラマ&BGMアルバムVol.1(麦編)

「ひとひら」オリジナルドラマ&BGMアルバムvol.2(野乃編) - 1と2で曲数が同じなのに、外から見えるところには「BGM17曲」としか書いてなくて、あざといのか何なのか判断できん。ちなみに、OPとEDを除いて重複してない。

味楽る!ミミカ ナンバーワン / おみむらまゆこ,Goma,小杉保夫,HARCO - 遂に手に入れた。

ひだまりスケッチ ラジオCD+挿入歌集

平成19年7月9日(月曜日)

昨日

原稿上がってから MoE やったりとか。

spl and sleep

あくまでも伝統的な 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%のケースで(つまりカーネルの深淵を覗かない限り)正しい。

ここで一つ大きな疑問が。起きられるプロセスが一つも居なかったらどうなるの?

それは置いておいて、ここから導けるノウハウは次のようになる:

  • spl を上げて (t)sleep しても良い。
  • spl を上げて (t)sleep すると、別プロセスにスイッチしたところで spl が下がると期待できる。これは wakeup-before-sleep 問題の回避に利用できて便利でもあるし、逆に注意が必要な部分でもある。
  • 逆に、spl を上げたら、自ら (t)sleep しない限りは勝手に spl が下がることは無い。
ただし、繰り返すけれども、カーネル内でプリエンプションしないユニプロセッサシステムでのみ有効。

にしてもなあ、「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.
(pp.97, The Design and Implementation of the 4.4BSD)
やっぱりこの本は名著だと思う。「今日中にデバドラを一つ書かないといけない」みたいなケースでは全く役に立たないが。

「モノリシックな UNIX カーネルを新しく書くならば」という話をするならば、そもそも sleep/wakeup というインターフェースをやめた方が良い気がする。wakeup-before-sleep なんて問題が起こるのは(あるいは、それを各デバドラでケアしてやらなければならんのは)、どう考えてもインターフェースが悪い。かわりに pthread の状態変数みたいなもんを実装するのが正しい。

第1回:オープンソースって無料で使えるの? - んで、結局のところ、オープンソースって無料で使えるの?