プロセスの内容に応じてスタックサイズを使い分ける
日付 | 2009/07/10 |
---|---|
ID | 75806 (英語原文参照) |
バージョン | 11 |
プラットフォーム | Mac & Win |
New Processで新しいプロセスを起動するとき、アプリケーション全体に亘っていつも同じスタックサイズを使用するのは、あまり賢明ではないかもしれません。むしろ、そのプロセスの目的を考慮して適切なサイズを宣言するべきでしょう。
プロセスのスタックメモリに「積み上げられる」のは、連鎖的にコールされたメソッド、ローカル変数、サブルーチンのパラメータ、レコードスタックです。値の単位はバイトで、少なくとも64K(約64,000バイト)、あるいは多数のメソッドを連鎖的にコールするような場合など、必要に応じてもっと大きなサイズを渡すことができます。
ごく限られた数のローカル変数だけを使用し、他のメソッドをコールせず、PUSH RECORDやPOP RECORDを実行しないメソッドは、それほど大きなスタックを必要としません。多数のローカル変数、配列、メソッドコールを実行するプロセスはより大きなスタックが必要です。
たとえば、スタックサイズを返す次のようなメソッドを作成すると良いかもしれません。
`Sample Method: SHELL_StackSize `Parameters: `(Optional) TEXT: the task size; tiny, small, medium, or large `Return Value: `Longint: the stack size C_LONGINT($0;$StackSize_L) C_TEXT($Option_T;$1) C_LONGINT($Ndx) $Option_T:="" $Ndx:=Count parameters If ($Ndx>0) $Option_T:=$1 end if Case of : ($Option_T="tiny") $StackSize_L:=1024*32 : (($Option_T="") | ($Option_T="small") | ($Option_T="default")) $StackSize_L:=1024*64 : ($Option_T="medium") $StackSize_L:=1024*128 : ($Option_T="large") $StackSize_L:=1024*256 Else $StackSize_L:=1024*64 End case $0:=$StackSize_L
このようなメソッドを用意しておけば、プロセスの目的に応じて段階的にスタックサイズを調整できるからです。
C_TEXT($MethodName_T) $MethodName_T:=Current method name C_POINTER($TableName_aP;$1) C_LONGINT($Ndx;$procState_L;$procTime_L) C_TEXT($procName_T) $Ndx:=Count parameters If ($Ndx=1) $TableName_aP:=$1 End if PROCESS PROPERTIES(Current process;$procName_T;$procState_L;$procTime_L) If ($procName_T#$MethodName_T) If ($Ndx=1) $Ndx:=New Process($MethodName_T;SHELL_StackSize;$MethodName_T;$TableName_aP) Else $Ndx:=New Process($MethodName_T;SHELL_StackSize("tiny");$MethodName_T) End if Else `Do some work in a new process End if