По mmap оперативная память не предоставляется. Адресное пространство предоставляется.
При доступе к адресному пространству возникает ошибка страницы. При сбое страницы в размере страницы, обычно 4096 байт, выделяется оперативная память.
Содержимое оперативной памяти также предоставляется. Если файлом резервируется адресное пространство, то появится содержимое файла. Если с помощью MAP_ANONYMOUS адресное пространство резервируется, появляется нулевое инициализированное ОЗУ.
Выше описаны два блага. Во-первых, именно так, как хотелось бы, ОЗУ можно инициализировать. Во-вторых, пока требуемой оперативной памяти не предусмотрено.
Для запроса адреса размером менее 2 мегабайт от malloc прерывание программы расширяется. Пока адреса, близкие к перерыву в программе, предоставляются, перерыв в программе не может быть сокращен. Следовательно, освобожденная оперативная память ядра может быть не возвращена. Далее следует аналогия. Можно ли снимать носки перед обувью?
При вызове munmap ядру немедленно возвращается оперативная память. При использовании mmap и munmap снижается вероятность подкачки. При прерывании программы malloc повышается вероятность подкачки расширения.
С помощью malloc можно выделить память меньше размера страницы. Прерывистая память становится. Память ядра также может фрагментироваться. Ни то, ни другое не идеально.
На любом неработающем процессоре с помощью ядра ОЗУ можно дефрагментировать. Создаются прозрачные огромные страницы размером 2 мегабайта. По сравнению с ошибкой 512 страниц для обеспечения 2M Когда сбой одной страницы 2M может быть обеспечен значительным преимуществом в производительности.
По mmap существует по крайней мере одно известное проклятие. Для поддержки mmap можно использовать дескриптор файла канала. Ошибки не становится. Однако в адресе памяти, предоставленном каналом, данные не отображаются.
Однако, если используется MAP_ANONYMOUS, данные могут быть прочитаны из дескриптора файла канала в адрес, предоставленный mmap. Хотя желаемый результат становится не таким эффективным. По неудачному возврату lseek и ошибке может быть идентифицирован дескриптор прикрепленного к каналу файла.
На компьютерах, которые могут адресовать весь мегабайт и запускать дисковую операционную систему, использование malloc необходимо. Если использование библиотеки C предоставляет функцию getline, то, вероятно, будут использоваться malloc и free.
В операционной системе, управляемой ядром, вместо mmap зачем использовать malloc? По сравнению с malloc; mmap кажется сложным? Для вызова munmap также необходимо указать ранее запрошенный объем адресного пространства. Использование malloc более портативно? malloc кажется более удобным?
Тем не менее, если требуется производительность, используется mmap.
И последнее, но не менее важное: если MAP_SHARED, то с дочерними процессами данные могут использоваться совместно. Избегать pthreads имеет первостепенное значение. Иногда клонирования также можно избежать.
Несмотря на то, что методы распределения переменных субъективны, они перечислены в порядке от наиболее предпочтительного до наименее предпочтительного: регистр/стек; ммап; Глобальный; маллок От каждого становятся разные блага и проклятия. достаточно сложной программой; используются три или, возможно, все четыре метода.
person
loquacious
schedule
25.03.2016
writeдля всего файла фактически отправляет все эти байты на диск. mmap просто означает, что если вы изменитеmmapданные, тогда ОС запишет изменения. Поэтому, если вы в конечном итоге не измените весь файл, вы можете написать только его часть. - person Steve Jessop   schedule 16.11.2009mmapдопускает и другие применения, например, создание области разделяемой памяти, с которой ваш процесс может взаимодействовать с разветвленными прецессами. - person Patrick Schlüter   schedule 22.10.2010