Ограничение памяти, доступной программе
Решил я как-то заняться задачкой сортировки миллиона целых чисел при имеющейся памяти в 1 Мб. Но перед этим мне пришлось подумать над тем, как можно ограничить объём доступной памяти для программы. И вот, что я придумал.
Виртуальная память процесса
Перед тем, как окунуться в разные методы ограничения памяти, необходимо знать, как устроена виртуальная память процесса. Лучшая статья на эту тему — «Анатомия программы в памяти».
Прочитав статью, я могу предложить две возможности для ограничения памяти: уменьшить виртуальное адресное пространство или объём кучи.
Первое: уменьшение объёма адресного пространства. Это довольно просто, но не совсем корректно. Мы не можем уменьшить всё пространство до 1 Мб — не хватит места для ядра и библиотек.
Второе: уменьшение объёма кучи. Это не так-то просто сделать, и обычно так никто не делает, поскольку это доступно только через возню с компоновщиком. Но для нашей задачи это был бы более корректный вариант.
Также я рассмотрю другие методы, такие, как отслеживание использования памяти через перехват вызовов библиотек и системы, и изменение окружения программы через эмуляцию и введение «песочницы».
Для тестирования будем использовать небольшую программу по имени big_alloc, размещающую, и затем освобождающую 100 MiB.
Все исходники есть на github.
ulimit
То, о чём сразу вспоминает старый unix-хакер, когда ему нужно ограничить память. Это утилита из bash, которая позволяет ограничивать ресурсы программы. На деле это интерфейс к setrlimit.
Мы можем установить ограничение на объём памяти для программы.
Мы задали ограничение в 1024 кб — 1 MiB. Но если мы попытаемся запустить программу, она отработает без ошибок. Несмотря на лимит в 1024 кб, в top видно, что программа занимает аж 4872 кб.
Причина в том, что Linux не устанавливает жёстких ограничений, и в man об этом написано:
Есть также опция ulimit -d, которая должна работать, но всё равно не работает из-за mmap (см. раздел про компоновщик).
Для манипуляции программным окружением QEMU прекрасно подходит. У неё есть опция –R для ограничения виртуального адресного пространства. Но до слишком малых значений его ограничивать нельзя – не поместятся libc и kernel.
Тут -R 1048576 оставляет 1 MiB на виртуальное адресное пространство.
Для этого надо отвести что-то порядка 20 MB. Вот:
Останавливается после 100 итераций (10 MB).
В общем, QEMU пока лидирует среди методов для ограничения, надо только поиграться с величиной –R.
Контейнер
- использовать какой-нибудь docker
- использовать инструменты usermode из пакета lxc
- написать свой скрипт с libvirt.
- что-то ещё…
Но ресурсы будут ограничены при помощи подсистемы Linux под названием cgroups. Можно играться с ними напрямую, но я рекомендую через lxc. Я бы хотел использовать docker, но он работает только на 64-битных машинах.
LXC — это LinuX Containers. Это набор инструментов и библиотек из userspace для управления функциями ядра и создания контейнеров – изолированных безопасных окружений для приложений, или для всей системы.
- Control groups (cgroups)
- Kernel namespaces
- chroot
- Kernel capabilities
- SELinux, AppArmor
- Seccomp policies
Документацию можно найти на офсайте или в блоге автора.
Для запуска приложения в контейнере необходимо предоставить lxc-execute конфиг, где указать все настройки контейнера. Начать можно с примеров в /usr/share/doc/lxc/examples. Man рекомендует начать с lxc-macvlan.conf. Начнём:
Теперь давайте ограничим память при помощи cgroup. LXC позволяет настроить подсистему памяти для cgroup контейнера, задавая ограничения памяти. Параметры можно найти в документации по RedHat. Я нашёл 2:
- memory.limit_in_bytes — задаёт максимальное количество пользовательской памяти, включая файловый кэш
- memory.memsw.limit_in_bytes — задаёт максимальное количество в сумме памяти и свопа
Тишина — видимо, памяти слишком мало. Попробуем запустить из шелла
bash не запустился. Попробуем /bin/sh:
И в dmesg можно отследить славную смерть процесса:
Хотя мы не получили сообщение об ошибке от big_alloc насчёт malloc failure и количества доступной памяти, мне кажется, мы удачно ограничили память при помощи контейнеров. Пока остановимся на этом
Компоновщик
Попробуем изменить бинарный образ, ограничив доступное куче место. Компоновка – последний этап построения программы. Для этого используется компоновщик и его скрипт. Скрипт – описание разделов программы в памяти вместе со всякими атрибутами и прочим.
Пример компоновочного скрипта:
Точка означает текущее положение. Например, раздел .text начинается с адреса 0×10000, а затем, начиная с 0×8000000 у нас есть два следующих раздела: .data и .bss. Точка входа — main.
Всё круто, но в реальных программах работать не будет. Функция main, которую вы пишете в программах на С, реально не является первой вызываемой. Сперва совершается очень много инициализаций и подчисток. Этот код содержится в библиотеке времени исполнения С (crt) и распределено по библиотекам crt#.o в /usr/lib.
Подробности можно увидеть, запустив gcc –v. Сначала она вызывает ccl, создаёт ассемблерный код, транслирует в объектный файл через as и в конце собирает всё вместе с ELF при помощи collect2. collect2 — обёртка ld. Она принимает объектный файл и 5 дополнительных библиотек, чтобы создать конечный бинарный образ:
Всё это очень сложно, поэтому вместо написания собственного скрипта я отредактирую скрипт компоновщика по умолчанию. Получим его, передав -Wl,-verbose в gcc:
Теперь подумаем, как его изменить. Посмотрим, как бинарник строится по умолчанию. Скомпилируем и поищем адрес раздела .data. Вот выдача objdump -h big_alloc
Разделы .text, .data и .bss расположены около 128 MiB.
Посмотрим, где стек, при помощи gdb:
esp указывает на 0xbffff0a0, что около 3 GiB. Значит, у нас есть куча в
В реальном мире верхний адрес стека случайный, его можно увидеть, например, в выдаче:
Как мы знаем, куча растёт от конца .data по направлению к стеку. Что, если мы подвинем раздел .data как можно выше?
Давайте разместим сегмент данных в 2 MiB перед стеком. Берём верх стека, вычитаем 2 MiB:
0xbffff0a0 — 0x200000 = 0xbfdff0a0
Смещаем все разделы, начинающиеся с .data на этот адрес:
Опции -Wl и -T hack.lst говорят компоновщику, чтобы он использовал hack.lst в качестве сценария работы.
Посмотрим на заголовок:
И всё равно данные размещаются в памяти. Как? Когда я попытался посмотреть значения указателей, возвращаемых malloc, я увидел, что размещение начинается где-то после окончания раздела.data по адресам вроде 0xbf8b7000, постепенно продолжается с увеличением указателей, а затем опять возвращается к нижним адресам вроде 0xb5e76000. Выглядит так, будто куча растёт вниз.
Если подумать, ничего странного в этом нет. Я проверил исходники glibc и выяснил, что когда brk не справляется, то используется mmap. Значит, glibc просит ядро разместить страницы, ядро видит, что у процесса куча дыр в виртуальной памяти, и размещает в одном из пустых мест страницу, после чего glibc возвращает указатель с неё.
Запуск big_alloc под strace подтвердил теорию. Посмотрите на нормальный бинарник:
А теперь на модифицированный:
Сдвиг раздела .data к стеку с целью уменьшить место для кучи смысла не имеет, поскольку ядро разместит страницу в пустом пространстве.
Песочница
Ещё один способ ограничения памяти программы — sandboxing. Отличие от эмуляции в том, что мы ничего не эмулируем, а просто отслеживаем и контролируем некоторые вещи в поведении программы. Обычно используется в исследованиях в области безопасности, когда вы изолируете зловреда и анализируете его так, чтобы он не нанёс вреда вашей системе.
Трюк с LD_PRELOAD
LD_PRELOAD — специальная переменная окружения, заставляющая динамический компоновщик использовать в приоритете предзагруженные библиотеки, в т.ч. libc. Этот трюк, кстати, также используют и некоторые зловреды.
Я написал простую песочницу, перехватывающую вызовы malloc/free, работающую с памятью и возвращающую ENOMEM по исчерпанию лимита.
Для этого я сделал библиотеку общего пользования (shared library) c моими реализациями вокруг malloc/free, увеличивающими счётчик на объём malloc, и уменьшающими, когда вызывается free. Она предзагружается через LD_PRELOAD.
Моя реализация malloc:
libc_malloc — указатель на оригинальный malloc из libc. no_hook локальный флаг в потоке. Используется для того, чтобы можно было использовать malloc в хуках и избежать рекурсивных вызовов.
malloc используется неявно в функции account библиотекой uthash. Зачем использовать таблицу хешей? Потому, что при вызове free вы передаёте в неё только указатель, а внутри free неизвестно, сколько памяти было выделено. Поэтому у вас есть таблица с указателями-ключами и объёмом размещённой памяти в виде значений. Вот что я делаю в malloc:
mem_allocated это та статическая переменная, которую сравнивают с ограничением в malloc.
Теперь при вызове free происходит следующее:
Да, просто уменьшаем mem_allocated.
И что самое крутое — это работает.
Полный код библиотеки на github
Получается, что LD_PRELOAD – отличный способ ограничить память
ptrace
ptrace — ещё одна возможность для построения песочницы. Это системный вызов, позволяющий управлять выполнением другого процесса. Встроен в различные POSIX ОС.
Это основа таких трассировщиков, как strace, ltrace, и почти всех программ для создания песочниц — systrace, sydbox, mbox и дебаггеров, включая gdb.
Я сделал свой инструмент при помощи ptrace. Он отслеживает вызовы brk и меряет расстояние между изначальным значением break и новым, которое задаётся следующим вызовом brk.
Программа форкается и запускает 2 процесса. Родительский – трассировщик, а дочерний – трассируемый. В дочернем процессе я вызываю ptrace(PTRACE_TRACEME) и затем execv. В родительском использую ptrace(PTRACE_SYSCALL) чтобы остановиться на syscall и отфильтровать вызовы brk из дочернего, а затем ещё один ptrace(PTRACE_SYSCALL) для получения значения, возвращаемого brk.
Когда brk выходит за заданное значение, я выставляю -ENOMEM в качестве возвращаемого значения brk. Это задаётся в регистре eax, поэтому я просто перезаписываю его с ptrace(PTRACE_SETREGS). Вот самая вкусная часть:
Также я перехватываю вызовы mmap/mmap2, так как у libc хватает мозгов вызывать их при проблемах с brk. Так что когда заданное значение превышено и я вижу вызов mmap, я обламываю его с ENOMEM.
Но мне это не нравится. Это завязано на ABI, т.е. тут приходится использовать rax вместо eax на 64-битной машине, поэтому надо либо делать отдельную версию, или использовать #ifdef, или принудительно использовать опцию -m32 option. И скорее всего не будет работать на других POSIX-подобных системах, у которых может быть другой ABI.
Иные способы
Что ещё можно попробовать (эти варианты были отвергнуты по разным причинам):
Как ограничить использование оперативной памяти на вашем ПК
Настоящие геймеры используют лучший игровой браузер: Opera GX.
Opera GX — это специальная версия знаменитого браузера Opera, созданная специально для удовлетворения потребностей геймеров.
Opera GX, обладающая уникальными функциями, поможет вам получить максимум удовольствия от игр и просмотра веб-страниц каждый день:
- Ограничитель ЦП, ОЗУ и сети с «убийцей» горячих вкладок,
- Прямая интеграция с Twitch, Discord, Instagram, Twitter и мессенджерами,
- Встроенные элементы управления звуком и настраиваемая музыка,
- Пользовательские цветовые темы от Razer Chroma и принудительное создание темных страниц,
- Бесплатный VPN и блокировщик рекламы.
ОЗУ, сокращение от оперативно-запоминающее устройство (RAM — оперативная память), является одним из самых фундаментальных аппаратных компонентов компьютера, который определяет производительность вашей системы.
Объем оперативной памяти, которая у вас есть, контролирует производительность вашего компьютера, независимо от того, работает ли он с 20 вкладками и 5 открытыми приложениями, или компьютер, который дает сбой, когда вы пытаетесь смотреть YouTube, поэтому чем больше у вас оперативной памяти, тем лучше.
Поскольку оперативная память используется для любой задачи, требующей быстрого доступа к вычислительным ресурсам, ограничитель для вашего ПК звучит как хорошая идея для примерки.
Продолжайте читать и узнайте о лучших доступных решениях для уменьшения потребления оперативной памяти и получения быстрого и надежного ПК, которого вы заслуживаете.
Как уменьшить избыточное потребление оперативной памяти в Windows 10?
1. Отключите автозагрузку программ
Нажмите сочетание клавиш «Windows Key + R».
Введите в поле «msconfig» и нажмите Enter.

Перейдите на вкладку «Автозагрузка» и нажмите «Открыть диспетчер задач».

Щелкните правой кнопкой мыши приложения, которые вы не хотите запускать при запуске, и выберите «Отключить».

2. Настройте Windows 10 на максимальную производительность
Щелкните правой кнопкой мыши значок «Компьютер» и выберите «Свойства».
На правой панели выберите «Дополнительные параметры системы».

В разделе «Дополнительно» нажмите «Параметры».

Выберите «Обеспечить наилучшее быстродействие».

Нажмите «Применить», затем «ОК» для выхода.
3. Установите максимальное использование ОЗУ в Windows 10
Нажмите «Windows Key + R».
Введите в поле «msconfig» и нажмите Enter.

Перейдите на вкладку «Загрузка».

Щелкните «Дополнительные параметры».

Отметьте «Максимальный объем памяти».

Нажмите «ОК», чтобы сохранить изменения и перезагрузить компьютер.
4. Дефрагментируйте жесткие диски
Нажмите «Windows Key + R».
Введите в поле «dfrgui» и нажмите Enter.

В новом окне щелкните жесткие диски, которые нужно дефрагментировать, предпочтительно диск, на котором установлена Windows.
Нажмите «Оптимизировать» и следуйте инструкциям на экране, чтобы завершить процесс дефрагментации.

После завершения процесса перезагрузите компьютер.
5. Измените управление памятью
Нажмите сочетание «Windows Key + R».
Введите в поле «regedit» и нажмите Enter.

Перейдите по следующему пути:

Найдите «ClearPageFileAtShutDown», щелкните его правой кнопкой мыши и выберите «Изменить».

Измените значение на «1».

Нажмите «ОК» и перезагрузите компьютер.
6. Дополнительные решения
- Удалите нежелательное программное обеспечение. Например, нет необходимости иметь программу для чтения PDF, если у вас есть браузер, поскольку вы можете открыть любой файл PDF в любом браузере. То же самое и с видеоплеером, используйте только одну программу для одной цели.
- Используйте только один браузер. Если у вас несколько браузеров, используйте только один за раз.
- Используйте режим экономии заряда батареи. Если вы пользователь ноутбука, используйте его в режиме экономии заряда батареи, так как он автоматически уменьшит фоновую обработку.
7. Используйте отличный браузер в качестве альтернативы
Использование ОЗУ находится под контролем ОС, и нет никакого способа принудительно очистить содержимое.
Так почему бы не обратиться к лучшему браузеру?
Мы говорим о специальной версии браузера Opera, рекламируемой как первый в мире игровой браузер, поскольку его основная цель — гарантировать, что браузер никогда не будет мешать вашему игровому процессу.
Обратите внимание, что он включает в себя уникальные функции, которые помогут вам получить максимальную отдачу как от игр, так и от просмотра веб-страниц, но лучшей функцией является «GX Control».
Это сделало Opera GX известной и высоко ценимой, поскольку она позволяет вам устанавливать собственные ограничения на объем оперативной памяти, процессора и использования сети, которые использует ваш браузер.
И это изумительно.
Браузер предлагает интеграцию с различными службами, что позволяет легко получить к ним доступ с боковой панели.
От Twitch, Discord, YouTube и Spotify до Facebook Messenger, WhatsApp, Telegram, Instagram и Twitter.

Просто помните, что если регулярно отключать ненужные фоновые службы и процессы из вашей оперативной памяти, скорость и производительность улучшаются.
Если вам действительно не нужно открывать эти 20 вкладок, закройте их и оставьте только те, на которых вы действительно находитесь, например этот веб-сайт.
Вы беспокоитесь о том, что ваш компьютер не использует всю оперативную память?
Узнайте, как увеличить полезную оперативную память прямо сейчас, и вы увидите разницу.
Не стесняйтесь использовать раздел комментариев ниже, чтобы сообщить нам, что сработало для вас.
Как ограничить использование оперативной памяти на вашем ПК

баран , сокращение от оперативной памяти, является одним из самых фундаментальных аппаратных компонентов компьютера, который определяет производительность вашей системы.
Объем оперативной памяти контролирует производительность вашего ПК , независимо от того, есть ли у вас тот, который работает с 20 вкладками и 5 открытыми приложениями, или компьютер, который дает сбой, когда вы пытаетесь смотреть Netflix, поэтому чем больше у вас оперативной памяти, тем лучше.
Поскольку оперативная память используется для любой задачи, требующей быстрого доступа к вычислительным ресурсам, ограничитель для вашего ПК — хорошая идея, которую стоит попробовать.
Продолжайте читать и узнайте о лучших доступных решениях для уменьшения потребления оперативной памяти и получения быстрого и надежного ПК, которого вы заслуживаете.
Как уменьшить избыточное потребление оперативной памяти в Windows 10?
1. Отключить автозагрузку программ
- нажмите Клавиша Windows + R ярлык .
- Тип msconfig в поле и нажмите Enter.

- Перейти к Запускатьвкладка и нажмите на Откройте диспетчер задач.

- Щелкните правой кнопкой мыши приложения, которые не нужно запускать при запуске, и выберите Запрещать.

2. Настройте свою Windows 10 на максимальную производительность
- Щелкните правой кнопкой мыши Компьютер значок и выберите Характеристики.
- Выбирать Продвинутая системанастройки из правой панели.

- Под Представление, нажмите на Настройки.

- Выбирать Отрегулируйте для лучшей производительности.

- Нажмите на Применять, тогда ОК выйти.
- Запустить снова твой компьютер.
3. Установите максимальное использование ОЗУ в Windows 10
- нажмите Клавиша Windows + R.
- Тип msconfig в коробке и нажмите Входить.

- Перейти к Ботинок таб.

- Нажмите на Расширенные опции.

- Проверять Максимальный объем памяти.

- Нажмите ОК чтобы сохранить изменения и перезагрузить компьютер.
4. Дефрагментируйте жесткие диски
- нажмите Клавиша Windows + R.
- Тип dfrgui в поле и нажмите Enter.

- В новом окне щелкните жесткие диски, которые нужно дефрагментировать, предпочтительно диск, на котором установлена Windows.
- Нажмите на Оптимизировать и следуйте инструкциям на экране, чтобы завершить процесс дефрагментации.

- После завершения процесса перезагрузите компьютер.
5. Измените управление памятью
- нажмите Клавиша Windows + R.
- Тип regedit коробка и нажмите Входить.

- Перейдите по следующему пути: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Управление памятью

- Найдите ClearPageFileAtShutDown, щелкните его правой кнопкой мыши и выберите Изменить.

- Измените значение на 1.

- Нажмите ОК и перезагрузите компьютер.
6. Дополнительные решения
- Удалите нежелательное программное обеспечение. Например, нет необходимости иметь PDF ридер, если у вас есть браузер, так как вы можете открыть любой PDF-файл в любом браузере. То же самое и с видеоплеером, используйте только одну программу для одной цели.
- Используйте только один браузер. Если у вас несколько браузеров, используйте только по одному.
- Используйте режим экономии заряда батареи. Если вы пользователь ноутбука, используйте его в режиме экономии заряда батареи, так как это автоматически снизит фоновую обработку.
7. Используйте отличный браузер в качестве альтернативы
Использование ОЗУ находится под контролем ОС, и нет никакого способа принудительно очистить содержимое. Так почему бы не обратиться к лучшему браузеру?
Речь идет о специальной версии браузера Opera, рекламируемой как первая в мире игровая браузер, так как его основная цель — гарантировать, что браузер никогда не будет мешать игре на вашем ПК. опыт.
Обратите внимание, что он включает уникальные функции, которые помогут вам получить максимальную отдачу как от игр, так и от просмотра веб-страниц, но лучшей функцией является GX Control.
Это сделало Opera GX известной и высоко ценимой, так как она позволяет вам устанавливать собственные ограничения на объем оперативной памяти, процессора и использования сети вашим браузером. И это становится лучше.
Браузер предлагает интеграцию с различными службами, что позволяет легко получить к ним доступ с боковой панели. От Twitch, Discord, YouTube и Spotify до Facebook Messenger, WhatsApp, Telegram, Instagram и Twitter.

Opera GX
Требуется больше мощности для вашего ПК? Opera GX позволяет вам устанавливать ограничения на объем оперативной памяти, занимаемой вашим браузером!
Просто помните, что если регулярно отключать ненужные фоновые службы и процессы из оперативной памяти, скорость и производительность улучшаются.
Если вам на самом деле не нужно открывать эти 20 вкладок, закройте их и оставьте только те, на которых вы действительно находитесь, например этот веб-сайт.
Вы беспокоитесь о том, что ваш компьютер не использует всю оперативную память? Учить как увеличить полезную оперативную память прямо сейчас, и вы увидите разницу.
Не стесняйтесь использовать раздел комментариев ниже, чтобы сообщить нам, что сработало для вас. Нам хотелось бы узнать ваше мнение.
Opera против Firefox: характеристики и сравнение производительности Опера Браузеры
Opera и Firefox — довольно популярные веб-браузеры, и в сегодняшнем руководстве мы сравним их и посмотрим, какой из них лучше.Opera имеет некоторые уникальные функции повышения производительности, .

Le format du fichier sélectionné n'est pas pris en charge Руководства по навигации в Интернете Опера Гугл Хром
Одно видео на странице Web подразумевает использование определенных кодеков видео, которые могут быть устранены ошибками совместимости.Lorsqu'il невозможно зарядное устройство le média, votre navig.

Как ограничить использование оперативной памяти на вашем ПК Опера Баран
ОЗУ определяет производительность вашей системы, поэтому ограничение ОЗУ для вашего ПК — хорошая идея, которую стоит попробовать как можно скорее.К счастью, есть несколько способов изменить настрой.
Как уменьшить использование оперативной памяти в Windows 10
![]()
Если вы испытываете проблемы с производительностью — это означает, что текущее использование оперативной памяти влияет на ваше обычное использование ПК — тогда вам нужно беспокоиться. Если на вас влияет нехватка памяти, то, как утверждали другие, вам, вероятно, не хватает физической памяти на этой машине. Запуская Windows 10 на системах с 1 ГБ — 16 ГБ ОЗУ. Минимальный работоспособный уровень для систем x86 и x64 (где можно разумно ожидать, что что-то будет сделано относительно быстро) составляет около 4 ГБ.
На самом деле вы хотите 8 ГБ. Причина в том, что для систем с графическим интерфейсом требуется около 4 ГБ для бесперебойной работы, когда включены все функции. Если вы начнёте обрезать их обратно, то необходимый минимум снизится.
Всё это предполагает, что у вас есть достаточное количество свободного дискового пространства, доступного и на системном томе. Это необходимо из-за того, как Windows обрабатывает виртуальную память. Проблемный порог составляет около 12% от общего. Но, на самом деле это где-то около 8%, но «реальное» число варьируется в зависимости от того, что вы в данный момент делаете, и того, что дополнительно требуют фоновые системы. Итак, если вы используете 4 ГБ ОЗУ и система вместе с программами занимает 10% или менее 10% от оставшегося места на диске Windows (обычно это диск C:), вы должны ожидать медлительности в работе ПК (или это скоро произойдёт). Попробуйте переместить как можно больше ненужных или редко используемых данных с диска Windows на другой или внешний диск или в облачное хранилище.
Наконец, об оптимизации оперативной памяти. В дни Windows 7 имеет преимущества ручной оптимизации ОЗУ, но с Windows 10 это в значительной степени не нужно и непродуктивно. ОС теперь делает НЕВЕРОЯТНУЮ работу по использованию всей доступной физической памяти и как она должна правильно работать. Физическое ОЗУ, которое просто сидит "свободно", ничего не делает, а тратит время и деньги. Microsoft изменила свой подход к использованию оперативной памяти в Windows 10. Системы, разработанные и построенные для использования преимуществ многопоточности и истинной параллельной обработки. Если это не так, то эта возможность вам вообще не поможет и может создать некоторые узкие места, с которыми вы обычно не сталкивались в более ранних версиях ОС.