2014-07-21 12 views
11

Jaka jest korzyść z wykonania: shm_open po mmap?
Dlaczego nie utworzyć zwykłego pliku, a następnie przekazać go fd do mmap?
Nie widzę korzyści z shm_open - to tylko referencje, nieprawdaż?Dlaczego warto używać shm_open?

Przeczytałem człowieka z całej rodziny. Wydaje mi się, że "tajemnica" tkwi w akcji mmaping - plik "typ" wydaje się pozbawiony znaczenia.

Wszelkie wskaźniki będą dobre, zwłaszcza z kontem skuteczności.
Mój kontekst jest (cyklicznym nadpisywalnym) buforem (powiedzmy 128 MB), który będzie stale zapisywany jako jeden proces i ciągle odrzucany przez inny.

Jako przykład: co jest nie tak z podejściem open/mmap z this.

EDIT
Aby być precyzyjnym, to jedna z następujących lepiej niż inne:
fd = open("/dev/shm/myshm.file", O_CREAT|O_RDWR, S_IRUSR | S_IWUSR); mem = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); vs.
fd = shm_open("/myshm.file", O_RDWR|O_CREATE, S_IRUSR | S_IWUSR); mem = mmap(...same as before...);
Kiedy utworzony plik z regularnym open pod /dev/shm fs, i po cenach dumpingowych Gig śmieci do niego, moja dostępna pamięć spadła o 1G, a moja dostępna przestrzeń dyskowa pozostała taka sama.
Jaka jest różnica między tymi dwoma metodami?

+0

Po prostu spróbuj. zapis do pliku jest może sto razy wolniejszy. –

Odpowiedz

12

Jeśli otworzysz zwykły plik i mmap(), dane znajdą się w tym pliku.

Jeśli potrzebujesz tylko współużytkować region pamięci, bez potrzeby utrzymywania danych, co powoduje dodatkowe obciążenie we/wy, użyj shm_open().

Taki obszar pamięci umożliwiłby również przechowywanie innych rodzajów obiektów, takich jak muteksy lub semafory, których nie można zapisać w zwykłym pliku mmap() w większości systemów.

+0

Ale co, jeśli utworzyłem plik pod/dev/shm fs? tak jak, otwórz ("/ dev/shm/myshm", "w")? Jaka jest zaleta korzystania z shm_open? – Trevor

+2

Wtedy byłoby całkiem tak samo, jeśli użyjesz shm_open lub open, ale pamiętaj, że jest to specyficzne dla Linuksa. Byłoby to zupełnie bezcelowe, gdy istnieje standardowe podejście. shm_open dba o zlokalizowanie/dev/shm, jeśli jest zamontowany również w niestandardowej lokalizacji. – nos

+0

Dzięki za wskazanie problemu z przenośnością. Nasz produkt jest dostarczany jako maszyna wirtualna do klientów, więc kontrolujemy dystrybucję, którą obsługuje nasz kod, więc możemy to zarządzać.To, co dostało mnie na pierwszym miejscu, to możliwość tworzenia logicznych katalogów w katalogu/dev/shm fs. Jest to artefakt shm_open glibc i nie jest to kwestia fs - więc idę z open(). – Trevor

2

Oba połączenia są zasadniczo równoważne z wykorzystaniem nowoczesnych systemów Linux - 1 podejście może być używany do dostępu POSIX pamięci współdzielonej z języków takich jak Go (patrz https://github.com/fabiokung/shm/blob/master/shm_linux.go) gdzie POSIX pamięci współdzielonej nie natywnie dostępne - może to być inna dla innych OS/wersja gdzie Pierwsze wywołanie doprowadziłoby do jakiegoś utworzenia pliku lub/dev/shm po prostu niedostępne i/lub prawdopodobnie wolniejsze działanie. Zasady ścieżce łączących może być również ewoluują z wersji na wersję librt

1-ty podejście nazywa pamięci mapowane pliki API (obsługiwane w libs STD)

2nd nazwie POSIX API pamięci współdzielonej (wymaga librt aka libposix na Linuksie, jak uzależnienie To wewnętrznie konstruuje ścieżkę i wywołania otwarte)

Powiązane problemy