断片化を防ぐ単純なスレッドセーフなメモリ管理を実装する必要があります。thisやthisなどの記事を読んだことがありますが、C# で実装を開始する方法がわかりません。
重要なポイント: メモリ割り当てのリクエストの 95% は 1K 未満のブロックになります!
誰かが最初にコードを教えてくれませんか?
編集Allocator
済みですが、方法でプールを使用しなかった方法を
書きましたAlloc
。プールを使用するように変更するにはどうすればよいですか?
class Allocator
{
private int _id;
//TODO: it must be struct!
class Block
{
public int offset;
public int blockLength;
}
private readonly Dictionary<int, Block> idToBlock = new Dictionary<int, Block>();
private List<byte> rawData;
private int allocatedBlocksLength;
// sync
private readonly object _sync = new object();
public int Alloc(int count)
{
rawData.AddRange(new byte[count]);
idToBlock.Add(_id, new Block { offset = allocatedBlocksLength, blockLength = count });
var blockId = _id;
++_id;
allocatedBlocksLength += count;
return blockId;
}
public void Free(int id)
{
// Search in table
Block block;
if (!idToBlock.TryGetValue(id, out block))
return;
// remove object and update all offsets that after our block
foreach (var kv in idToBlock)
{
if (kv.Key == id)
continue;
if (kv.Value.offset > block.offset)
continue;
// changing indexes
kv.Value.offset -= block.blockLength;
}
// update how much left
allocatedBlocksLength -= block.blockLength;
}
}