Меня интересует перспектива использования IO с отображением памяти, предпочтительно использование объектов в boost:: interprocess для кросс-платформенных поддержки, чтобы отображать несмежные блоки размера страницы в файле в файл в смежное адресное пространство в памяти.
Упрощенный конкретный сценарий:
У меня есть ряд структур "простой-старый", каждая из которых имеет фиксированную длину (меньше размера страницы системы). Эти структуры объединены в (очень длинный) поток с типом и расположением структур определяемые значениями тех структур, которые ведут их в поток. Я стараюсь минимизировать задержку и максимизировать пропускную способность в требуя одновременной среды.
Я могу очень хорошо прочесть эти данные путем сопоставления памяти в блоках как минимум в два раза больше размера страницы системы... и создания нового отображение, непосредственно прочитав структуру, выходящую за пределы предпоследняя системная страница-граница. Это позволяет взаимодействовать с кодом с явными структурами данных, чтобы блаженно не знать, что эти структуры отображены в память... и, например, можно сравнить два различные структуры, использующие memcmp() непосредственно, не заботясь о границах страниц.
Интересным становится интерес к обновлению данных потоки... пока они (одновременно) читаются. Стратегия, которую я бы как использовать, вдохновлен "Копировать на запись" на системном уровне страницы гранулярность... по существу, написание "накладных страниц", что позволяет процесс чтения старых данных, в то время как другой считывает обновленные данные.
Управление управляющими страницами, которые нужно использовать, и когда это не обязательно тривиально... это не моя главная забота. Моя главная проблема заключается в том, что я могу иметь структуру, охватывающую страницы 4 и 5, а затем обновить структура, полностью содержащаяся на странице 5... запись новой страницы в местоположение 6... оставляя страницу 5 для "сбора мусора", когда это которые, как считается, не достигают большего. Это означает, что если я сопоставляю страницу 4 в местоположение M, мне нужно отобразить страницу 6 в ячейку памяти M + page_size..., чтобы иметь возможность надежно обрабатывать структуры, которые границы перекрестных страниц с использованием существующих (не связанных с памятью) функций.
Я пытаюсь установить лучшую стратегию, и мне мешает документация. Я чувствую себя неполной. По сути, мне нужно отделить выделение адресного пространства из памяти в этот адрес пространство. С mmap() я знаю, что могу использовать MAP_FIXED - если я хочу явным образом контролирую местоположение отображения... но я не понимаю, как я необходимо зарезервировать адресное пространство, чтобы сделать это безопасно. Могу ли я отобразить /dev/zero для двух страниц без MAP_FIXED, затем дважды используйте MAP_FIXED сопоставить две страницы в выделенное пространство с явными адресами VM? Если так, следует ли мне также называть munmap() три раза? Будет ли он утечка ресурсов? и/или иметь любые другие неблагоприятные накладные расходы? Чтобы сделать проблему еще более сложный, мне бы хотелось, чтобы сопоставимое поведение в Windows... есть ли способ сделать это? Есть ли опрятные решения, если я буду компрометировать свои кросс-платформенные амбиции?
-
Спасибо за ваш ответ, Махмуд... Я читал и думаю, что понял этот код... Я скомпилировал его под Linux, и он ведет себя так, как вы предлагаете.
Моя основная проблема связана с линией 62 - с использованием MAP_FIXED. Он делает некоторые предположения о mmap, которые я не смог подтвердить, когда прочитал документацию, которую я могу найти. Вы сопоставляете страницу "обновление" в том же адресном пространстве, что и mmap(), возвращенном первоначально - я предполагаю, что это "правильно" - то есть не то, что просто происходит для работы в Linux? Я также должен предположить, что он работает кросс-платформенным для сопоставлений файлов, а также анонимных сопоставлений.
Образец определенно перемещает меня вперед... документирование того, что мне в конечном итоге необходимо, возможно, возможно, с mmap() на Linux - по крайней мере. Мне бы очень хотелось, указатель на документацию, показывающую, что строка MAP_FIXED будет работать, когда образец демонстрирует... и, что идеально, преобразование из Linux/Unix определенного mmap() в независимую от платформы (Boost:: interprocess).