From: matz@... (Yukihiro Matsumoto) Date: 1998-06-10T16:16:38+09:00 Subject: [ruby-dev:2838] Re: [BUG] IO#eof? when Thread using まつもと ゆきひろです In message "[ruby-dev:2837] Re: [BUG] IO#eof? when Thread using" on 98/06/10, Takashi Nakai writes: |こんにちは、中井です。 | |#いつも関心するのですが、返答メールがすばやいですね。 |#(答えをあらかじめ用意しているとしか思えない、実は |# ruby で書いた eriza が対応していたりして...) 違います.私は未来が見えるんです. # 大嘘.本当だったら良かったんだがなあ.^^;;; |ユーザーレベルスレッドについて勘違いしていたのかもしれないのです |がOSコール自体がブロックしてしまった場合はどうしようもないので |はないのですか? rubyではブロックしそうなシステムコールの前にブロックするかど うかのチェックをいれてます.で,ブロックしないことが保証され てる時だけシステムコールを呼んでます.時々チェックを忘れてて 思わずブロックしちゃうこともありますが([ruby-dev:2810]みたい にね). |最近[ruby-list]のほうで話題になっていた Squeak のVMの(ユーザー |レベル?)のマルチスレッドの実現方法はバイトコードを1つ実行する |度にスレッド切り替えのチェックをしていたと記憶しています。 Rubyの場合にはsetitimer(2)によるタイマー割込みが使える場合に はそれを使って割込みかけてます(0.1秒単位).で,割込みハンド ラでフラグを立てて安全なところで実際のコンテキスト切替えを行っ ています.setitimer(2)が使えない場合は,インタプリタのループ を回る度にカウンタを増やしていき,ある一定の値になった時点で コンテキスト切替えを行ってます. このような消極的な方法でコンテキストを切替えていますから, rubyスクリプトのレベルではプリエンプティブですが,Cのレベル では簡単にブロックできちゃいます. |(それなので Socket 関数などの時間のかかる(ブロックの可能性のあ | る)処理の実現はOSレベルのスレッドも利用していたと思います) なんか,複雑なことしてますね.Squeakのソースも読んでみるのも 面白いかも知れませんね.もっとも,OSレベルのスレッドはどこに でもあるというわけにはいかないという問題があるので,依存する わけにはいかないんですよね.たとえばDOSとか. まつもと ゆきひろ /:|)