Курсовая работа: Мониторинг виртуальной памяти в ОС Linux
2515: fsync(1)
2515: anon page @8b603008 (R)
2515: anon page @9a383008 (R)
2515: anon page @a9103008 (R)
2515: fsync(2)
2515: munmap (7c883000, 996151296)
2515: munmap -> 0 (00000000)
В данном примере вызов mmap() выделяет 900М, из которых мы обращаемся лишь к четырем страницам.
5) При попытке попытаться обратиться ко всем страницам из выделенного региона, очень скоро память исчерпывается и возникает ситуация, называемая OOM – Out Of Memory. В этом случае ядро вызывает функцию oom_kill() , которая выбирает процесс-жертву для уничтожения, основываясь на расходах памяти, времени работы, приоритете и т.п., и убивает выбранный процесс, с целью освободить память. При этом в журнал отладочных сообщений ядра выдается уведомление о том, что сработал oom_kill :
kernel: kwin invoked oom-killer: gfp_mask=0x201d2, order=0, oomkillad
6) Включим теперь файл подкачки. В случае, если объем выделяемого региона превышает размер доступной физической памяти, но меньше суммарного размера ее и файла подкачки, страницы из региона сначала выделяются по мере обращения к ним, затем старые начинают выгружаться в swap‑файл, после чего на втором цикле считывания происходит их подкачка оттуда:
19225: anon page @b7418bb0 (R)
…
19225: anon page @b7602893 (R)
19225: swapfile page @0ae1507c (R)
19225: swapfile page @0d8cb0e6 (R)
…
19225: swapfile page @0af146b0 (R)
7) Системные вызовы mlock()/mlockall() делают невыгружаемой определенную страницу виртуальной памяти процесса или все его страницы – текущие и / или выделенные в будущем, в зависимости от передаваемых в вызов mlockall() флагов.
Сделаем в начале выполнения программы невыгружемыми все страницы, выделяемые в будущем, после чего выделяем блоки по 12 кб (не освобождая):
13749: brk(00000000)
13749: brk -> 134520832 (0804a000)
13749: brk(0806e000)
13749: anon page @0804a000 (W)
…
13749: anon page @0806c000 (W)
13749: anon page @0806d000 (W)
13749: brk -> 134668288 (0806e000)
…