K.Sasada's Home Page

こめんとのついか

こめんとこめんと!

message

please add long comment :).

_21(Fri)

Ruby VM アドベントカレンダーの 21 日目です.

スタックオーバーフローってありますよね.用意されたスタックを使い切ってしまうと出るエラーです.プログラムによって必要なスタックのサイズは違うものですが,Ruby 1.9 まではスタックのサイズを指定する方法がありませんでした.

そこで,Ruby 2.0 では次の 4 つの環境変数によって,スタックの深さを変えることが出来るようになりました.

それぞれスレッドとファイバ用の,VM のスタックとマシンスタックのサイズを指定できます.

ただし,これらの値はあくまでヒント情報になっています.小さい値を指定しても,一定の値未満のサイズを指定することはできませんし,適当な数でアラインされます.そもそも OS によっては,スレッドのマシンスタックサイズを変更することが出来ない場合もあります.

これらの値はインタプリタ起動時にのみ有効です.インタプリタを起動後に環境変数の値を変化させても,インタプリタは変更を無視します.

ちなみに,1.9 の時代よりもスタックサイズが大きくなっています.これは,スタックサイズが大きくてまずいプログラムはあんまり無いからだろう,という判断です.もし,32bit CPU を使っており,Fiber(や Thread)を大量に作成するようなプログラムの場合,この環境変数を利用してチューニングすることを検討してみて下さい.


これらの設定を実行中に知るために,新しい定数 RubyVM::DEFAULT_PARAMS をこっそり付け加えました.

puts RubyVM::DEFAULT_PARAMS
#=>
ruby 2.0.0dev (2012-12-21 trunk 38515) [i386-mswin32_100]
{:thread_vm_stack_size=>131072, :thread_machine_stack_size=>524288, :fiber_vm_stack_size=>65536, :fiber_machine_stack_size=>262144}

こんな感じで各値が格納されたハッシュオブジェクトが取れます.今後,何かしら値が追加されるかもしれません(されないかもしれません).なお,あくまで参考情報なので,この値を書き換えても,インタプリタの挙動には一切影響を与えません.

では,今日はこの辺で.


好きなだけ長いコメントをどうぞ。

お名前


back

tton 記述が使えます。YukiWikiな記述してりゃ問題ありません。

「行頭に#code」 と、「行頭に#end」 で挟むと、その間の行は pre で囲まれます。プログラムのソースを書くときに使ってください。

例:

#code

(なんかプログラム書く)

#end

リンクは

[[なまえ|http://www.example.org]]

とか

[[http://www.example.org]]

で貼れます。

$Date: 2003/04/28 10:27:51 $