На самом деле Xms и Xmx определяют лимит размера кучи, но есть и другие области памяти: стек (Xss x количество потоков) + PermGen + CodeCahe (48 МБ на по умолчанию в Java 7) + Прямая память.
Как правило, они добавляют примерно 1/2 ГБ, если нет спецификаций.
Обратите внимание, что mmap(2)часто требует файловый дескриптор, обычно предоставляемый open(2); в этом смысле open
является более фундаментальным. Также обратите внимание, что виртуальное адресное пространствонекоторого процессамодифицируется не только mmap
, munmap
, mprotect(2) , но и другими системными вызовами(включая execve(2); см. также shm_overview(7))
Кстати, ядро Linux не 't не используетmmap
или open
, но предоставляет и реализует их (для программ уровня приложения пользовательского пространства).
Но ядро Linuxуправляет кэшем страниц, который является более фундаментальным и связан с обоимисистемными вызовами. См. также LinuxAteMyRamи рассмотрите возможноиспользование madvise(2), posix_fadvise(2), readahead(2), чтобы дать подсказки подсистеме кэширования страниц.
различаются ли эти два системных вызова принципиально
Все системные вызовы (перечисленные в syscalls(2)...) различны.
См. такжеAdvanced Linux ProgrammingиОперационные системы: три простых шага(обе можно загрузить бесплатно).
Так как вы называете функции, мы предполагаем, что вы уже знаете, что вызов mmap()
на для файла требуется fd, который обычно (но не всегда) создается с помощью open()
.
Если вы не используете O_DIRECT, в ядрах, подобных Linux, с «унифицированным буферным кешем», read()
и write()
работают с одним и тем же кешем страниц, который отображается в mmap()
. Однако это игнорирует компромиссы производительности каждого метода, поэтому это не кажется очень полезным ответом.
Помимо получения книги, Google находит хорошее и краткое описание mmap и обычного ввода-вывода в сравнении с обычными операциями ввода-вывода. кеш страницы. В нем не упоминается производительность costдля mmap()
, согласно цитате Линуса Торвальдса, которую вы, вероятно, уже видели.