Курсовая работа: Мониторинг виртуальной памяти в ОС Linux
…
789: anon page @b7db0000 (R)
789: fsync(2)
789: munmap (b7d8f000, 139264)
789: munmap -> 0 (00000000)
При этом выделяется немного боьше памяти, чем было запрошено, и каждый раз она вся освобождается (т.е. следующие запросы опять приведут к выделениям). Опять-таки, страницы изначально возвращаются невыделенными.
3) Третий пример запрашивает память куда большими блоками, увеличивающимися по 100 Мб. При отключенном overcommit'e память быстро заканчивается, и очередной mmap возвращает ENOMEM :
1536: mmap (00000000, 629149696, rw-, PRIVATE | ANON)
1536: mmap -> -12 (fffffff4)
1536: anon page @b7e06de0 (R)
1536: brk(00000000)
1536: brk -> 134520832 (0804a000)
1536: brk(2d86b000)
1536: brk -> 134520832 (0804a000)
1536: mmap (00000000, 629280768, rw-, PRIVATE | ANON)
1536: mmap -> -12 (fffffff4)
1536: mmap (00000000, 2097152, rw-, PRIVATE | ANON)
1536: mmap -> -1212555264 (b7b9e000)
1536: munmap (b7b9e000, 401408)
1536: munmap -> 0 (00000000)
1536: munmap (b7d00000, 647168)
1536: munmap -> 0 (00000000)
1536: anon page @b7c00008 (W)
1536: mmap (00000000, 629149696, rw-, PRIVATE | ANON)
1536: mmap -> -12 (fffffff4)
Библиотека libc при этом пытается сначала выделить ту же память при помощи вызова brk() , затем снова при помощи вызова mmap(), но уже несколько меньший объем, однако и эти вызовы проходят неудачно.
4) Включим overcommit. Теперь, пока программа не обращается ко всем страницам из выделенного региона, а лишь к некоторым (не расходуя при этом всю физическую память), выполнение проходит нормально, и вызов mmap() успешно выделяет блоки памяти, значительно превыщающие объем свободной оперативной памяти (порядка 600 M):
2515: mmap (00000000, 996151296, rw-, PRIVATE | ANON)
2515: mmap -> 2089299968 (7c883000)