2012-01-15 9 views
20

Jakie są wady przydzielania pamięci przy użyciu mmap (z MAP_PRIVATE i MAP_ANONYMOUS) niż przy użyciu malloc? W przypadku danych w zakresie funkcji, i tak korzystałbym z pamięci stosu, a zatem nie, w przypadku niektórych dynamicznych struktur danych, takich jak drzewa i powiązane listy, gdzie często trzeba przydzielić i zwolnić małe porcje danych. . Korzystanie z tego systemu byłoby kosztowne z dwóch powodów: jednego do przydzielania z dokładnością do 4096 bajtów, a drugiego do żądania wywołania systemowego.Co się stanie, jeśli przydzielę pamięć za pomocą mmap zamiast malloc?

Ale czy w innych scenariuszach uważasz, że malloc jest lepszy niż mmap? Po drugie, czy przeszmuglowałem wady w odniesieniu do dynamicznych struktur danych: mmap?

Zaletą mmap nad malloc mogę myśleć, że pamięć jest natychmiast powrócił do systemu operacyjnego, gdy robisz munmap, natomiast z malloc/free Chyba pamięć uptil segmentu danych punkt przerwania nigdy nie jest zwracany, ale przechowywane reusage .

+9

malloc w razie potrzeby nazwie mmap, po prostu trzymaj się malloc. – Macmade

+2

Inną wadą jest to, że jeśli zaśmiecasz swój kod wywołując 'mmap', staje się on mniej przenośny. –

+3

I dlaczego życie staje się bardziej skomplikowane, niż powinno być? –

Odpowiedz

26

Tak, jest lepsza niż mmap. Jest o wiele łatwiejszy w użyciu, o wiele bardziej drobnoziarnisty i znacznie bardziej przenośny. W końcu to zadzwoni pod numer mmap.

Jeśli zaczniesz wykonywać codzienne zarządzanie pamięcią przy pomocy mmap, będziesz chciał zaimplementować sposób na dzielenie go na mniejsze porcje niż strony, a skończysz ponownie prawdopodobnie malloc - w suboptymalny sposób.

+1

Doskonała odpowiedź głęboka, ponieważ wspomina, że ​​'malloc' nazywa' mmap'. –

17

Po pierwsze, mmap() jest konstrukcją specyficzną dla platformy, więc jeśli planujesz pisać przenośne C, to już jest.

Po drugie, jest zasadniczo zaimplementowany pod względem mmap(), ale jest swego rodzaju inteligentnym opakowaniem biblioteki wokół wywołania systemowego: w razie potrzeby zażąda nowej pamięci z systemu, ale do tego czasu wybierze pamięć w obszar, który już zaangażował się w proces.

Dlatego, jeśli chcesz zrobić zwykły dynamiczny przydział pamięci, użyj malloc(), koniec wątku. Wykorzystanie mmap() do przydzielania pamięci powinno być zarezerwowane dla sytuacji specjalnych (np. Jeśli naprawdę chcesz mieć całą stronę dla siebie, wyrównane na granicy strony) i zawsze wyodrębniane do pojedynczego fragmentu kodu biblioteki, aby inni mogli łatwo zrozumieć, co Ty Robię to ponownie.

+1

Nawet jeśli chcesz mieć całą stronę dla siebie, to prawdopodobnie lepiej jest użyć 'posix_memalign', będzie to łatwiejsze do przydzielenia, szybciej do uwolnienia i uwolni jądro od kłopotów z śledzeniem kolejnej vma. Naprawdę jedynym powodem użycia 'mmap' jest zamapowanie deskryptora pliku do pamięci (najczęściej używane) lub implementowanie alokatora pamięci (a nawet wtedy istnieją dobre powody, by preferować' sbrk'). – jleahy

3

Jedną z cech, które posiada mmap że malloc nie jest mmap pozwala przeznaczyć użyciu ogromne Pages (flag argument MAP_HUGETLB zestawu), natomiast malloc nie ma takiej możliwości.

Powiązane problemy