Ik heb een bestaande applicatie waarvan een aantal instanties (processes) draaien. Elke instantie maak gebruik van een hoop geheugen (voornamelijk voor structs en classes, en misschien een aantal primitive types) dat gevuld wordt met info uit een SQL database. Deze info is constant, en dus heeft elke instantie voor een groot deel dezelfde data in het geheugen.
Om het geheugenverbruik terug te brengen wilde ik gebruik maken van shared memory voor deze variabelen, zodat de eerste instantie van de applicatie die gestart wordt eenmaal de variabelen initialiseerd, en instanties die hierna gestart worden gebruik maken van hetzelfde stukje geheugen met de al gealloceerde en geinitialiseerde variabelen.
Het draait allemaal onder Windows, dus na wat onderzoek kwam ik uit op 'File Mappings' om zo een stuk shared geheugen te creëren - dit werkt perfect met onderstaande class die ik bij het starten van elk programma construct. De eerste print dat hij een nieuw blok shared geheugen heeft aangemaakt, verdere instanties verkrijgen een handle naar het door het andere proces gecreëerde geheugen.
Het probleem
Nu loop ik echter tegen een probleem aan: Hoe wijzig ik bestaande variabelen zo dat ze geheugen in de shared memory space toegewezen krijgen?
Zelf had ik een aantal ideeën:
Heeft iemand een idee hoe dit het makkelijkst uit te werken is zodat er zo min mogelijk veranderd hoeft te worden aan bestaande variabelen (bijv. alleen declaratie)?
Om het geheugenverbruik terug te brengen wilde ik gebruik maken van shared memory voor deze variabelen, zodat de eerste instantie van de applicatie die gestart wordt eenmaal de variabelen initialiseerd, en instanties die hierna gestart worden gebruik maken van hetzelfde stukje geheugen met de al gealloceerde en geinitialiseerde variabelen.
Het draait allemaal onder Windows, dus na wat onderzoek kwam ik uit op 'File Mappings' om zo een stuk shared geheugen te creëren - dit werkt perfect met onderstaande class die ik bij het starten van elk programma construct. De eerste print dat hij een nieuw blok shared geheugen heeft aangemaakt, verdere instanties verkrijgen een handle naar het door het andere proces gecreëerde geheugen.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| /* Attempt to open an existing file mapping */ hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, TRUE, "myFileMapping"); if(hMap != NULL) { printf("Using previously allocated shared memory"); } else { /* Create new file mapping */ hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, SHAREDMEM_SIZE, "myFileMapping"); if(hMap != NULL) { printf("Allocated shared memory"); } else { printf("Failed to allocate shared memory!"); } } pShared = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0); if(pShared == NULL) { printf("MapViewOfFile failed!"); } |
Het probleem
Nu loop ik echter tegen een probleem aan: Hoe wijzig ik bestaande variabelen zo dat ze geheugen in de shared memory space toegewezen krijgen?
Zelf had ik een aantal ideeën:
- Één SharedMemory class voor het allocaten van één shared memory 'space'. Hiernaar laat ik een private *SharedMemoryObject in de class pointen. SharedMemoryObject bevat dan een aantal member functions die pointers returned die naar specifieke stukken van het shared memory pointen. Met behulp van een static getObject kan ik het SharedMemoryObject waar dan ook binnen m'n source verkrijgen. Vervolgens zou ik alleen nog de variabeledeclaraties moeten wijzigen in iets als:
C++:1
RandomClass bigArray = SharedMemory::getObject()->getBigArrayPtr()
Het nadeel hiervan is dat ik van tevoren één groot stuk shared memory moet allocaten waarvan ik de size niet precies weet (of moet uitrekenen). - Een tweede idee was om per variabele die in de shared space opgeslagen moet worden een nieuwe SharedMemory class te constructen en hier dan dus apart een named(?) FileMapping voor te allocaten. De uitwerking hiervan was echter wat twijfelachtig - zeker om het simpel te houden zodat ik zo min mogelijk aan de variabelendeclaraties hoef aan te passen. Ik heb gedacht aan operator overloading, maar ik vraag me af of dat haalbaar is?
Heeft iemand een idee hoe dit het makkelijkst uit te werken is zodat er zo min mogelijk veranderd hoeft te worden aan bestaande variabelen (bijv. alleen declaratie)?