Speicherabbilddatei std :: allocator-Implementierung friert das WM6-Gerät ein

9

Ich habe ein Visual Studio 2008 C ++ - Projekt für Windows Mobile 6.x, wo ich mehr Speicher benötige, als mir im 32-MB-Prozess-Slot zur Verfügung steht. Also, ich suche Speicher-Mapped-Dateien. Ich habe eine Standardzuweisungsimplementierung erstellt, die neues / delete durch CreateFileMapping und MapViewOfFile .

Die beabsichtigte Verwendung ist etwa so:

%Vor%

Mit std::allocator kann ich in diesem Beispiel 28197 Iterationen bekommen, bevor ich eine std::bad_alloc Ausnahme bekomme. Mit dem MappedFileAllocator bekomme ich 32371 Iterationen, bevor das Gerät vollständig einfriert und neu gestartet werden muss. Da mein Gerät 512 MB RAM hat, habe ich erwartet, dass ich weit mehr Iterationen aus dieser Schleife herausholen kann.

Meine MappedFileAllocator Implementierung ist:

%Vor%

Kann jemand vorschlagen, wo ich mit meiner MappedFileAllocator -Implementierung falsch liegen könnte?

Danke, PaulH

    
PaulH 04.05.2011, 22:28
quelle

3 Antworten

0

Ich habe gerade die "populäre Frage" -Abzeichen für dieses hier, also dachte ich, dass ich (verspätet) die Antwort posten würde. Ich hatte keine verfügbaren Griffe mehr. Im Windows Mobile-Kernel gibt es einen unsigned short counter, der sich auf die überlaufende Handle-Zuweisung bezieht. Sobald das passiert ist, würde das Gerät einfrieren.

    
PaulH 09.04.2014, 13:45
quelle
1

Überprüfen Sie, ob boost :: interprocess Windows Mobile unterstützt. Sie verfügen über Funktionen zum Erstellen von Speicherabbilddateien und zum Zuweisen von Daten, die Sie benötigen, mit dem Speicher:

Ссылка

    
DR. 26.07.2011 18:10
quelle
0

Sie verwenden eine anonyme Dateizuordnung (eine ohne eine tatsächliche Datei, die sie unterstützt). Wenn Sie dies tun, wird die Zuordnung von der Systemauslagerungsdatei unterstützt. Es ist wahrscheinlich, dass das mobile Betriebssystem nicht wirklich eine Page-Datei hat, weil die "Festplatte" wahrscheinlich ein Flash-Gerät ist. Es ist im Allgemeinen eine schlechte Idee, einen virtuellen Speicher-Paging zu Flash-Geräten durchzuführen, da die Art des virtuellen Speichers eine große Menge von Schreibvorgängen bedeutet, die Flash schnell ausbrennen können (besonders ältere Typen).

Dies scheint durch die Anzahl der Iterationen unterstützt zu werden, die Sie erhalten. Es sieht so aus, als könnten Sie bis zu 60% des gesamten Speichers auf Ihrem Gerät abbilden.

Sie können wahrscheinlich mit größeren Abschnitten arbeiten, wenn Sie eine echte Datei öffnen (mit OpenFile ) und diese zuordnen, anstatt INVALID_FILE_HANDLE in CreateFileMapping zu verwenden. Aber seien Sie vorsichtig mit Ihrem Flash-Speicher (und der Leistung!), Wenn Sie sehr viel in Ihr Datei-Mapping schreiben werden.

    
SoapBox 04.05.2011 23:30
quelle