Ядро знает, какие страницы изменяются, так же, как и любые другие страницы: когда они записываются, в таблицах страниц устанавливается флаг, помечающий их как «грязные». Это делается либо ЦП, либо MMU, либо с их помощью (например, они могут установить бит напрямую или вызвать прерывание, чтобы программное обеспечение сделало это).
Но на самом деле поведение, которое вы предполагаете, не гарантируется. Измененные страницы не нужно записывать обратно (или даже ставить в очередь для обратной записи) до тех пор, пока не будет вызван msync
или munmap
.
Я не уверен, сколько других способов изменить файл, но их как минимум несколько:
truncate
/ ftruncate
writev
, pwritev
, aio_write
(варианты write
) ioctl
, которые изменяют содержимое файла. Хуже того, они могут зависеть от файловой системы. Память
Узнайте о рисках нехватки памяти
Важно не допускать, чтобы работающий контейнер потреблял слишком много памяти хост-компьютера. На хостах Linux, если ядро обнаруживает, что памяти недостаточно для выполнения важных системных функций, оно генерирует исключение OOME или исключение нехватки памяти и начинает убивать процессы, чтобы освободить память. Уничтожению подлежит любой процесс, в том числе Docker и другие важные приложения. Это может эффективно вывести из строя всю систему, если будет убит неправильный процесс.
(...)
Ограничить доступ контейнера к памяти
-m or --memory= The maximum amount of memory the container can use. If you set this option, the minimum allowed value is 4m (4 megabyte).
Источники:
https://docs.docker.com/config/containers/resource_constraints/#memory