Виртуальные адреса необходимы для запуска нескольких программ на компьютере.
Предположим, что нет механизма виртуальных адресов. Компиляторы и редакторы ссылок генерируют макет памяти с заданным шаблоном. Инструкция (текстовый сегмент) размещается в памяти с адреса 0. Затем идут сегменты для инициализированных или неинициализированных данных (data и bss) и динамической памяти (куча и стек). (см., например, https://www.geeksforgeeks.org/memory-layout-of-c-program/ , если у вас нет представления о разметке памяти)
Когда вы запускаете эту программу он будет занимать часть памяти, которая больше не будет доступна другим процессам совершенно непредсказуемым образом. Например, адреса от 0 до 1M будут заняты, или от 0 до 16k, или от 0 до 128M, это полностью зависит от характеристик программы. Если теперь вы хотите одновременно запустить вторую программу, куда ее инструкции и данные попадут в память? Адреса памяти генерируются компилятором, который, очевидно, не знает во время компиляции, что будет свободной памятью. И помните, что адреса памяти (для инструкций или данных) как-то жестко запрограммированы в программном коде.
Вторая проблема возникает, когда вы хотите запустить много процессов и у вас заканчивается память. В таких ситуациях некоторые процессы выгружаются на диск и позже восстанавливаются. Но после восстановления процесс пойдет туда, где память свободна, и опять же, это что-то непредсказуемое и потребует изменения внутренних адресов программы.
Виртуальная память упрощает все эти задачи. При запуске процесса (или его восстановлении после перестановки) система просматривает свободную память и заполняет таблицы страниц, чтобы создать сопоставление между виртуальными адресами (управляемыми процессором и всегда неизменными) и физическими адресами (что зависит от свободной памяти на компьютер в данный момент).
2019: команда Powershell рассматривает возможность добавления поддержки &&
в Powershell - взвесьте все на этом GitHub PR
Попробуйте это:
$(command -arg1 -arg2 | Out-Host;$?) -and $(command2 -arg1 | Out-Host;$?)
$()
- это подвыражение, позволяющее указать несколько операторов внутри, включая конвейер. Затем выполните команду и передайте ее на Out-Host
, чтобы вы могли ее увидеть. Следующий оператор (фактический вывод подвыражения) должен вывести $?
, т.е. результат успеха последней команды.
Выражение $?
отлично работает для собственных команд (консольных exe'шников), но для команд оставляет желать лучшего. То есть $?
, похоже, возвращает $false
только тогда, когда команда сталкивается с ошибкой завершения. Похоже, что для $?
необходимо как минимум три состояния (не удалось, удалось и частично удалось). Так что если вы используете команды, то лучше подойдет следующее:
$(command -arg1 -arg2 -ev err | Out-Host;!$err) -and
$(command -arg1 -ev err | Out-Host;!$err)
Это вроде как все равно не работает. Возможно, что-то вроде этого было бы лучше:
function ExecuteUntilError([scriptblock[]]$Scriptblock)
{
foreach ($sb in $scriptblock)
{
$prevErr = $error[0]
. $sb
if ($error[0] -ne $prevErr) { break }
}
}
ExecuteUntilError {command -arg1 -arg2},{command2-arg1}
Предварительный просмотр Powershell 7 5 имеет их. Я не знаю, почему это было удалено без уведомления или объяснения. https://devblogs.microsoft.com/powershell/powershell-7-preview-5 / Это даст вывод обеих команд как вопрос, который требуют.
echo 'hello' && echo 'there'
hello
there
echo 'hello' || echo 'there'
hello