[前][次][番号順一覧][スレッド一覧][生データ]

yarv-dev:643

From: SASADA Koichi <ko1 atdot.net>
Date: Mon, 03 Oct 2005 09:33:54 +0900
Subject: [yarv-dev:643] Re: thread support

 ささだです。

shudo computer.org wrote:
> C で書かれたユーザコードが thread safety を意識していない場合でも
> まずいことが起きないようにする、
> っていうことですよね。
> 
> そこまでやってくれる言語処理系って、あるんでしょうか。
> 
> ささださんがそこまで保証したいと考える理由は、
> C で書かれた既存ライブラリの継承 (だけ?) ですよね。
> 
> 
>> LOCK(str);
>>  sprintf(buff, "%s\n", RSTRING(str)->ptr);
>> UNLOCK(str);
>>
>> としなければならず、煩雑で、修正箇所はとても大きい。
> 
> 
> ささださん (+ 有志?) が既存ライブラリを書き換えるのはしんどい、
> ということですよね。
> mode 3 の世界では、ライブラリ開発者自身が
> thread safety を意識した開発を行う、というのが
> 今現在の世界の常識ですよね。
> 
> なら、例えばこうして↓ mode 3 の世界を目指すという手もあるかと思います。
> 
>   - mode 3 の世界でうまく働くような
>     ネイティブコードインタフェースを新たに定義する。
>     Java の JNI のような。
> 
>   - mode 3 対応 Ruby 処理系であっても
>     旧インタフェースに沿ったネイティブコードは実行できるようにする。
>     その際は、仕方ないので、他スレッドを止めるなり何なりする。

 私の目論見は前者だけを提供して、今の Ruby のインタプリタをスレッドセー
フに全部書き換えなきゃいかんなぁ、と思ってました。後者をサポートするつも
りは全然ありませんでした。

 ただ、首藤さんや [yarv-dev:633] Re: thread support でまつもとさんが
仰っているように、段階的に許していく、逆に言うと「スレッドセーフであるこ
とを宣言する API を新設」することで今回は開発していこうかと思っていま
す。そして、スレッドセーフであることを確認した処理から順次それを利用して
いく、と。もちろん、細粒度ロックの機構も用意しないといけませんが、まぁ難
しいことは考えない(ロックの軽量化云々、ロック除去の最適化云々)ことにし
て、とにかく動くものを作ろうと思います。

> 
> おまけ:
> 
>   どうも "giant lock" っていう語が、この場合、しっくり来ませんでした。
>   Linux だとか FreeBSD で "giant lock" と言われてきたものは、
>   さすがに、preemptive なスレッドスケジューリングを許さない、というほど
>   制限の厳しいものではなく、
>   カーネルに入れる / カーネル内の処理ができるスレッドは 1つだけ、
>   というものでした。
>   この場合の "giant lock" は普段の処理では別に獲得する必要はなくて、
>   ある種の処理 (システムコール) をする際にだけ獲得すればよい、と。
> 
>   今回の話の mode 2 というのは、POSIX Threads を使いながらも、
>   その機能がどうあれ、
>     - (Ruby プログラムの) 並列 (!= 並行) 実行を許さない。
>     - VM はスレッドスケジューリングを cooperative に行う。
>   という現 Ruby 実装 (mode 1) と同様の制約を付ける、ということで
>   …短くシンプルに表現するうまい言葉が見つかりません。

 Python の人がジャイアントインタープリタロック、という言葉を使っていた
気がするので、そのまま使ってるんですが、何か適切な言葉がないと面倒ですね
え。それとも、ジャイアントロックじゃなくてジャイアントインタープリタロッ
クと言っておけば十分なのかしら。この場合はインタプリタが VM を複数持っ
て、VM の中でロックしあうのでジャイアントVMロック、というふうにコード中
は使ってますが。

>> まとめ、比較をしてみます。m1, m2, m3 をそれぞれ mode 1, 2, 3 とよんで
>>ください。
> 
> 
>>・シングルプロセッサでの性能
>>
>> m2 > m1 > m3
>>
>> ネイティブスレッドに任せたほうがスレッドスイッチ、スレッド管理、スレッ
>>ド生成 I/O 管理などの効率はよいことが期待出来ます。
> 
> 
> 使う POSIX Threads 実装がカーネルレベルのスレッドだった場合、
> 一般的には、m1 より m2 の方が重くなるんじゃないでしょうか。

 Ruby のユーザレベルスレッドのスイッチはスタックのコピーを伴いますので
重いかなー、と思ってました。I/O 管理はブロック回避のためにいろいろやって
ますし。


>>・生成するスレッドの数の制限
>>
>> m1 > m2 = m3
>>
>> 1 ネイティブスレッド = 1 Ruby のスレッドだと、ネイティブスレッドの生成
>>上限(たとえば、cygwin では 700 個強でした)に制限されます。
> 
> 
> 最近、Java 5.0 / Linux 2.6 (on VMware & Win XP) で
> 6,000 くらいのスレッドを作りました。
> (同時に runnable だったスレッドは、多分、数百程度だったとは思います。)

 今 Linux atdot.net 2.4.27-2-686 でやったら 1327 個でした。2.4 系は弱い
なぁ。


>> エンタープライズ用途(CPU を 8 つとか積んでるマシンで 1 つの Ruby プロ
>>セスをぶん回す、など)では m3 がよさそうですが、そもそも Ruby でそういう
>>リクエストはあるのか。それだったら複数プロセッサで dRuby で通信、などの
>>ほうがよさそうに思える。mod_ruby はどうなんだろう。そもそも、エンタープ
>>ライズ分野では SMP 構成よりはクラスタ構成のほうが主流な気がするが、どう
>>なんだろう。
> 
> 
> 数年後は、普通のデスクトップ PC にも 4とか 8のプロセッサコアが
> 載ってると思います。
> もちろん、単一 Ruby VM は 1コアだけ使えれば充分、
> という判断もありだと思います。

 そうですよねぇ。私は並列を生かす仕事をしないといけないんですよねぇ。

-- 
// SASADA Koichi at atdot dot net
//


--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]

       628 2005-09-30 20:11 [ko1 atdot.net       ] thread support                          
       631 2005-09-30 22:10 ┣[ko1 atdot.net       ]                                       
       633 2005-09-30 23:35 ┃┣[matz ruby-lang.org  ]                                     
       635 2005-10-01 23:41 ┃┃┗[ko1 atdot.net       ]                                   
       636 2005-10-02 10:58 ┃┃ ┗[shiro lava.net      ]                                 
       638 2005-10-02 18:15 ┃┃  ┗[ko1 atdot.net       ]                               
       640 2005-10-02 19:05 ┃┃   ┗[shiro lava.net      ]                             
       641 2005-10-02 21:23 ┃┗[shudo computer.org  ]                                     
->     643 2005-10-03 09:33 ┃ ┗[ko1 atdot.net       ]                                   
       632 2005-09-30 23:28 ┗[matz ruby-lang.org  ]                                       
       634 2005-10-01 23:30  ┗[ko1 atdot.net       ]