Неважно, используете ли вы DOS, Windows, Linux, BSD или что-то еще на этом процессоре, все одинаково. В то время у вас для целей этого обсуждения был один исполнительный блок, одно ядро, выполняющее инструкции, в основном по порядку. Не имеет значения, носят ли эти инструкции название DOS или Linux или windows. Просто инструкции.
Точно так же, как и сейчас, когда программа Windows решает прекратить свою работу, она пытается сделать это красиво с некоторой разновидностью вызова выхода. Когда программа linux завершает свою работу, она пытается сделать это с некоторой разновидностью вызова выхода из системы. И когда программа dos завершает свою работу, она пытается сделать это с некоторой разновидностью вызова выхода из системы. В оболочке, командной строке и т. Д. Linux, windows, dos, эта оболочка, которая является самой программой, загружается и ветвится в загруженной вами программе, и ваша программа некоторое время работает и, как уже упоминалось, пытается вернуться к предыдущей программе. с некоторым вкусом выхода. Также как когда оболочка, которую вы запускали, хочет вернуться, когда она завершится, она пытается сделать это прекрасно.
Как и в случае с Linux или Windows, тогда легче увидеть, что вы не запускаете ничего «одновременно» или «параллельно» по одному потоку инструкций за раз. (сегодня у нас есть несколько исполнительных блоков и / или ядер, которые предназначены для того, чтобы каждый выполнял что-то параллельно с чем-то, управляющим ими, поэтому сегодня вы можете фактически сказать «параллельно»). обрабатывает "вам нужно прерывание, которое переключает на вас другой код, обработчик прерываний, и этот обработчик может вернуться к той же программе, которая была прервана, или переключиться на другую. Вы можете указать любое имя, какое захотите, так, чтобы все выглядело так, как будто они работают одновременно. DOS, Linux, Windows и т. д., как правило, вы переключаетесь с одной «программы» или части кода на другую. Linux и Windows имеют свои ядра и операционную систему, которые вызывались во время прерываний, и у ДОСа это было также (у ДОСА ЕСТЬ, что, когда ДОС все еще жив, вы, скорее всего, дотрагиваетесь до машины каждые несколько дней (газовый насос, банкомат, и т.д.), dos также до сих пор используется при разработке и тестировании материнских плат / компьютеров x86, ничто не может конкурировать с ним как со встроенной платформой x86, ничто не имеет свободы в том, что dos должен делать то, что вы хотите, поэтому обновления BIOS до сих пор распространяется как программа дос). Обработчики прерываний дадут временные интервалы различным обработчикам bios и dos. переключение задач / процессов / потоков не было таким, как спроектировано или запланировано, как операционная система, такая как Linux или Windows, но она была там, для каждой версии DOS были правила, которым вы следовали, и вы могли переключать задачи (tsrs - это популярный термин). Просто во время разговора с дискетой, жестким диском и т. Д. Во всем процессе был задействован код, он не был похоронен в оборудовании, многие вещи происходили параллельно. ничем не отличается от драйвера контроллера жесткого диска в чем-то более сложном, например, в Linux или Windows. По крайней мере, один, может быть, некоторые клоны, не принадлежащие Microsoft, могут работать в многозадачном режиме.
Краткий ответ, когда у вас есть функция bob (), которая вызывает функцию ted ().
int bob ( int something )
{
...some code
...more code
ted();
...some code
...more code
}
bob () все еще работает? Они работают параллельно? Нет, код bob () все еще где-то здесь, ожидая, пока код ted () завершит свою работу и вернется. Пока ted () не падает, он будет возвращаться, и bob () может продолжать выполняться. Боб приостановлен, пока Тед выполняет. Не сильно отличается от оболочки или командной строки в более сложной операционной системе. Где-то есть какая-то функция, которая загрузила вашу программу в память и вызвала ее; это может быть ветвь или клон командной строки, которую вы выполняли, так что эта командная строка может продолжаться «параллельно» или клон может продолжаться параллельно. но концепция та же самая.
Отличие от тривиальной программы на C, подобной приведенной выше, заключается в том, что приведенный выше код можно считать разрешенным во время компиляции, когда загрузка и запуск программы определенно выполняется во время выполнения, в основном это самоизменяющийся код, программа изменяет память, а затем переходит к Это. Когда он возвращает этот код, очищает, раскручивает и завершает себя или ждет другой команды в зависимости от дизайна. DOS был просто очень очень прост: куча системных вызовов в сочетании с кучей вызовов BIOS и очень простая командная строка, которая могла загружать программы и выполнять небольшое количество других команд. У него не было никаких правил, которые вы не могли бы обойти (windows - это программа dos), если запущенная вами программа не хотела возвращаться (вы могли, по крайней мере, во время запуска linux из dos через промежуточную программу dos), что-то не так. Ваш вопрос о том, что происходит, когда программа завершается, ну, linux не вернулся, она заняла всю систему.