2012-08-23 69 views
17

Rozumiem, że jeśli potrzebujesz pamięci przydzielanej dynamicznie, możesz użyć funkcji malloc(). Na przykład twój program czyta plik o zmiennej długości w char []. Nie wiesz z góry, jak duża jest twoja tablica, więc przydzielasz pamięć w środowisku wykonawczym.Kiedy należy użyć mmap

Próbuję zrozumieć, kiedy można użyć mmap(). Przeczytałem stronę man i szczerze mówiąc, nie rozumiem, co to jest przypadek użycia.

Czy ktoś może wyjaśnić mi przypadek użycia w prostych słowach? Z góry dziękuję.

Odpowiedz

28

mmap może być używany do kilku rzeczy. Najpierw mapowanie oparte na plikach. Zamiast alokować pamięć za pomocą malloc i odczytywać plik, mapujesz cały plik do pamięci bez jawnego jego czytania. Teraz, kiedy czytasz z (lub zapisujesz do) tego obszaru pamięci, operacje działają na tym pliku w sposób przezroczysty. Dlaczego chcesz to zrobić? Umożliwia łatwe przetwarzanie plików większych niż dostępna pamięć za pomocą mechanizmu stronicowania dostarczanego przez system operacyjny. Nawet w przypadku mniejszych plików mmapping zmniejsza liczbę kopii w pamięci.

mmap może być również używany do anonimowego mapowania. To odwzorowanie nie jest wspierane przez plik i jest po prostu żądaniem kawałka pamięci. Jeśli brzmi to podobnie do malloc, masz rację. W rzeczywistości większość implementacji malloc będzie wewnętrznie używać anonimowego mmap, aby zapewnić duży obszar pamięci.

Innym częstym zastosowaniem jest posiadanie wielu procesów odwzorowania tego samego pliku co wspólne mapowanie w celu uzyskania współużytkowanego regionu pamięci. Plik nie musi być zapisany na dysku. shm_open to wygodny sposób, aby tak się stało.

+0

Czy masz link z większą ilością szczegółów dotyczących dostępu do dużego pliku z niewielką ilością pamięci? Ten punkt wprowadza mnie w błąd co do sposobu działania mmap() ... – Ioan

+0

@Ioan Nie ma żadnych szczegółów dla dużych plików: po prostu je "mmap". Plik musi oczywiście pasować do pamięci _wirtualnej_, ale cała pamięć wirtualna nie musi być obecna w pamięci RAM w danym momencie. 'mmap' używa tego samego mechanizmu co przestrzeń wymiany. Ale wyjaśnienie, jak działa wirusowa pamięć, byłoby nieco za długie na komentarz :) –

+0

Twój komentarz ma więcej sensu. Źle zrozumiałem, co masz na myśli, przetwarzając pliki większe niż dostępna pamięć. – Ioan

5

Ilekroć zajdzie potrzeba odczytu/zapisu bloków danych o ustalonym rozmiarze, znacznie prostsze (i szybsze) jest po prostu zamapowanie pliku danych na dysk do pamięci za pomocą mmap i bezpośredni dostęp do pliku, zamiast przydzielać pamięć, czytać plik, uzyskać dostęp do danych, ewentualnie zapisać dane z powrotem na dysk i zwolnić pamięć.

Powiązane problemy