Меня интересует перспектива использования IO с памятью, предпочтительно , использующая возможности в boost :: interprocess для кросс-платформенной поддержки , для отображения несмежной системы -страничных блоков в файле в смежное адресное пространство в памяти.Отображение несмежных блоков из файла в последовательные адреса памяти
упрощенный конкретный сценарий:
Я целый ряд структур «набившие оскомину-данных», каждый из фиксированной длины Эти структуры объединяются в (меньше, чем размер системной страницы.) (очень длинный) поток с типом & расположение структур , определяемых значениями тех структур, которые ведут их в потоке . Я стараюсь свести к минимуму задержку и увеличить пропускную способность в , требующем одновременной работы.
Я могу очень эффективно считывать эти данные по памяти, отображение его в блоках , по крайней мере в два раз системной страницы размера ... и создание нового отображения сразу, прочитав структуру простирающейся за пределами предпоследнего системы- страница-граница. Это позволяет коду, который взаимодействует с , с структурами с простыми старыми данными, чтобы быть в блаженном неведении, что структуры отображены в память ... и, например, можно сравнить две различные структуры с использованием memcmp() непосредственно, не заботясь о о границах страниц.
Когда все становится интересным, это касается обновления данных потоков ... пока они (одновременно) прочитаны. Стратегия, которую я хотел бы использовать , похожа на использование «Copy On Write» на системной странице размером детализации ... по существу, пишет «накладные страницы», что позволяет одному процессу читать старые данные, в то время как другой читает обновленные данные.
При управлении оверлейными страницами, которые используются, и когда, необязательно, тривиально ... это не моя основная забота. Моя основная проблема заключается в том, что я могу иметь структуру, охватывающую страницы 4 и 5, а затем обновить структуру , полностью содержащуюся на странице 5 ... запись новой страницы в местоположение 6 ... оставляя страницу 5 «собранной мусором», когда он равен , который, как считается, больше не доступен. Это означает, что если я сопоставляю страницу 4 в местоположении M, мне нужно отобразить страницу 6 в ячейку памяти M + page_size ..., чтобы иметь возможность надежно обрабатывать структуры, которые пересекают границы страницы с использованием существующих (без памяти) -mapping-aware).
Я пытаюсь установить лучшую стратегию, и мне мешает документация . Я чувствую себя неполной. По сути, мне нужно отделить выделение адресного пространства от картографирования памяти по этому адресу . С 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) подход.
Спасибо, это полезно. В идеале я хотел бы указать указатель на документацию, которая предполагает, что это безопасно/целесообразно использовать MAP_FIXED таким образом, а также установить, возможен ли кросс-платформенный подход с использованием boost. – aSteve
Вот что я не понял о вашем вопросе. Это то, что «MAP_FIXED» * сделано * для. Теперь правильный способ его использования * если * вы говорите о сотнях MiB адресного пространства, было бы использовать фиксированную адресацию для * all * сопоставлений, в противном случае система выбора случайного местоположения будет достаточно хорошей. –
Я знал, что MAP_FIXED имеет отношение (в Linux, MapViewOfFileEx в Windows), хотя меня раздражало: «Поскольку требуемый фиксированный адрес для сопоставления менее переносимый, использование этого параметра не рекомендуется». в моей manux странице linux mmap. Я ожидаю, что буду отображать сотни MiB (по крайней мере), но я не знаю, как лучше всего зарезервировать адресное пространство, чтобы выделить его самостоятельно - если не через mmap(). – aSteve