Курсовая работа: Мониторинг виртуальной памяти в ОС Linux
21049: brk(0806e000)
21049: brk -> (0806e000) – выделение первого блока, malloc выделяет 144 кб
21049: anon page @0804a004 (W)
21049: anon page @0804d00c (W) – записьметок
21049: fsync(1)
21049: anon page @0804b000 (R)
21049: anon page @0804c000 (R) – обращение к выделенной области
21049: fsync(2)
21049: fsync(0)
21049: anon page @08050014 (W) – выделение следующих 12 кб (запись метки)
21049: fsync(1)
21049: anon page @0804e000 (R)
21049: anon page @0804f000 (R) – обращения к выделенной области
21049: fsync(2)
…
21049: brk(0808f000) – очередной вызов malloc(), расширяем сегмент данных
21049: brk -> 134803456 (0808f000)
21049: anon page @0806e064 (W)
21049: fsync(1)
21049: fsync -> -22 (ffffffea)
21049: anon page @0806c000 (R)
21049: anon page @0806d000 (R)
…
Таким образом, видно, что malloc выделяет память блоками по 128 с небольшим кб при помощи вызова brk(). Рассмотрим, что происходит при увеличении размера запроса.
3) Запрашиваем последовательно 4, 8, 12, 16К, и т.д., обращаясь в цикле ко всем страницам. При этом, как только размер выделения превышает 128К, malloc выделяет память уже не из области сегмента данных программы (расширяемого вызововм brk() ), а при помощи mmap() , после чего free() его освобождает последующим munmap() :
789: mmap (00000000, 139264, rw-, PRIVATE | ANON, fd -1, @f019a000)
789: mmap -> -1210519552 (b7d8f000)
789: anon page @b7d8f004 (W)
789: fsync(1)