Skip to content

Commit

Permalink
general_allocator: revise
Browse files Browse the repository at this point in the history
Signed-off-by: smallkirby <[email protected]>
  • Loading branch information
smallkirby committed Nov 17, 2024
1 parent 8a32880 commit 5a0b598
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions src/kernel/general_allocator.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
しかし、どんなに小さなサイズのメモリを要求する場合でもバックエンドがページアロケータである以上、
実際に確保されるメモリの最小サイズは 4KiB になってしまいます。
本チャプターでは、より効率的に小さなサイズのメモリを確保できる汎用的なアロケータを実装します。
これにより、ページアロケータよりも遥かに小さなメモリオーバヘッドでメモリを確保できるように成ります
これにより、ページアロケータよりも遥かに小さなメモリオーバヘッドでメモリを確保できるようになります

## Table of Contents

Expand All @@ -27,10 +27,10 @@ Free な chunk は次の chunk へのポインタを持ち、全体としてリ

各 chunk は 4KiB ページを分割して作成されます。
よって、ページの中には同一サイズの chunk しか含まれません。
Bin のリストの中に割り当て可能な chunk がない場合、新しく 4KiB ページを作成し、それを固定サイズずつで分割して free な chunk を作成します。
Bin のリストの中に割り当て可能な chunk がない場合、新しく 4KiB ページを作成し、それを固定サイズで分割して free な chunk を作成します。

このアロケータはページアロケータよりもオーバヘッドが小さくなります。
例として `0x10` サイズの領域を確保する場合、ページアロケータだと `4096 - 8 = 4088` bytes が無駄になってしまいます。
例として `0x10` サイズの領域を確保する場合、ページアロケータだと `4096 - 16 = 4080` bytes が無駄になってしまいます。
一方 BinAllocator では `0x20` の bin から確保することで、オーバヘッドは `32 - 16 = 16` bytes に抑えることができます。
もちろん bin のサイズをより細かくすることでオーバヘッドをさらに減らすこともできます。

Expand Down Expand Up @@ -61,7 +61,7 @@ comptime {
各関数の実装はのちほど行います。

Bin のサイズは7種類用意しました。
これよりも細かいサイズを用意しても良いですが、bin を細かくするほどメモリアクセスの空間局所性が悪化する場合もあるため単に細かくすればよいというものでもありません
これよりも細かいサイズを用意しても良いですが、bin を細かくするほどメモリアクセスの空間局所性が悪化する場合もあり、単に細かくすればよいというものでもありません
なお、本シリーズではページサイズを超える bin はサポートしていないため `comptime` でチェックしています。
ページサイズを超える確保要求が来た場合は、そのまま `PageAllocator` に処理を委譲してページ単位で確保することにします。

Expand All @@ -87,7 +87,7 @@ const ChunkMetaPointer = ?*ChunkMetaNode;

## 初期化

`BinAllocator` は chunk の確保や、サポートする bin よりも大きいサイズの要求が来た場合のために、
`BinAllocator` は chunk 用のページ確保や、サポートする bin よりも大きいサイズの要求が来た場合のために、
バックエンドのアロケータとして `PageAllocator` を保持することにします。
`BinAllocator` を初期化する際には、`PageAllocator` を引数として受け取ります:

Expand Down Expand Up @@ -156,7 +156,7 @@ fn pop(list_head: *ChunkMetaPointer) *ChunkMetaNode {
}
```

もしも指定された bin のリストが空であった場合、先ほど実装牛田 `initBinPage()` を呼び出して新しいページを確保します。
もしも指定された bin のリストが空であった場合、先ほど実装した `initBinPage()` を呼び出して新しいページを確保します。
Bin に chunk があれば (または新しく chunk を作成した場合には)、その chunk をリストから pop して返します。
すごくシンプルです。

Expand All @@ -179,7 +179,7 @@ Bin から chunk を取得したり返却する処理が実装できたため、
### allocate

`PageAllocator` の場合と異なり、`BinAllocator` はページサイズ以下の領域を確保する可能性があります。
よって、 `BinAllocator` はページアラインを考慮する必要があります
よって、 `BinAllocator` 要求されたアラインを考慮する必要があります
要求されるアラインは、`allocater()`の第3引数に渡されます:

```ymir/mem/BinAllocator.zig
Expand Down

0 comments on commit 5a0b598

Please sign in to comment.