Думаю, проблема в root (hd0,0). Вы сказали, что это sdb, поэтому попробуйте отодвинуть корневой каталог ... и установите для него root (hd1,0)
Отображение памяти в файл напрямую позволяет избежать копирования буферов, которое происходит с вызовами read()
и write()
. Вызовы read()
и write()
включают указатель на буфер в адресном пространстве процесса, где хранятся данные. Ядро должно копировать данные в/из этих мест. Использование mmap()
сопоставляет файл с адресным пространством процесса, поэтому процесс может обращаться к файлу напрямую, и никаких копий не требуется.
Также нет накладных расходов на системный вызов при доступе к файлу с отображением памяти после начального вызова, если файл загружается в память при начальном mmap()
. Если страница отображаемого файла отсутствует в памяти, доступ вызовет ошибку и потребует от ядра загрузить страницу в память. Чтение большого блока с read()
может быть быстрее, чем mmap()
в таких случаях, если mmap()
будет генерировать значительное количество ошибок при чтении файла. (Можно заранее сообщить ядру с помощью madvise()
, чтобы ядро могло загружать страницы заранее перед доступом ).
Дополнительные сведения можно найти в соответствующем вопросе о переполнении стека:mmap ()и чтении блоков
Во-первых, в большинстве операций ввода-вывода характеристики базового оборудования хранения доминируют над производительностью. Плохо -сконфигурированный массив RAID5 из двадцати -девяти S -L -O -W 5400 об/мин SATA-дисков на медленной системе с недостатком памяти -с использованием S/W RAID с несоответствующими размерами блоков и неправильно выровненные файловые системы будут давать вам низкую производительность по сравнению с правильно настроенным и выровненным SSD RAID 1+0 на высокопроизводительном контроллере -, несмотря на любую настройку программного обеспечения, которую вы можете попробовать.
Но единственный способ mmap()
может быть значительно быстрее, если вы читаете одни и те же данные более одного раза и данные, которые вы читаете, не выгружаются между чтениями из-за нехватки памяти.
Шаги карты памяти:
Если процесс выполняет шаги 2 и 3 только один раз для каждого считанного бита данных или данные удаляются из памяти из-за нехватки памяти, mmap()
будет медленнее.
read()
шаги:
Отображение памяти превзойдет эту производительность -только из-за дополнительной копии из кэша страниц в память процесса. Но простое копирование страницы памяти (или менее )должно быть выполнено несколько раз, чтобы превзойти стоимость настройки отображения -, вероятно. Сколько раз зависит от вашей системы. Пропускная способность памяти, как используется вся ваша система, все. Например,если бы время, затраченное управлением памятью ядра на настройку отображения, в любом случае не было бы использовано каким-либо другим процессом, стоимость создания отображения действительно не очень высока. И наоборот, если в вашей системе много операций, связанных с созданием/удалением большого количества виртуальных памяти (, т. е. много короткоживущих -процессов ), влияние операций ввода-вывода с отображением памяти может быть значительным.
Затем read()
используется прямой ввод-вывод:
Чтение прямого ввода-вывода почти невозможно превзойти по производительности -. Но вы должны действительно настроить шаблоны ввода-вывода под ваше оборудование, чтобы максимизировать производительность.
Обратите внимание, что процесс может в значительной степени контролировать, вызывает ли чтение данных отказ страницы для буфера, который процесс использует для чтения.
Стало быть, доступ к отображаемым файлам в памяти -быстрее? Может быть, может быть, это не так.
Это зависит от вашего шаблона доступа (s ). Вместе с вашим оборудованием и всем остальным на вашем пути ввода-вывода (s ).
Если вы передаете в потоковом режиме видеофайл размером 30 ГБ на машине с 4 ГБ ОЗУ и никогда не возвращаетесь и не перечитываете какие-либо данные, память -, отображающая файл, вероятно, худшая . ] способ прочитать это.
И наоборот, если у вас есть 100-мегабайтная таблица поиска для некоторых данных, к которым вы случайным образом обращаетесь миллиарды и миллиарды раз в процессе обработки, и достаточно памяти, чтобы файл никогда не выгружался, сопоставление памяти уничтожит все другие методы доступа.
Огромное преимущество памяти -отображаемых файлов
Файлы сопоставления памяти имеют огромное преимущество по сравнению с другими формами :простоты кода ввода-вывода. Трудно превзойти простоту доступа к файлу, как будто он находится в памяти. И чаще всего,разница в производительности между памятью -, отображающей файл, и выполнением дискретных операций ввода-вывода в любом случае не так уж велика.