Зачем использовать shm_open?
Какое преимущество: shm_open
следует за mmap
?
Почему бы не создать обычный файл, а затем передать это fd
в mmap
?
Я не вижу преимущества shm_open
- это просто ссылки, не так ли?
Я прочитал человека всей семьи. Мне кажется, что "секрет" находится в действии mmaping - файл "type" кажется бессмысленным.
Любые указатели будут хорошими, особенно с учетной записью производительности.
Мой контекст - это (циклический перезаписываемый) буфер (скажем, 128 МБ), который будет постоянно записываться как один процесс и постоянно сбрасываться другим.
В качестве примера: что случилось с этим открытым /mmap.
ИЗМЕНИТЬ
Если быть точным, это одно из следующих лучше, чем другое:
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);
против
fd = shm_open("/myshm.file", O_RDWR|O_CREATE, S_IRUSR | S_IWUSR);
mem = mmap(...same as before...);
Когда я создал файл с регулярным open
под /dev/shm
fs и сбросил на него Gig мусора, моя доступная память опустилась на 1G, и мое доступное дисковое пространство оставалось прежним.
Какая разница между двумя методами?
Ответы
Ответ 1
Если вы открываете и mmap() обычный файл, данные будут попадать в этот файл.
Если вам просто нужно обмениваться областью памяти, без необходимости сохранять данные, что приводит к дополнительным служебным нагрузкам ввода-вывода, используйте shm_open().
Такая область памяти также позволит вам хранить другие объекты, такие как мьютексы или семафоры, которые вы не можете хранить в стандартном файле mmap() в большинстве систем.
Ответ 2
Оба вызова по существу эквивалентны для современного Linux
- 1-й подход может использоваться для доступа к общей памяти POSIX с таких языков, как go (см. https://github.com/fabiokung/shm/blob/master/shm_linux.go), где общая память POSIX недоступна изначально - it может отличаться для других ОС/версии, где 1-й вызов приведет к созданию какого-либо файла или /dev/shm, который просто недоступен и/или, возможно, более медленная производительность. Правила слияния путей также могут эволюционировать от версии к версии librt
1-й подход, называемый API-интерфейсом с отображением памяти (поддерживается в std-библиотеках)
2-й называется API общей памяти POSIX (требуется librt aka libposix для Linux как зависимость Он внутренне конструирует путь и вызывает открытый)