9/24 (月)
宮島へ
せっかく広島に来たのだからということで、新郎の友人4人で宮島に行ってきました。
お昼は焼きがきのはやしという店で食べます。
その他、宮島の見どころを。
今日発見したエラーメッセージダイアログ
リーガロイヤルホテル1階のプラズマディスプレイの情報掲示板。
天気予報を表示しているディスプレイは、Windows の Web ブラウザで画面を表示しているだけなのね。
新幹線のぽっちりの謎が解決
前(2004年8月21日、 2004年8月29日)から気になっていた新幹線の座席にあるゴム製のポッチリの謎が解決。 新幹線の座席を回す時に手で持つノブだそうだ。 座席の横につけるとはみ出して通路を通る邪魔になるためらしい。
新幹線の運転免許を持っている大場氏が言うのだから間違いない。
9/23 (日)
広島散策
広島の二日目。
挙式&披露宴は午後からなので、午前中は近場を散策してみる。
9/22 (土)
広島へ
友人の結婚式に参加するために今から広島へ行きまする。
一足しかない革靴は穴が空いているので、途中で靴を買わないと駄目だ…
[Food] お好み村@広島
大場氏と新横浜で待ち合わせてして新幹線で広島へ。 19時頃に式場のリーガロイヤルホテルに到着。 今日から二泊三日する。
とりあえず初日はお好み焼きを食べようということで、お好み村に行ってみる。 お好み村は雑居ビルの3階分に複数の広島風お好み焼き屋が寄り集まった屋台村だ。 隣には同コンセプトの「お好み共和国ひろしま村」というのもあった。
2階にある たけのこという店で食べる。 写真は私が食べたイカ天とチーズ入り。 かなり大玉だけど、焼き加減もきっちりしてウマ〜。
エレベータにはこんな張り紙が…
9/10 (月)
[Linux][Prog] System V IPC semaphore と POSIX semaphore の違い
最近の UNIX にはセマフォをプログラムするのに、System V あるいは XSI (X/Open System Interfaces Extension) の IPC セマフォと、POSIX のセマフォの 2 つの形式がある。
System V IPC セマフォの場合は semctl()
、semget()
、semop()
、semtimedop()
の関数を使うことになる。
POSIX セマフォの場合は、sem_init()
、sem_awit()
、sem_trywait()
、sem_post()
、sem_getvalu()
、sem_destroy()
を使うことになる。
2種類のセマフォには当然インターフェイスの違いが存在するのだが、OS によってはその挙動が異なるようだ。
Linux カーネル 2.6 系ではこの2種類のセマフォが別々のシステムコールとして処理されている。
System V IPC セマフォは ipc(2)
で処理されるが、POSIX セマフォは futex(2)
を使う実装になっている点だ。
内部実装の違いによって、二種類のセマフォにロック獲得の fairness に差がでることがあるようだ。
ロックの fairness は 2004年4月13日 の日記にちょっと書いた。
下のように2つのスレッドがセマフォを獲り合ってロックし合うテストプログラムをコンパイルして試験する。
- ipc_semaphore_test.c ... System V IPC セマフォ
- posix_semaphore_test.c ... POSIX セマフォ
- pthread_mutex_test.c ... おまけで pthread mutex
シングル CPU 環境ではそのまま、マルチ CPU 環境では CPU アフィニティをとってどれか 1-CPU だけにバインドして実行する。 CPU アフィニティをとるには taskset コマンドを使うのが簡単。
$ taskset 1 ipc_semaphore_test
結果、System V IPCセマフォは調査した全ての環境で "Thread-ID: 0" と "Thread-ID: 1" が繰り返され、2つのスレッドの間でセマフォが交互に渡っていることが確認できた。 これは fair なロックマナーだといえる。
一方、POSIX セマフォは環境によっては "Thread-ID: 0" だけまたは "Thread-ID: 1" がバースト的に繰り返され、ある程度表示されると二つのスレッドが入れ替わるという挙動をする。 これは unfair なロックマナーだといえる。 しかし、同じプログラムを近縁の別の Linux 環境に持っていくと fair な動作をすることもある。
身の回りの環境を調べた表は以下の通り。
ディストリ | カーネル | glibc | CPU | SMP? | 結果 |
---|---|---|---|---|---|
RHEL4 U4 | 2.6.9 (SMP) | 2.3.4 | Intel Xeon MP 2.8GHz | Multi, HT | unfair |
RHEL4 U4 | 2.6.9 (SMP) | 2.3.4 | Intel Xeon64 3.4GHz | Multi | unfair |
RHEL4 U4 | 2.6.9 (SMP) | 2.3.4 | Intel Itanium2-9000 1.4GHz | Multi, HT | unfair |
RHEL4 U4 | 2.6.22 (SMP) | 2.3.4 | Intel Itanium2-9000 1.4GHz | Multi, HT | unfair |
VineLinux 4.1 | 2.6.16 (SMP) | 2.3.4 | AMD Duron 800MHz | Single | fair |
シングルCPUマシンとマルチCPUマシンの違いかしら?
9/3 (月)
玄人志向 GbE-PCI2
Linux カーネルが 2.6 になってから NIC カードが一枚動かなくなったので(8/31)、会社帰りにビックカメラに寄って玄人志向 の GbE-PCI2 を買って帰る。 お値段は 1,050円なり。 チップは VIA VT6122。
最初はこのカード1枚を挿して IP aliasing で 2 つの IP アドレスをつけていたのだが、連続運転をしていると以下のようなカーネルメッセージが出てネットワークが不通になってしまう。
eth0: excessive work at interrupt.
Google で検索すると、同種の症状が出ている人が多い。 VIAのページからは Linux のドライバーがダウンロードできるようだが、この velocityget.tgz (version 1.23) はなぜかコンパイル中にエラーが出る。 何か呪われているのか?
make -C /usr/src/kernels/2.6.16-0vl68-i686 SUBDIRS=/home/nminoru/tmp/1.23 modules make[1]: Entering directory `/usr/src/kernels/2.6.16-0vl68-i686' CC [M] /home/nminoru/tmp/1.23/velocity_main.o /home/nminoru/tmp/1.23/velocity_main.c: In function `velocity_notify_reboot': /home/nminoru/tmp/1.23/velocity_main.c:1960: error: incompatible type for argument 2 of `velocity_suspend' /home/nminoru/tmp/1.23/velocity_main.c: In function `velocity_suspend': /home/nminoru/tmp/1.23/velocity_main.c:2004: error: incompatible type for argument 2 of `pci_set_power_state' make[2]: *** [/home/nminoru/tmp/1.23/velocity_main.o] Error 1 make[1]: *** [_module_/home/nminoru/tmp/1.23] Error 2 make[1]: Leaving directory `/usr/src/kernels/2.6.16-0vl68-i686' make: *** [default] Error 2
9/1 (土)
[MyPC] さらに復旧作業は続く
昨日の復旧作業で基本的な部分は回復したが、新環境(Vine Linux 4.1) では mh-6.8.4-JP-3.05 と bjorb のコンパイルができない。 これを片付ける。
mh-6.8.4-JP-3.05 は、古い形の可変引数処理(varargs.h)が使われている箇所と、errno を int 型の外部変数として直接参照している箇所を直してゆく。 2時間ぐらいの作業でなんとかコンパイルが通るところまで到達。
bjorb の方はこの際別のツールに乗り換えようと、zebedee を試してみるが SOCKS5 の上に載せることができないので断念。
気合をいれて bjorb も Makefile の $(CC)
を g++ に変えるとあっさりコンパイルできた。
もう少し余裕ができたら、修正点をまとめてパッチにします。