Вставка страниц в большие файлы mmap () без копирования данных - PullRequest
0 голосов
/ 24 сентября 2010

Мне интересно, есть ли способ вставить пустые страницы в начале большого (multi-GB) файла, который я открыл с помощью mmap ().Очевидно, что было бы возможно добавить страницу или две в конец и переместить все вперед с помощью memcpy (), но это испортило бы каждую страницу и потребовало бы очень долгого времени, когда в конечном итоге было записано на диск.

I 'Я предполагаю, что решение потребует некоторой сложной координации между настраиваемой файловой системой и ручным манипулированием таблицами страниц: добавьте блок в индекс, каким-то образом обновите кэшированные страницы в VMM, чтобы отразить это, затем каким-то образом переверните таблицу страниц, чтобы соответствовать.Это звучит нетривиально, что заставляет меня задуматься, есть ли лучший способ.

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

1 Ответ

2 голосов
/ 29 марта 2011

Вставить простой FAT в ваш файл.Например, первые 4 КБ файла будут FAT-страницей.Данные будут на следующих страницах.Первая страница FAT может ссылаться на другие страницы FAT по мере роста вашего файла.Каждая запись в жире будет индексом страницы данных и индексом следующей записи FAT.Запись FAT будет страницей FAT и индексом на этой странице самой записи.Я думаю, вы поняли идею.Записи FAT являются связанным списком.Страницы FAT представляют собой связанный список.Записи FAT связывают страницы данных.Этого должно быть достаточно для использования remap_file_pages () , чтобы файл выглядел непрерывно в памяти, даже если он не непрерывен на диске.

...