Отображение несмежных -блоков из файла в непрерывные адреса памяти

Меня интересует перспектива использования отображаемого в память ввода-вывода, предпочтительно использование средств межпроцессного взаимодействия boost ::для кросс-платформы -поддержку, для сопоставления несмежных -блоков системного -размера страницы -в файле в непрерывное адресное пространство в памяти.

Упрощенный конкретный сценарий.:

У меня есть ряд «простых -старых -структур данных», каждая из которых имеет фиксированную длину. (меньше размера системной страницы. )Эти структуры объединены в (очень длинный )поток с типом и расположением структур определяется значениями тех структур, которые предшествуют им в ручей. Я стремлюсь свести к минимуму задержку и максимизировать пропускную способность в требовательная параллельная среда.

Я могу очень эффективно читать эти данные, -отображая их в памяти блоками. как минимум в два раза больше системного -страницы -размера... и установление нового сопоставление сразу после прочтения структуры, выходящей за пределы предпоследняя система -страница -граница. Это позволяет коду, который взаимодействует с простыми -старыми -структурами данных быть в блаженном неведении, что эти структуры отображаются в памяти... и, например, могут сравнивать два различные структуры, использующие memcmp ()напрямую, без забот о границах страницы.

Что становится интереснее, так это обновление этих данных. потоки... пока они (одновременно )читаются. Стратегия, которую я бы как использовать, вдохновлен «Копировать при записи» на системной странице --размера детализация...по сути, написание «оверлейных -страниц» -, позволяющих процесс для чтения старых данных, в то время как другой читает обновленные данные.

Управлять тем, какие оверлейные страницы и когда использовать, не обязательно банально... это не моя главная забота. Меня больше всего беспокоит то, что я могу иметь структуру, охватывающую страницы 4 и 5, затем обновить структура полностью содержится на странице 5... запись новой страницы в местоположение 6... оставляя страницу 5 для «сборки мусора», когда она определено как -недосягаемое. Это означает, что если я сопоставляю страницу 4 в ячейку M, мне нужно отобразить страницу 6 в ячейку памяти Размер M+страницы _... для надежной обработки структур, пересекать границы страниц, используя существующие (не -не имеющие памяти -сопоставления -осведомленные )функции.

Я пытаюсь найти наилучшую стратегию, но мне мешает документация, которую я считаю неполной. По сути, мне нужно развязать выделение адресного пространства из отображения памяти в этот адрес космос. С mmap ()я знаю, что могу использовать MAP _FIXED -, если захочу явно управлять местоположением сопоставления... но я не понимаю, как я следует зарезервировать адресное пространство, чтобы сделать это безопасно. Могу ли я составить карту /dev/zero для двух страниц без MAP _FIXED, затем используйте MAP _FIXED дважды, чтобы сопоставить две страницы с этим выделенным пространством по явным адресам виртуальных машин? Если Итак, я должен вызвать munmap ()три раза? Будет ли утечка ресурсов и/или есть какие-либо другие нежелательные накладные расходы? Чтобы сделать проблему еще более сложный, я бы хотел, чтобы поведение в Windows было сопоставимым... есть ли какой-нибудь способ сделать это? Есть ли изящные решения, если я скомпрометирую свою кросс -платформенные амбиции?

--

Спасибо за ваш ответ, Махмуд... Я прочитал и думаю, что понял этот код... Я скомпилировал его под Linux, и он ведет себя так, как вы предлагаете.

Больше всего меня беспокоит строка 62 -с использованием MAP _FIXED. Он делает некоторые предположения о mmap,что я не смог подтвердить, когда прочитал документацию, которую смог найти. Вы сопоставляете страницу «обновления» с тем же адресным пространством, что и mmap (), возвращенный первоначально -. Я предполагаю, что это «правильно» -, т.е. не то, что просто работает в Linux? Я также должен предположить, что он работает на платформе -для сопоставления файлов -, а также для анонимных сопоставлений.

Образец определенно продвигает меня вперед... документируя то, что то, что мне в конечном счете нужно, вероятно, достижимо с помощью mmap ()в Linux -, по крайней мере. Что бы мне действительно хотелось, так это ссылку на документацию, которая показывает, что строка MAP _FIXED будет работать так, как демонстрирует образец... и, в идеале, преобразование от специфичной для Linux/Unix mmap ()к независимой от платформы (Повышение ::межпроцессного )подхода.

18
задан aSteve 7 May 2012 в 18:37
поделиться