Ik probeer dus een memory pool te ontwikkelen maar loop een beetje vast op een tweetal aspecten.
De basis is dat ik een block geheugen alloceer van een zekere grootte. Dat is de pool die ik tot mijn beschikking heb. Voorbeeldje van een pool van 128Kb
Elk block begint met een header wat hier de overhead wordt genoemd:
Wat je hier ziet is de volgende sequentie:
Nu de nadelen waar ik niet goed van weet hoe ik het het beste kan oplossen:
- Als de pool groter is dan duurt het bij vele kleine allocaties relatief lang om een geschikt leeg blok te vinden.
- Bij het vrijgegeven van het geheugen dient vanaf het begin de pool doorzocht te worden om het juiste gealloceerde blok te vinden. In mijn huidige implementatie worden opeenvolgende lege blokken samengenomen tot weer één groot leeg blok van alle opgetelde bytes. Daarvoor is het nodig om te weten wat het voorafgaande blok was. Aangezien niet duidelijk is hoe groot het voorgaande blok is, moet ik vanaf het begin beginnen met zoeken. Ook dat duurt vrij lang.
Ik ben dus benieuwd hoe memory pool implementaties hier doorgaans mee omgaan en of er theorieën of standaarden over zijn die ik nog niet ken?
De basis is dat ik een block geheugen alloceer van een zekere grootte. Dat is de pool die ik tot mijn beschikking heb. Voorbeeldje van een pool van 128Kb
pool #1, overhead 18, size 128 block #0, size 110, claimed 0, from: n/a pool #1, overhead 18, size 128 block #0, size 3, claimed 1, from: test.c:83 block #21, size 89, claimed 0, from: n/a pool #1, overhead 18, size 128 block #0, size 3, claimed 1, from: test.c:83 block #21, size 16, claimed 1, from: test.c:85 block #55, size 55, claimed 0, from: n/a pool #1, overhead 18, size 128 block #0, size 3, claimed 1, from: test.c:83 block #21, size 16, claimed 1, from: test.c:85 block #55, size 16, claimed 1, from: test.c:87 block #89, size 21, claimed 0, from: n/a pool #1, overhead 18, size 128 block #0, size 3, claimed 1, from: test.c:83 block #21, size 16, claimed 0, from: n/a block #55, size 16, claimed 1, from: test.c:87 block #89, size 21, claimed 0, from: n/a pool #1, overhead 18, size 128 block #0, size 3, claimed 1, from: test.c:83 block #21, size 89, claimed 0, from: n/a pool #1, overhead 18, size 128 block #0, size 110, claimed 0, from: n/a pool #1, overhead 18, size 128 block #0, size 110, claimed 0, from: n/a pool #1, overhead 18, size 128 block #0, size 110, claimed 0, from: n/a pool #1, overhead 18, size 128 block #0, size 30, claimed 1, from: test.c:101 block #48, size 62, claimed 0, from: n/a pool #1, overhead 18, size 128 block #0, size 110, claimed 0, from: n/a
Elk block begint met een header wat hier de overhead wordt genoemd:
C:
1
2
3
4
5
6
| typedef struct block_t { unsigned short claimed; unsigned int size; const char *file; int line; } __attribute__((packed)) block_t; |
Wat je hier ziet is de volgende sequentie:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| mempool_init(128, 1); mempool_print(); char *a = MALLOC(3); mempool_print(); char *b = MALLOC(16); mempool_print(); char *c = MALLOC(16); mempool_print(); FREE(b); mempool_print(); FREE(c); mempool_print(); FREE(a); mempool_print(); char *d = MALLOC(106); mempool_print(); FREE(d); mempool_print(); char *e = MALLOC(30); mempool_print(); FREE(e); mempool_print(); mempool_destroy(); |
Nu de nadelen waar ik niet goed van weet hoe ik het het beste kan oplossen:
- Als de pool groter is dan duurt het bij vele kleine allocaties relatief lang om een geschikt leeg blok te vinden.
- Bij het vrijgegeven van het geheugen dient vanaf het begin de pool doorzocht te worden om het juiste gealloceerde blok te vinden. In mijn huidige implementatie worden opeenvolgende lege blokken samengenomen tot weer één groot leeg blok van alle opgetelde bytes. Daarvoor is het nodig om te weten wat het voorafgaande blok was. Aangezien niet duidelijk is hoe groot het voorgaande blok is, moet ik vanaf het begin beginnen met zoeken. Ook dat duurt vrij lang.
Ik ben dus benieuwd hoe memory pool implementaties hier doorgaans mee omgaan en of er theorieën of standaarden over zijn die ik nog niet ken?
Sinds de 2 dagen regel reageer ik hier niet meer