tarosukeの日記: [talos]メモリ管理 vii
まとまってなかったりワケワカだったりするのはこれがただのメモなのが原因なので気にするな。
引き続きメモリ管理。主にheap。この辺はミスると酷い目に遭うので慎重に進めたいが慎重に進めるには時間が足らん。なので今宵もコードはあまり触らずに練ってみる。
メモリブロックを「境界-ポインタサイズ」でアラインするとページ境界からの割り当てを特別に処理しなくて済む。しかし2ページ以上を割り当てると割り当て単位毎に実ページがほぼ1ページ分無駄になる。逆にメモリブロックを境界でアラインするとページ境界からの割り当てを特別に処理する必要がある。だが複数ページを割り当てても最小ブロック分しか無駄にならない。またキャッシュのように返却するpoolが決まっている場合、割り当てた領域をまるまる使えるというメリットもある。
...割り当てを境界からにして、境界から使うメモリを取得/返却するメソッドを別に設けて「サイズを記録しておく事」とすると話は単純になる。境界アラインを特別扱いする必要もなくメモリも無駄にならない。普通の領域は境界から使うメソッドを呼び出して先頭に返却先を記録するだけでいい。混同するとheapが破綻するけど境界からメモリを使う必要があるのはドライバと画面くらいなものなので問題ないような気もする。new/deleteは自動でサイズを記録&割り当て開始をオフセットだからそっちは普通のheapだがな。
他には仮想ページクラスに「実ページをパージ(presentだったら実ページを解放してvalid状態に)」するメソッドがあるとheapに返却したメモリの大部分を完全に返却できていいかも試練。先頭ページはpoolで使うからパージできないけどな。
※present:実ページが割り当てられている状態。valid:実ページは割り当てられていないがページフォルトした時に実ページを割り当てる。
[talos]メモリ管理 vii More ログイン