Tips

プロセスの内容に応じてスタックサイズを使い分ける

日付2009/07/10
ID75806 (英語原文参照)
バージョン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