第35章. アリーナのサイズと境界の読み取り
この章の目的
この章を読み終える頃には、デフォルトに頼るのではなく、意図して選んだアリーナ容量を使えるようになります。この章を読み終える頃には、デフォルトに頼るのではなく、意図して選んだアリーナ容量を使えるようになります。
アリーナが保持するもの
アリーナはVMが借りる、一塊の連続したメモリのブロックです。一方の端からオペランドスタックが伸び、もう一方の端から動的文字列が伸びます。1回のStream-to-Reset反復で使われる合計は、第20章のワーストケースメモリ使用量、WCMU解析によって有界です。ホストは構築時にアリーナの容量を選びます。選択肢は3つあります。アリーナはVMが借りる、一塊の連続したメモリのブロックです。一方の端からオペランドスタックが伸び、もう一方の端から動的文字列が伸びます。1回のStream-to-Reset反復で使われる合計は、第20章のワーストケースメモリ使用量、WCMU解析によって有界です。ホストは構築時にアリーナの容量を選びます。選択肢は3つあります。
選択肢A: デフォルト容量
DEFAULT_ARENA_CAPACITYは64キロバイトで、ほとんどのスクリプトに十分です。DEFAULT_ARENA_CAPACITYは64キロバイトで、ほとんどのスクリプトに十分です。
#![allow(unused)]
fn main() {
let arena = Arena::with_capacity(DEFAULT_ARENA_CAPACITY);
}
ここから始めるのが正解です。計算された値や固定値に移るのは、何か理由があるときだけです。ここから始めるのが正解です。計算された値や固定値に移るのは、何か理由があるときだけです。
選択肢B: モジュールから容量を計算する
auto_arena_capacity_forは、モジュールを歩いて、そのWCMU境界が必要とする容量を返します。auto_arena_capacity_forは、モジュールを歩いて、そのWCMU境界が必要とする容量を返します。
#![allow(unused)]
fn main() {
let cap = keleusma::vm::auto_arena_capacity_for(&module, &[])?;
let arena = Arena::with_capacity(cap);
let vm = Vm::new(module, &arena)?;
}
2番目の引数はネイティブごとのヒープ計上のスライスです。スクリプトのネイティブがアリーナに割り当てない場合は空のスライスを渡し、割り当てる場合は計上値を渡します。この選択肢はアリーナをプログラムが必要とする厳密な量にサイズします、それ以上ではなく。2番目の引数はネイティブごとのヒープ計上のスライスです。スクリプトのネイティブがアリーナに割り当てない場合は空のスライスを渡し、割り当てる場合は計上値を渡します。この選択肢はアリーナをプログラムが必要とする厳密な量にサイズします、それ以上ではなく。
選択肢C: 静的バッファ
ヒープが無い組み込みターゲットでは、アリーナをホストが所有する静的メモリの中のバッファから動かせます。ヒープが無い組み込みターゲットでは、アリーナをホストが所有する静的メモリの中のバッファから動かせます。
#![allow(unused)]
fn main() {
static mut ARENA_BUFFER: [u8; 16 * 1024] = [0; 16 * 1024];
let arena = unsafe {
Arena::from_static_buffer(core::ptr::addr_of_mut!(ARENA_BUFFER))
};
}
これはno_stdデプロイメントのパターンで、アリーナはヒープ確保ではなく.bssの固定領域になります。これはno_stdデプロイメントのパターンで、アリーナはヒープ確保ではなく.bssの固定領域になります。
アリーナが小さすぎるとき
選んだ容量がモジュールの解析されたWCMUより小さい場合、Vm::newはVmError::VerifyErrorを返します。エラーは構築のとき、コードが1つも走る前に表面化します。サイズ不足のアリーナは実行時のハザードではありません。構築時の却下、検証器が出すその他の却下と同じ種類のものです。選んだ容量がモジュールの解析されたWCMUより小さい場合、Vm::newはVmError::VerifyErrorを返します。エラーは構築のとき、コードが1つも走る前に表面化します。サイズ不足のアリーナは実行時のハザードではありません。構築時の却下、検証器が出すその他の却下と同じ種類のものです。
これは第20章のメモリ予算をホスト側から見たものです。検証器はWCMU境界を証明し、ホストは少なくともそれだけの大きさのアリーナを提供しなければならず、両者が一致することの確認はVm::newで行われます。これは第20章のメモリ予算をホスト側から見たものです。検証器はWCMU境界を証明し、ホストは少なくともそれだけの大きさのアリーナを提供しなければならず、両者が一致することの確認はVm::newで行われます。
この章のまとめ
- アリーナは有界の作業メモリで、サイズはホストの選択です。
DEFAULT_ARENA_CAPACITYがデフォルト、auto_arena_capacity_forが厳密なサイズを計算、Arena::from_static_bufferが静的メモリから動かします。DEFAULT_ARENA_CAPACITYがデフォルト、auto_arena_capacity_forが厳密なサイズを計算、Arena::from_static_bufferが静的メモリから動かします。- モジュールのWCMUより小さいアリーナは
Vm::newで却下されます — コードが1つも走る前に。モジュールのWCMUより小さいアリーナはVm::newで却下されます — コードが1つも走る前に。
次の章では事前にコンパイルされたバイトコードを読み込みます。