MEM_SHARED, mmap и жесткие ссылки - PullRequest
3 голосов
/ 13 августа 2011

Просто интересно, является ли ключ к разделяемой памяти именем файла или индексом.

У меня есть файл с именем .last, который представляет собой жесткую ссылку на файл с именем YYYYMMDDHHMMSS.

Каталог выглядит следующим образом:

20110101143000  
.last

.last - это просто жесткая ссылка на 20110101143000.

Через некоторое время создается новый файл

20110101143000  
20110622083000  
.last

Затем мы удаляем .last и воссоздаем его для обращения к новому файлу.

Наше программное обеспечение, которое постоянно работает во время этих обновлений, сопоставляет файл .last с MAP_SHARED.По завершении работы с файлом программное обеспечение может кэшировать его в течение нескольких минут, а не удалять его.На физическом сервере одновременно работают 12-24 экземпляра программного обеспечения.Различные экземпляры часто отображают один и тот же файл примерно в одно и то же время.У меня вопрос:

Использует ли linux имя файла для доступа к общей памяти или использует inode?

Учитывая этот сценарий:

  1. proc Mmaps .last, а не unmap
  2. записывается новый файл, .last удаляется, создается новый .last для связи с новым файлом
  3. procB отображает новый .last и не отображает

Если бы linux использовал inode, то proc A и B увидели бы разные блоки памяти, сопоставленные с разными файлами, что нам и нужно.Если linux использует имя файла, то и A, и B видят один и тот же блок памяти, сопоставленный с новым файлом.B - это хорошо, но A падает, когда память в блоке осколков меняется.

Кто-нибудь знает, как это на самом деле работает?Я собираюсь протестировать, но если выяснится, что это основано на имени, я облажался, если кто-то не знает трюк.

Спасибо!

1 Ответ

4 голосов
/ 13 августа 2011

Это индекс, по крайней мере, эффективно.То есть после того, как вы отобразили некоторые страницы из файла, они будут продолжать ссылаться на этот файл и не будут меняться только потому, что в файловой системе изменяется отображение имен на файлы.

...