Pliki mapowane pamięcią i scenariusze o niskiej pamięci

Jak Platforma iOS obsługuje pliki mapowane w pamięci podczas scenariuszy o niskiej pamięci? Przez scenariusze o niskiej pamięci mam na myśli, kiedy system operacyjny wysyła powiadomienie UIApplicationDidReceiveMemoryWarningNotification do wszystkich obserwatorów w aplikacji.

Nasze pliki są mapowane do pamięci za pomocą +[NSData dataWithContentsOfMappedFile:], dokumentacja, dla której stwierdza się:

Zmapowany plik wykorzystuje techniki pamięci wirtualnej, aby uniknąć kopiowania stron pliku do pamięci, dopóki nie są one rzeczywiście potrzebne.

Czy to oznacza, że OS będzie odmapuj również strony, gdy nie są już używane? Czy można oznaczyć strony jako nieużywane? Te dane są tylko do odczytu, jeśli to zmienia scenariusz. A gdybyśmy użyli mmap() bezpośrednio? Czy tak byłoby lepiej?

Author: nevan king, 2011-05-30

6 answers

Pliki mapowane pamięcią kopiują dane z dysku do pamięci strony na raz. Nieużywane strony mogą być wymieniane, tak samo jak każda inna pamięć wirtualna, chyba że zostały podłączone do pamięci fizycznej za pomocą mlock(2). Mapowanie pamięci pozostawia określenie, co skopiować z dysku do pamięci i kiedy do systemu operacyjnego.

Przejście z poziomu Foundation do poziomu BSD w celu użycia mmap jest mało prawdopodobne, aby coś zmieniło, poza tworzeniem kodu, który musi być połączony z innym kodem Fundacji trochę bardziej niezręcznie.

 19
Author: Jeremy W. Sherman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-02 14:43:39

(to nie jest odpowiedź, ale byłaby to przydatna informacja.)

From @ ID_AA_Carmack tweet ,

@ID_AA_Carmack czy pliki mapowane w pamięci iOS są automatycznie usuwane w warunkach niskiej pamięci? (używając + [nsdata dataWithContentsOfMappedFile]?)

ID_AA_Carmack odpowiedział na to,

@ Chrobedmonds tak, to jedna z wielkich zalet korzystania z mapowanych plików na iOS. Używam jednak mmap ().

Nie jestem pewien czy to prawda czy nie...

 10
Author: Kazuki Sakamoto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-08 04:14:01

Z moich eksperymentów NSData nie reaguje na Ostrzeżenia dotyczące pamięci. Przetestowałem, tworząc pamięć zmapowaną NSData i uzyskując dostęp do części pliku, aby został załadowany do pamięci i w końcu wysyłając ostrzeżenia o pamięci. Nie odnotowano zmniejszenia zużycia pamięci po ostrzeżeniu o pamięci. Nic w dokumentacji nie mówi, że pamięć spowoduje nsdata, aby zmniejszyć rzeczywiste zużycie pamięci w sytuacjach niskiej pamięci, więc prowadzi mnie do przekonania, że nie reaguje na Ostrzeżenia dotyczące pamięci. Na przykład NSCache dokumentacja mówi, że będzie starał się grać ładnie w odniesieniu do zużycia pamięci plus powiedziano mi, że reaguje na ostrzeżenia o niskiej pamięci system podnosi.

Również w moich prostych testach na iPodzie Touch (4. generacji) udało mi się zmapować około 600 megów danych plików do pamięci wirtualnej +[NSData dataWithContentsOfMappedFile:]. Następnie zacząłem uzyskiwać dostęp do stron poprzez właściwość bytes na instancji NSData. Tak jak to zrobiłem, ta prawdziwa pamięć zaczęła rosnąć, jednak przestała rosnąć w okolicach 30 megs rzeczywistego zużycia pamięci. Więc droga jest on zaimplementowany, wydaje się ograniczać ilość rzeczywistej pamięci.

W skrócie, jeśli chcesz zmniejszyć zużycie pamięci obiektów NSData, najlepiej jest upewnić się, że są one całkowicie zwolnione i nie polegać na niczym, co system automatycznie robi w Twoim imieniu.

 7
Author: Evan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-07 18:49:50

Jeśli iOS jest jak każdy inny Uniks - i założę się, że tak jest-Strony w regionie mmap() nie są "zamieniane"; są po prostu upuszczane (jeśli są czyste) lub zapisywane do pliku bazowego, a następnie upuszczane (jeśli są brudne). Proces ten nazywa się" eksmitowaniem " strony.

Ponieważ mapa pamięci jest tylko do odczytu, strony będą zawsze czyste.

Jądro zdecyduje, które strony mają zostać eksmitowane, gdy pamięć fizyczna się wyczerpie.

Możesz dać kernel podpowiada, które strony chcesz zachować / evict używając posix_madvise(). W szczególności, POSIX_MADV_DONTNEED mówi jądru, aby poczuł się swobodnie eksmitować strony; lub jak mówisz, "Oznacz strony jako nieużywane".

Napisanie niektórych programów testowych powinno być dość proste, aby sprawdzić, czy iOS przestrzega podpowiedzi "nie potrzebuję". Ponieważ pochodzi z BSD, założę się, że będzie.

 3
Author: Nemo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-08 00:54:35

Standardowe techniki pamięci wirtualnej dla pamięci z plikami mówią, że system operacyjny może wyrzucać strony, kiedy chce, ponieważ zawsze może je odzyskać później. Nie używałem iOS, ale to jest zachowanie pamięci wirtualnej na wielu innych systemach operacyjnych przez długi czas.

Najprostszym sposobem na przetestowanie go jest mapowanie kilku dużych plików do pamięci, przeczytanie ich, aby zagwarantować, że strona zostanie dodana do pamięci i sprawdzenie, czy można wymusić sytuację o niskiej pamięci. Jeśli nie można, więc system operacyjny musiał odmapować strony, gdy zdecydował, że nie są już używane.

 1
Author: btilly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-02 13:55:24

Metoda dataWithContentsOfMappedFile: jest obecnie przestarzała z iOS5.

Użyj mmap, ponieważ unikniesz takich sytuacji.

 0
Author: jarryd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-03 01:52:01