パート XIII. mmap() を使ったカスタムアロケーター

目次

102. ユーザーによるオブジェクト管理を前提にするカスタムページアロケーター
103. カスタムアロケーターによるブロック管理

 mmap() を使うカスタムアロケーターといっても、まあ既に部分的にそれっぽいものは作ってます。

 malloc() 関数は一定サイズ以上の割り当てリクエストには mmap() を使って割り当てるので、単にメモリーを割り当てるだけなら mmap() を使うためのアロケーターは不要です。

 全米が咽(むせ)び泣き感動した malloc() と mmap() のコラボ… の必要はなかた… (´・ω・`)

 まあ mmap() をあえて使いたい時は、大容量のデータアクセスをしたい時なんかじゃないかと思います。

 例えばメモリーに入り切らないような大きなデータをファイルシステムから読み込みたい場合や、余計なオーバーヘッドなくファイルシステムに即座に反映させたいなら mmap() じゃないと実現できないですからね。

 それでも mmap() とかいう謎システムコールを使うのは心理的抵抗はあると思います。

 でも C++ アンチから散々 C++ の罵詈雑言を浴びせられて、これまで生き延び長らえた C++er ならば「石の上にも三年」の精神でローレベルなカオスにも踏み応えられるでしょう(プチ耐久性)。

  mmap() アロケーターには 2 種類あると筆者は思います。

 このうち前者はまあ楽っちゃ楽です。

 とりあえず mmap() でマップしたメモリー領域のポインターを返して、不要になったら munmap() までをアロケーターが行います。

 割り当てたメモリー領域はもちろん construct() や destroy() を使ってオブジェクトを直接利用しても良いですが、ページサイズの倍数ということは 4096 バイトぐらいになるわけで、それだと勿体ないです。

 なのでユーザーアプリケーション側で使い方を考えることになります。

 もしくはアロケーターをより使いやすく実装することもできますが、具体的な使用ニーズがないと検討ハズレなものになるでしょう。

 後者の実装はスタックアロケーターやヒープアロケーターと同様に最初に可能な限り大きなサイズの領域を割り当てて、後はユーザーには mmap() でファイルマッピングした領域を返します。

 では大した説明はできませんが、実装を検討してみましょう。

Copyright 2018-2019, by Masaki Komatsu