From: SASADA Koichi Date: 2007-01-29T10:27:56+09:00 Subject: [ruby-dev:30202] Re: YARV の thread について  ささだです。 Hidetoshi NAGAI wrote: > Ruby/Tk の YARV 対応ですが,tcltklib.c における Tcl/Tk wrapper の > 根本の戦略からして作り直さねばならないようです. > > で,どのようにすべきか判断する上で,YARV での thread について > 少し確認と質問をさせていただきたいと思います.  質問をまとめてくださってありがとうございます。 > ----------------------------------------------------------------------- > * 現在の YARV は Thread model 2 であり,ある時点で稼働状態にある > thread は一つだけということですよね?  はい。 > * 上記が正しいとして,将来,Thread model 1 や 3 が作り込まれることは > どの程度想定しておけば良いでしょうか? > (「比較的近い将来に」とか,「当面は予定がない」とか...)  一応、model 3 については試作したものがあります。あとは外圧(やっぱり並 列に動かないとなぁ、とか)と皆のやる気(一人でやるにはちょっとつらい)や リソース(どっかの会社によって取り組むとか)によるかと思います。  model 1 は、これも外圧(ネイティブスレッドうぜーよ! という声)による かと思います。こっちは現在も出来ていることから、もしかしたら少しがんばれ ば対応できるかも、というところです。 > * 現在の YARV ではすべての thread が必ず一つの native thread に > 対応するということでよろしいでしょうか?  はい。 > * 組み込むライブラリ側で新たな native thread が作成された場合, > その native thread から Ruby を呼ぶことは可能ですか? > 不可能ではない場合,どのような処理を先に呼んでおく必要がありますか?  現状では不可能です。  あんまり対策は考えていないんですが、そういう API を用意することは可能 です。その際は、ちょっと面倒な制約が入るかもしれません。 > * ライブラリ側で作成された native thread が並列動作をしようとする場合, > 注意すべきことはどのようなことでしょうか? > (Thread オブジェクトとしての管理外なので,Ruby 側のリソースに > 触れない限りは問題なしだとか,窓口 thread を一つ用意して > それを経由するようにしなければならないとか, > これこれに注意しないとおかしなことになるとか...)  Ruby側リソースに触れない限りは大丈夫だと思います。たとえば、端的な例を 言うと、管轄外ネイティブスレッドのマシンスタックはGC対象ではありません。 窓口Rubyスレッドをひとつ用意するのが楽なのではないかなぁ、と思います。 > * Thread model 2 の場合,thread 切り替えのタイミングコントロールは, > これまでと同様,ある一定の処理 (YARV_CHECK_INTS()?) が呼ばれた際に > 切り替わるという考え方でよいのでしょうか?  そうです。 > その場合,ライブラリ側ではどの処理を呼べば良いのでしょうか? > yarvcore.h を include して YARV_CHECK_INTS() を呼ぶということに > なるのでしょうか?  ライブラリ側で「スレッド切り替えを発生させるには」何を呼べばいいか、で すかね。rb_thread_schedule() を呼ぶと、とりあえず切り替えてくれます。 が、ruby コードが走るタイミングで定期的に切り替え処理が走るので、あんま り必要はないかもしれません。ライブラリ側で長時間ブロックしてしまう際には 必要があるかもしれません。 > * 従来の thread は切り替えのコストがかなり大きかったわけですが, > YARV ではどの程度でしょうか? > 例えば,Tk の処理待ちイベントが存在しなければ常に即座に thread を > 切り替えても問題ないか,それとも切り替えが頻繁だと困るので > 少しの間イベント待ちを試みてから切り替えるようにすべきかなどです.  切り替えのコストは OS やシステムソフトウェアによります。つまり、ネイ ティブスレッド処理機構のスレッド切り替えの性能によります。経験的には、従 来のRubyのスレッド切り替えよりも随分と高速になっています。  とくに、従来のRuby処理系はスタックのコピーが発生するため、スタックの深 さに比例した切り替え時間が必要でしたが、YARVでは定数時間でスレッド切り替 えを行うことが期待できます。 > 「質問の仕方が悪くて意味がわからない」という場合はお尋ね下さい. > まとまりがなくて申し訳ありませんが,よろしくお願い致します.  いや、大変答えやすかったです。日本語だし ^^;  また何かあればご質問ください。 -- // SASADA Koichi at atdot dot net