Что происходит в UNIX / Linux, когда программа больше, чем размер памяти?

Мне было интересно, как встроенные системы могут запускать программы, большие, чем размер памяти. Если бы у меня было 1 ГБ памяти, а программа была 1,5 ГБ, загрузила бы программа? Существуют ли системы, в которых используется только доступная память?

  • Нечетные кавычки Inode / Ram происходят в CentOS
  • буферный кеш и свободная память
  • Могу ли я использовать pmap для поиска использования памяти?
  • Сколько памяти теряется при запуске
  • Использование памяти в SunOS и Linux
  • Можно ли найти диапазон физических адресов модуля DIMM?
  • Как выводятся статистические данные с помощью `free -l`?
  • Использование памяти, вызванное MySQL или Apache?
  • 3 Solutions collect form web for “Что происходит в UNIX / Linux, когда программа больше, чем размер памяти?”

    1. Виртуальная память
    Система гарантирует, что процессы получат требуемый объем памяти, несмотря на то, что она больше физической памяти. Таким образом, ядро ​​выделяет пространство виртуальной памяти с максимальным размером физической памяти, которое может обрабатывать. Например, на 32-битной машине ядро ​​будет выделять в общей сложности 2 ^ 32, т.е. 4 ГБ виртуальных адресов для каждого процесса по умолчанию.
    2. Преодоление
    В Linux также есть что-то, называемое overcommit, в котором ядро ​​реагирует на запросы выделения памяти намного больше, чем доступная физическая память. Overcommitting сделает ядро ​​распределением виртуальной памяти без каких-либо гарантий соответствующего распределения физической памяти.
    3. Обмен местами
    Поскольку процесс, требующий, чтобы большая часть памяти начала фактически использовать большую часть памяти, ядро ​​начинает сканирование на неиспользуемые страницы памяти, а также страницы памяти процессов с более низким приоритетом или которые в настоящее время не работают. Он заменяет эти данные на место подкачки на вторичном устройстве хранения и освобождает эти страницы для вашего процесса. Это называется кражей страницы.

    Постоянно повторяя шаг 3, то есть заменяя страницы на вход и выход, ядро ​​удается показать процессу иллюзию запрошенной памяти, которая может быть больше, чем физически доступная память. Теперь, когда вы упомянули встроенную систему, мы должны решить, включен ли swap в системе или нет. Если «да», действуют три вышеуказанных пункта. Если нет, вышеуказанные 3 пункта по- прежнему применяются, но только ваш процесс, вероятно, либо сбой, либо может быть убит убийцей OOM (Out-Of-Memory). Существует также вероятность того, что ядро ​​использует убийцу OOM, чтобы убить другие процессы, чтобы освободить больше страниц для ваших процессов, если сочтет это подходящим. Однако это произойдет только в том случае, если нет места подкачки.

    Ничего особенного не произойдет, точно так же, как с любым процессом.

    Несмотря на распространенное мнение, программный код и данные не загружаются в целом при запуске программы. Загружается только небольшое подмножество, по существу, его точка входа (таблица эльфа, основная функция, начальный стек), и все остальное загружается по требованию, то есть выгружается. Это произойдет, когда код или данные, которые будут доступны, не находятся на странице в настоящее время в физической памяти.

    Точно так же, когда есть давление на ОЗУ, менее используемые страницы заменяются на диск на свободное место.

    Если размер доступной ОЗУ плюс размер области подкачки оказывается слишком маленьким для всех страниц запущенных программ, поведение зависит от ОС:

    • Linux и другие ОС, которые превышают виртуальную память, будут более или менее случайным образом убивать некоторые процессы на свободное место.

    • Непрекращающиеся ОС, такие как Solaris, не позволят запускать новые процессы и откажутся от резервирования новой памяти (malloc) из существующих процессов.

    Нет. Большинство его неиспользуемых страниц поменяются местами. Если нет свопа (или недостаточно), он будет убит, и вы получите предупреждение ядра.

    Linux и Unix - лучшая ОС в мире.