Виртуальное адресное пространство

В качестве описанной вами оболочки можно использовать следующий сценарий. Он сохраняет стандартный вывод и стандартные потоки ошибок данной команды в каталог состояния ($HOME/states), а также сохраняет количество неудачных запусков.

Если количество неудачных запусков команды превышает 10 (или любое другое число, заданное для флага командной строки -t), он выдаст некоторый вывод (в свой стандартный поток ошибок ).. Во всех остальных случаях вывод не производится. Сценарий завершается с тем же статусом выхода, что и данная команда.

Пример использования:

$ sh./script.sh -t 2 sh -c 'echo "this will fail"; cd /nowhere'
$ sh./script.sh -t 2 sh -c 'echo "this will fail"; cd /nowhere'
FAILED 2 times: sh -c echo "this will fail"; cd /nowhere
f88eff95bba49f6dd35a2e5ba744718d
stdout --------------------
this will fail
stderr --------------------
sh: cd: /nowhere - No such file or directory
END

Сам скрипт (опирается на md5sumиз GNU coreutils):

#!/bin/sh

statedir="$HOME/states"

if ! mkdir -p "$statedir"; then
        printf 'Failed creating "%s"\n' "$statedir" >&2
        exit 1
fi

max_tries=10

while getopts 't:' opt; do
        case "$opt" in
                t) max_tries=$OPTARG ;;
                *) echo 'error' >&2
                   exit 1
        esac
done

shift "$(( OPTIND - 1 ))"

hash=$( printf '%s\n' "$@" | md5sum | cut -d ' ' -f 1 )

"$@" >"$statedir/$hash".out 2>"$statedir/$hash".err
code=$?

if [ -f "$statedir/$hash" ]; then
        read tries <"$statedir/$hash"
else
        tries=0
fi

if [ "$code" -eq 0 ]; then
        echo 0 >"$statedir/$hash"
        exit 0
fi

tries=$(( tries + 1 ))
printf '%d\n' "$tries" >"$statedir/$hash"

if [ "$tries" -ge "$max_tries" ]; then
        cat >&2 <<END_MESSAGE
FAILED $tries times: $@
stdout --------------------
$(cat "$statedir/$hash".out)
stderr --------------------
$(cat "$statedir/$hash".err)
END
END_MESSAGE
fi

exit "$code"
0
22.12.2020, 13:44
2 ответа

1

Может различаться в зависимости от архитектуры, для x86/x86 -64 она есть.

  • 32-разрядная версия имеет 2 ГБ или 3 ГБ
  • 32-битное приложение на 64-битном ядре имеет 4 ГБ
  • 64-битное приложение (64-битное ядро ​​)имеет 2⁶³ ГБ (, что очень много ).

2

Нет

3

Все :текст, данные, BSS и др. Это не означает, что выделяется какая-либо физическая память. Иногда он лениво выделяется в ОЗУ, иногда он сопоставляется с оборудованием, иногда сопоставляется с вычислением.

0
18.03.2021, 22:41
  1. Каждый процесс получает столько виртуального адресного пространства, сколько ему нужно, вплоть до максимума, зависящего от архитектуры -и конфигурации -. Объем выделенной памяти можно настроить с помощью brk,sbrkи mmap.

    Максимум, доступный для x86 -64, в настоящее время составляет 128 ТиБ с четырьмя таблицами страниц уровня -, 64 ПиБ с пятью таблицами страниц уровня -. На 32 -бит x86 максимальное доступное значение зависит от конфигурации разделения ВМ ; он варьируется от 1 ГиБ до 3 ГиБ на процесс.

  2. Адресное пространство для каждого процесса содержит все, что процессу может потребоваться для доступа в памяти. Адресное пространство может быть выделено без отображения на физическую память.

1
18.03.2021, 22:41

Теги

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