英語版
このページの英語版を見る

std.experimental.allocator.building_blocks.ascending_page_allocator

struct AscendingPageAllocator;
AscendingPageAllocatorは高速で安全なアロケータであり、すべての割り当てをシステムのサイズの倍数に丸める。 システムのページサイズの倍数に丸める。仮想アドレスの範囲を予約する。 (Posixではmmap 、WindowsではVirtualAlloc )を予約し、連続した仮想アドレスにメモリを割り当てる。 アドレスにメモリーを割り当てる。
メモリのチャンクが要求されると、アロケータは要求されたサイズを 満たす仮想ページの範囲を見つける。 アロケータは、要求されたサイズを満たす仮想ページの範囲を見つけ、OSのプリミティブを使ってその保護を アロケータは、要求されたサイズを満たす仮想ページの範囲を見つけ、OSのプリミティブ(それぞれmprotectVirtualProtect )を使用して、それらの保護を読み取り/書き込みに変更する。 物理メモリは、ページがアクセスされたときにオンデマンドで割り当てられる。
割り当て解除は、ターゲット・ページから読み取り/書き込み権限を削除する。 そして、OSに通知し、仮想メモリーを保持したまま物理メモリーを取り戻す。 メモリを保持する。
アロケータはメモリーを再利用しないので、割り当て解除されたメモリーへのダングリング参照は常に決定論的にプロセスをクラッシュさせることになる。 へのダングリング参照は常に決定論的にプロセスをクラッシュさせることになる。
See Also:
一般的なアプローチでは、シンプルで高速かつ安全な手動メモリ管理だ。
Examples:
import core.memory : pageSize;

size_t numPages = 100;
void[] buf;
void[] prevBuf = null;
AscendingPageAllocator a = AscendingPageAllocator(numPages * pageSize);

foreach (i; 0 .. numPages)
{
    // Allocation is rounded up to page size
    buf = a.allocate(pageSize - 100);
    writeln(buf.length); // pageSize - 100

    // Allocations are served at increasing addresses
    if (prevBuf)
        writeln(prevBuf.ptr + pageSize); // buf.ptr

    assert(a.deallocate(buf));
    prevBuf = buf;
}
nothrow @nogc this(size_t n);
マッピングサイズをページサイズの次の倍数に丸め、メモリマッピングを作成するOSプリミティブを呼び出す。 mmap メモリマッピングを作成するOSのプリミティブを呼び出す。 VirtualAlloc を呼び出す。
Parameters:
size_t n マッピングサイズ(バイト
nothrow @nogc size_t goodAllocSize(size_t n);
要求されたサイズをページサイズの次の倍数に丸める。
nothrow @nogc void deallocate(void[] b);
パラメータとして与えられたバッファに関連付けられたすべての物理メモリをデコミットする、 ただし、仮想アドレスの範囲は保持する。
POSIXシステムでは deallocateでは、mmap に `MAP_FIXED' を付けて2回目の呼び出しを行い、メモリをデコミットする。 Windowsでは、MEM_DECOMMIT とともにVirtualFree を使う。
nothrow @nogc Ternary owns(void[] buf);
渡されたバッファが仮想アドレスの範囲内にあればTernary.yes を返す。 渡されたバッファがまだ有効であることは保証しない。
nothrow @nogc bool deallocateAll();
メモリマッピングを削除し、すべての物理メモリをデコミットし、仮想アドレス空間を取り戻す。 仮想アドレス空間が取り戻される。
nothrow @nogc size_t getAvailableSize();
さらなる割り当てのために利用可能なサイズをバイト単位で返す。
nothrow @nogc void[] allocate(size_t n);
割り当てサイズをページ・サイズの次の倍数に丸める。 割り当ては仮想ページの範囲を予約するだけで、実際の物理メモリは要求に応じて割り当てられる。 実際の物理メモリは、メモリへのアクセス時にオンデマンドで割り当てられる。
Parameters:
size_t n 割り当てるバイト数
Returns:
null 失敗した場合、または要求されたサイズが残りの容量を超えた場合に、割り当てる。
nothrow @nogc void[] alignedAllocate(size_t n, uint a);
割り当てサイズをページサイズの次の倍数に丸める。 アロケーションは仮想ページの範囲を予約するだけで、実際の物理メモリはメモリにアクセスする際に必要に応じて割り当てられる。 実際の物理メモリは、メモリへのアクセス時にオンデマンドで割り当てられる。
割り当てられたメモリは、指定されたアライメントに整列される。 a.
Parameters:
size_t n 確保するバイト数
uint a アラインメント
Returns:
null 失敗した場合、あるいは要求されたサイズが残りの容量を超えた場合。
nothrow @nogc bool expand(ref void[] b, size_t delta);
渡されたバッファが最後の割り当てでない場合 deltaは 最大で最後のページに残っているバイト数になる。 そうでなければ、最後の割り当てを仮想アドレス範囲の最後まで拡張することができる。 アドレスの範囲まで拡張できる。
nothrow @nogc Ternary empty();
アロケータが生きているオブジェクトを含んでいなければTernary.yes を返し、そうでなければ を返す。 そうでなければTernary.no を返す。
struct SharedAscendingPageAllocator;
SharedAscendingPageAllocatorAscendingPageAllocator のスレッドセーフ版である。
Examples:
import core.memory : pageSize;
import core.thread : ThreadGroup;

enum numThreads = 100;
shared SharedAscendingPageAllocator a = SharedAscendingPageAllocator(pageSize * numThreads);

void fun()
{
    void[] b = a.allocate(pageSize);
    writeln(b.length); // pageSize

    assert(a.deallocate(b));
}

auto tg = new ThreadGroup;
foreach (i; 0 .. numThreads)
{
    tg.create(&fun);
}
tg.joinAll();
shared nothrow @nogc this(size_t n);
マッピングサイズをページサイズの次の倍数に丸め、メモリマッピングを作成するOSプリミティブを呼び出す。 mmap メモリマッピングを作成するOSのプリミティブを呼び出す。 VirtualAlloc を呼び出す。
Parameters:
size_t n マッピングサイズ(バイト
shared nothrow @nogc size_t goodAllocSize(size_t n);
要求されたサイズをページサイズの次の倍数に丸める。
shared nothrow @nogc void deallocate(void[] b);
パラメータとして与えられたバッファに関連付けられたすべての物理メモリをデコミットする、 ただし、仮想アドレスの範囲は保持する。
POSIXシステムでは deallocateでは、mmap に `MAP_FIXED' を付けて2回目の呼び出しを行い、メモリをデコミットする。 Windowsでは、MEM_DECOMMIT とともにVirtualFree を使う。
shared nothrow @nogc Ternary owns(void[] buf);
渡されたバッファが仮想アドレスの範囲内にあればTernary.yes を返す。 渡されたバッファがまだ有効であることは保証しない。
shared nothrow @nogc bool deallocateAll();
メモリマッピングを削除し、すべての物理メモリをデコミットし、仮想アドレス空間を取り戻す。 仮想アドレス空間が取り戻される。
shared nothrow @nogc size_t getAvailableSize();
さらなる割り当てのために利用可能なサイズをバイト単位で返す。
shared nothrow @nogc void[] allocate(size_t n);
割り当てサイズをページ・サイズの次の倍数に丸める。 割り当ては仮想ページの範囲を予約するだけで、実際の物理メモリは要求に応じて割り当てられる。 実際の物理メモリは、メモリへのアクセス時にオンデマンドで割り当てられる。
Parameters:
size_t n 割り当てるバイト数
Returns:
null 失敗した場合、または要求されたサイズが残りの容量を超えた場合に、割り当てる。
shared nothrow @nogc void[] alignedAllocate(size_t n, uint a);
割り当てサイズをページサイズの次の倍数に丸める。 アロケーションは仮想ページの範囲を予約するだけで、実際の物理メモリはメモリにアクセスする際にオンデマンドで割り当てられる。 実際の物理メモリは、メモリへのアクセス時にオンデマンドで割り当てられる。
割り当てられたメモリは、指定されたアライメントに整列される。 a.
Parameters:
size_t n 確保するバイト数
uint a アラインメント
Returns:
null 失敗した場合、あるいは要求されたサイズが残りの容量を超えた場合。
shared nothrow @nogc bool expand(ref void[] b, size_t delta);
渡されたバッファが最後の割り当てでない場合 deltaは 最大で最後のページに残っているバイト数になる。 そうでなければ、最後の割り当てを仮想アドレス範囲の最後まで拡張することができる。 アドレス範囲まで拡張できる。