wake-up-neo.com

Speicherzugeordnete Dateien und Szenarien mit wenig Speicher

Wie geht die iOS-Plattform mit Speicherzuordnungsdateien in Szenarien mit wenig Speicher um? Mit Szenarien mit wenig Arbeitsspeicher meine ich, wenn das Betriebssystem die Benachrichtigung UIApplicationDidReceiveMemoryWarningNotification an alle Beobachter in der Anwendung sendet.

Unsere Dateien werden mit +[NSData dataWithContentsOfMappedFile:] in den Speicher abgebildet. In der Dokumentation heißt es:

Eine zugeordnete Datei verwendet Techniken für den virtuellen Speicher, um zu vermeiden, dass Seiten der Datei in den Speicher kopiert werden, bis sie tatsächlich benötigt werden.

Bedeutet dies, dass das Betriebssystem die Zuordnung der Seiten aufhebt, wenn sie nicht mehr verwendet werden? Ist es möglich, Seiten als nicht mehr verwendet zu markieren? Diese Daten sind schreibgeschützt, wenn sich dadurch das Szenario ändert. Wie wäre es, wenn wir mmap() direkt verwenden würden? Wäre das vorzuziehen?

38
Sedate Alien

Durch Speicherzuordnungsdateien werden Daten seitenweise von der Festplatte in den Speicher kopiert. Nicht verwendete Seiten können wie jeder andere virtuelle Speicher ausgetauscht werden, es sei denn, sie wurden mit mlock(2) in den physischen Speicher verdrahtet. Durch die Speicherzuordnung wird festgelegt, was von der Festplatte in den Speicher und wann in das Betriebssystem kopiert werden soll.

Es ist unwahrscheinlich, dass ein Wechsel von der Foundation-Ebene zur BSD-Ebene zur Verwendung von mmap einen großen Unterschied macht, abgesehen davon, dass Code, der mit anderem Foundation-Code zusammenarbeiten muss, etwas umständlicher ist.

19

(Dies ist keine Antwort, aber es wäre eine nützliche Information.)

Von @ID_AA_Carmack Tweet ,

@ID_AA_Carmack Wird die Zuordnung von iOS-Speicherdateien bei unzureichendem Arbeitsspeicher automatisch aufgehoben? (mit + [NSData dataWithContentsOfMappedFile]?)

ID_AA_Carmack hat darauf geantwortet,

@KhrobEdmonds ja, das ist einer der großen Vorteile der Verwendung zugeordneter Dateien unter iOS. Ich benutze allerdings mmap ().

Ich bin nicht sicher, ob das stimmt oder nicht ...

10
Kazuki Sakamoto

Nach meinen Experimenten reagiert NSData nicht auf Speicherwarnungen. Ich habe getestet, indem ich ein speicherabgebildetes NSData erstellt und auf Teile der Datei zugegriffen habe, damit diese in den Speicher geladen und schließlich Speicherwarnungen gesendet werden. Nach der Speicherwarnung war keine Abnahme der Speichernutzung zu verzeichnen. Nichts in der Dokumentation besagt, dass ein Speicher dazu führt, dass NSData in Situationen mit wenig Arbeitsspeicher den tatsächlichen Arbeitsspeicherbedarf reduziert. Daher kann ich davon ausgehen, dass er nicht auf Speicherwarnungen reagiert. In der NSCache-Dokumentation heißt es zum Beispiel, dass es versucht, Nizza in Bezug auf die Speichernutzung zu spielen. Außerdem wurde mir mitgeteilt, dass es auf die Warnungen zu wenig Arbeitsspeicher reagiert, die das System ausgibt.

Auch in meinen einfachen Tests auf einem iPod Touch (4. Generation) konnte ich ungefähr 600 Megadaten in den virtuellen Speicher mit +[NSData dataWithContentsOfMappedFile:] mappen. Als Nächstes habe ich begonnen, über die bytes -Eigenschaft der NSData-Instanz auf Seiten zuzugreifen. Als ich das tat, fing dieser echte Speicher an zu wachsen, aber er hörte auf, bei ungefähr 30 Megas realer Speichernutzung zu wachsen. Die Art und Weise der Implementierung scheint zu begrenzen, wie viel realer Speicher verwendet wird.

Kurz gesagt, wenn Sie die Speichernutzung von NSData-Objekten reduzieren möchten, sollten Sie am besten sicherstellen, dass sie vollständig freigegeben sind und sich nicht auf irgendetwas verlassen, das das System in Ihrem Namen automatisch ausführt.

7
Evan

Wenn iOS wie jedes andere Unix ist - und ich wette, es ist in dieser Hinsicht -, werden Seiten in einer mmap () - Region nicht "ausgelagert"; Sie werden einfach gelöscht (wenn sie sauber sind) oder in die zugrunde liegende Datei geschrieben und dann gelöscht (wenn sie schmutzig sind). Dieser Vorgang wird als "Ausräumen" der Seite bezeichnet.

Da Ihre Speicherzuordnung schreibgeschützt ist, sind die Seiten immer sauber.

Der Kernel entscheidet, welche Seiten gelöscht werden sollen, wenn der physische Speicher knapp wird.

Mit posix_madvise () können Sie dem Kernel Hinweise geben, auf welchen Seiten Sie es bevorzugen. Insbesondere fordert POSIX_MADV_DONTNEED den Kernel auf, sich frei zu fühlen, um die Seiten zu entfernen. oder wie Sie sagen, "Seiten als nicht mehr verwendet markieren".

Es sollte ziemlich einfach sein, einige Testprogramme zu schreiben, um festzustellen, ob iOS den Hinweis "nicht benötigt" beachtet. Da es von BSD abgeleitet ist, wette ich, dass es so sein wird.

3
Nemo

Standardtechniken für virtuellen Speicher für dateigesicherten Speicher besagen, dass das Betriebssystem Seiten jederzeit wegwerfen kann, da sie später immer wieder abgerufen werden können. Ich habe nicht iOS verwendet, aber dies war lange Zeit das Verhalten des virtuellen Speichers auf vielen anderen Betriebssystemen.

Der einfachste Weg, dies zu testen, besteht darin, mehrere große Dateien in den Arbeitsspeicher zu mappen, diese zu lesen, um sicherzustellen, dass sie in den Arbeitsspeicher kopiert werden, und zu prüfen, ob Sie eine Situation mit wenig Arbeitsspeicher erzwingen können. Wenn dies nicht möglich ist, muss das Betriebssystem die Zuordnung der Seiten aufgehoben haben, nachdem festgestellt wurde, dass sie nicht mehr verwendet werden.

1
btilly

Die dataWithContentsOfMappedFile:-Methode ist jetzt von iOS5 veraltet.

Verwenden Sie mmap, um diese Situationen zu vermeiden.

0
jarryd