新城@筑波大学情報です。こんにちは。

In article <3989128news.pl@insigna.ie.u-ryukyu.ac.jp>
        kono@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 河野真治 @ 琉球大学情報工学です。
> なぜかBSD Conference に顔だしてます。
> SRAの曽田さんのThreadの話が面白かった。select って普通のファイル
> 書き出しのwriteは常に1を返すのね。

ほんと、面白かったですね。1:30 からの仮想計算機の話も面白かっ
たですよ。詳しくは、このあたり。SPA のものは日本語です。

http://www.usenix.org/events/bsdcon03/tech/eiraku.html
http://spa.jssst.or.jp/2003/program/
http://spa.jssst.or.jp/2003/program/papers/03018.pdf

あと、iconv の話もありました。nkf のように自動判定したらと突っ
込んだら、POSIX の API にないから作らないんだって。既存の枠
の中に捕らわれないで、より高い所を目指して欲しいですね。

スレッドの話にもどします。Solaris 9 で、スレッドのモデルが1
対1に変ったんですね。

NetBSD では、Scheduler Activations をまじめに作ろうとしてい
るんですね。Scheduler Activations は、なかなか面白いアイディ
アで、1991年当時、スレッドの研究をしていたわけですが、あの論
文を見た時には、正直な所、やられたという感じはしました[1][2]。
モデルとしてはとてもきれいなで。その後の評価としては、「きれ
いだけど、重たいね」という話にはなっていました。

Solaris 2のスレッドも、教科書には、Scheduler Activations の
アイディアをちょっと変更して使っていることにはなっていたと思
います。ユーザレベルのスレッドがシステムコールをかけまくって
ブロックした時に、新たにカーネルレベルのスレッドを動的に生成
するあたりかなあ。

NetBSD で Scheduler Activations を入れるという話を聞いた時に
は、CPU も速くなったから、そういう遊びも許される時代になった
んだなあと思いました。どこが重いかというと、横取りのあたり。

Scheduler Activations は、実行中のプロセスからCPU を横取りし
て他のプロセスに切替える時に、黄色信号ということで、警告を出
すんです。シグナルみたいに。その時に、普通はユーザ・レベル・
スレッドをスリープさせて、他のカーネル・レベルスレッドでも、
今スリープしたユーザレベル・スレッドを実行できる状態にしてか
ら、自発的にCPU を離します。(黄色でも離さない時には、有無を
言わさず奪い取ります。)

スレッドの実装は、難しいという意味では、ユーザ・レベルで、カー
ネル・レベルで「割り込み禁止」ができない状態で、いろいろやる
ところかなあ。その辺りの実装は、私はちょっと想像できません。

私のスレッドの実装では、横取り対策では、横取りする時には黄色
信号なしで横取りしてました。他のスレッドがスピンして、しばら
くスピンしても解放されないようだと、どうも横取りされたみたい
だと判断して、いったんカーネルに飛込むということにしてました。
これは、Scheduler Activations のようなエレガントさはないけれ
ど、実装も簡単だし、この辺りは普通かなあと思っていました。私
の方法の1つの売りは、スレッドのプログラムを決定性にできると
いう所です。カーネルレベルのスレッド(仮想プロセッサと言って
いた)を1個だけ割り当てて実行するだけなんだけどね。

スレッドの実装で、あと難しいというか、めんどくさいのは、Libc 
をスレッドセーフにする所です。なにしろ量が多いので。GNU libc
2 を見ても、苦労の後がライブラリ全体にばらまかれているといっ
た感じです。LinuxThreads は捨てられて、その後、何度か変った
んですね。

カーネルの中の並列性をあげるには、ジャイアントロックをやめて
ロックの粒度を小さくするわけですが、NetBSD は、この辺りまだ
途中なんですかね。Scheduler Activations は、API としては動い
ているみたいだけど、SMP ではまだ動いていないという話みたいだし。

FreeBSD のカーネルは、この間、アメリカの BSDCon で話を聞いた
印象としては、「頑張っているけれど、危ないなあ」という感じで
した。細かいロックのルールを、変数のフィールドごとに書いてあ
ります。順番なんか、a, b, c とアルファベットをふって。

SMP で速くするには、ロックの粒度を減らすのもそうなんだけど、
ロックをしないで済ませられるところを増やす(プロセッサごとの
変数を多用する)というのもあります[2]。

> 非同期アプリケーションの書き方っていろいろあるわけど、
>    プロセスで、通信とselectでごりごり
>    Thread で、lock とThreadの実装と格闘
>    非同期I/O (SIGIO?!)で頑張る?
> まぁ、アイデアとしては出尽くしてしまったわけだけど、
> 実際の実装を見るとなんか進んでないって感じですね...

NetBSD の Scheduler Activations が速いのは、実装を頑張ってい
るからだと思います。一般的には、Scheduler Activations のよう
な動的な方法は遅いです。たとえば、最初から5個なら5個作って
増減させないような方法なら、その方がもっと速いはずです。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\

[1]     新城, 清木: "並列プログラムを対象とした軽量プロセスの実現方式",
情報処理学会論文誌, Vol.33, No.1, pp.64-73 (1992).
http://www.ipsj.or.jp/members/Journal/Jpn/3301/article008.html

[2]     新城, 清木: "仮想プロセッサを提供するオペレーティング・システ
ム・カーネルの構成法", 情報処理学会論文誌, Vol.34, No.3, pp.478-488
(1993).
http://www.ipsj.or.jp/members/Journal/Jpn/3403/article013.html

[3]     Y.Shinjo and Y.Kiyoki: "A lightweight process facility
supporting meta-level programming", Parallel Computing, Vol.22, No.11,
pp.1429-1454 (1997).