Как процесс обрабатывает ситуацию, когда это находит, что никакая память не использует?

Если Вы хотите любого затем, что Вы хотите OR, нет AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
  • Это будет соответствовать, если или или оба файла будут отсутствовать.
  • Ваш код только распечатает match если оба не существуют.

Но, Вы сказали:

Я на 110% уверен, что эти 2 файла не существуют. Я не получаю ошибок, это просто не входит если.

Таким образом, Ваш оператор противоречит себе. По крайней мере один из тех файлов должен существовать при выполнении того кода.

Если Вы хотите видеть как Ваш if оператор оценивает, выполните его с -x.

#!/bin/bash -x
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

Затем Вы будете видеть выполнение.

$ ./test.sh
+ [[ ! -f /etc/benchmarking/code ]]
+ [[ ! -f /etc/benchmarking/code.class ]]
+ echo match
match
$ 
2
03.10.2013, 14:05
2 ответа

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

Память, считающая в ядре Linux, пытается компенсировать программы, которые имеют тенденцию выделять больше памяти, чем они используют путем отслеживания объема памяти, на самом деле используемого процессами, и превышает возможности объема виртуальной памяти. Другими словами, объем виртуальной памяти, выделенной ядром, может превысить объем физической памяти и области подкачки, объединенной в системе. На практике это означает то выделение памяти через malloc() никогда не перестанет работать. В то время как это приводит к лучшему использованию физической памяти и области подкачки, оборотная сторона - то, что, когда сумма используемой памяти превышает объем физической памяти и доступной области подкачки, ядро должно так или иначе освободить ресурсы памяти для выполнения обязательства по выделению памяти.

Механизм ядра, который используется для исправления памяти для заполнения чрезмерных обязательств, называют out-of-memory-killer (OOM-уничтожитель). Обычно механизм начнет избавляться от процессов "жулика" памяти-hogging к свободному память для других процессов. Они поведение OOM-уничтожителя и памяти бухгалтерский алгоритм могут быть скорректированы через sysctl настройки или /proc/sys/vm. Если vm.panic_on_oom установка является ненулевой, ядро запаникует вместо этого, когда система исчерпает память.

Эвристика, используемая OOM-уничтожителем, может быть изменена через vm.oom_kill_allocating_task установка. По умолчанию OOM-уничтожитель просканирует через список задач и выберет задачу жулика задачи, использующую большую память для уничтожения. OOM-уничтожитель может также быть настроен для уничтожения задачи, которая инициировала условие из памяти.

Память ядра бухгалтерский алгоритм может быть настроена с vm.overcommit_memory установка. Значение по умолчанию должно выполнить некоторые слабые эвристические проверки перед сверхфиксированием, но память, бухгалтерский алгоритм может также быть установлен на строгий режим, в котором предел виртуального адресного пространства определяется значением vm.overcommit_ratio настройки согласно следующей формуле:

    virtual memory = (swap + physical memory * (overcommit_ratio / 100))

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

3
27.01.2020, 22:06

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

В то время как процесс мог в принципе уничтожить другой процесс, который будет чрезвычайно странным поведением. Процесс не имел бы никакого способа знать, какие процессы уничтожить и никакая гарантия, что он сможет захватить их память.

Если отсутствие памяти обнаруживается ядром вместо приложением, ядро может уничтожить некоторые процессы, на основе сложной эвристики (той, которая “не уничтожает sshd”).

0
27.01.2020, 22:06

Теги

Похожие вопросы