Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第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::newVmError::VerifyErrorを返します。エラーは構築のとき、コードが1つも走る前に表面化します。サイズ不足のアリーナは実行時のハザードではありません。構築時の却下、検証器が出すその他の却下と同じ種類のものです。選んだ容量がモジュールの解析されたWCMUより小さい場合、Vm::newVmError::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つも走る前に。

次の章では事前にコンパイルされたバイトコードを読み込みます。