как DOS выполнял несколько процессов одновременно? - PullRequest
7 голосов
/ 28 декабря 2011

DOS всегда приводится в качестве примера однозадачной операционной системы.Однако, когда команда запускается через командную строку, управление переключается с оболочки на команду и затем переключается обратно на оболочку по завершении команды. Таким образом, одновременно выполняются два процесса.Что-то не так в моем понимании?

Ответы [ 3 ]

6 голосов
/ 28 декабря 2011

Нет, они не выполнялись одновременно.

COMMAND.COM имел резидентную часть, которая все время находилась в памяти, и переходную часть, которую можно выбросить по желанию.

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

Тот факт, что некоторый код остался резидентным, никоим образом не означает, что он "работает". Аналогичным образом обширные участки MS-DOS (ядра) постоянно оставались в памяти, но они не «работали», если не вызывались явно программой, не являющейся ядром.

Теперь есть , где можно было бы сказать, что может работать одновременно, в DOS было много программ TSR (прервать и остаться резидентными), которые могли бы запускаться, каким-то образом подключаться к прерыванию или DOS, а затем выходить, но выделение некоторой памяти (где был ее код).

Затем, в ответ на определенные события, этот код будет запущен. Возможно, одним из известных был Borland Sidekick, менеджер персональной информации, который мгновенно появлялся при нажатии клавиши.

4 голосов
/ 28 декабря 2011

Во время работы другого процесса процессор командной строки не работает: он приостановлен .Единственным «многозадачным» средством, доступным в DOS, было «Завершить и оставаться резидентом» .

2 голосов
/ 03 марта 2012

Неважно, используете ли вы 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 не вернулся, она заняла всю систему.

...