Если DOS является однозадачным, как многозадачность была возможна в старой версии Windows?

113

Я читал, что DOS - это однозадачная ОС.

Но если старые версии Windows (включая Windows 95?) Были просто оболочками DOS, как Windows могла бы работать как многозадачная ОС?

Arkonix
источник
8
Это называется упреждающей многозадачностью - support.microsoft.com/kb/117567
joeqwerty
20
Вы должны будете определить «старый» намного лучше, чем это. DOS + Windows 9x и DOS + Windows 3.x в «386 расширенном режиме» в этом отношении сильно отличались от DOS + Windows 3.x / 2.x в «Стандартном режиме» и «Реальном режиме». И, как намекает joeqwerty, было многозадачное сотрудничество, а также упреждающее. Об этом написаны целые книги, поэтому конкретный вопрос лучше.
JdeBP
5
@joeqwerty Самое удивительное ИМО в том, что Microsoft хранит документацию онлайн о столь старинном программном обеспечении. Есть даже статьи на расширенные темы о старых версиях MS-DOS ... Очень мило с их стороны, чтобы сохранить это.
NothingsImpossible
6
DOS не дает вам многозадачности. Вы все еще можете писать полностью многозадачные программы без помощи DOS, как это делали ранние версии Windows. Windows 95, безусловно, не просто «обертка» для DOS.
Boann
3
@NigelNquande Я действительно обнаружил, что MS неплохо справляется со старой документацией. Большинство их статей об устаревших КБ находятся в сети (например, случайная Windows 3.1 КБ , или документы по printутилите для Windows 2.1-3.0 или ansi.sys из MS-DOS 5.0), даже после их заявленного 12-месячного окончания Период отсрочки Он не так легко просматривается, как активная документация по продукту, вы должны быть конкретны в своих поисках.
Джейсон C

Ответы:

160

Windows 95

Windows 95 была гораздо больше, чем просто оболочка для MS-DOS . Цитируя Рэймонда Чена:

MS-DOS служил двум целям в Windows 95.

  • Он служил загрузчиком.
  • Он действовал как 16-битный уровень драйвера устройства.

Windows 95 фактически зацепила / перегрузила практически все MS-DOS, сохранив ее как слой совместимости, одновременно выполняя всю тяжелую работу. Также реализована вытесняющая многозадачность для 32-битных программ.


Pre-Windows 95

Windows 3.x и более ранние были в основном 16-разрядными (за исключением Win32s, своего рода уровня совместимости, который соединяет 16 и 32, но здесь мы будем игнорировать), в большей степени зависели от DOS и использовали только совместную многозадачность - это та, где они не заставляют работающую программу отключаться; они ждут, пока запущенная программа выдаст контроль (в основном, скажем «я закончил», сказав ОС запустить следующую ожидающую программу).

Многозадачность была кооперативной, как и в старых версиях MacOS (хотя в отличие от многозадачной DOS 4.x, в которой использовалась вытесняющая многозадачность). Задача должна была уступить ОС, чтобы запланировать другую задачу. Урожайность была встроена в определенные вызовы API, особенно в обработку сообщений. Пока задание обрабатывало сообщения своевременно, все было замечательно. Если задача перестала обрабатывать сообщения и была занята выполнением некоторого цикла обработки, многозадачности больше не было.

Архитектура Windows 3.x

Что касается того, как ранние программы Windows могли дать контроль:

В Windows 3.1 используется совместная многозадачность. Это означает, что каждое приложение, которое находится в процессе работы, периодически проверяет очередь сообщений, чтобы выяснить, запрашивает ли какое-либо другое приложение использование ЦП, и, если да, передать управление этому приложению. , Тем не менее, многие приложения Windows 3.1 будут проверять очередь сообщений только редко или не проверять ее и монополизировать управление процессором столько времени, сколько им требуется. Превентивная многозадачная система, такая как Windows 95, отнимает управление процессором у запущенного приложения и распределяет его среди тех, которые имеют более высокий приоритет в зависимости от потребностей системы.

источник

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

386 расширенный режим?

Примечание: были некоторые комментарии относительно 386 расширенного режима Windows 3.x, являющегося 32-разрядным, и поддерживающим вытесняющую многозадачность.

Это интересный случай. Подводя итог , связанный сообщение в блоге , 386 расширенный режим был в основном 32-разрядный гипервизор, который бежал виртуальных машин. Внутри одной из этих виртуальных машин работал стандартный режим Windows 3.x, который выполняет все перечисленное выше.

MS-DOS также будет работать внутри этих виртуальных машин, и, очевидно, они были преимущественно многозадачными - поэтому кажется, что гипервизор с расширенным режимом 386 будет распределять временные интервалы ЦП между виртуальными машинами (одна из которых работала нормально 3.x, а другая - MS). -DOS), и каждая виртуальная машина будет делать свое дело - 3.x будет работать совместно в многозадачном режиме, в то время как MS-DOS будет однозадачной.


MS-DOS

Сама DOS была однозадачной на бумаге, но она поддерживала программы TSR , которые оставались бы в фоновом режиме, пока не были вызваны аппаратным прерыванием. Далеко от истинной многозадачности, но не полностью однозадачной.


Все эти разговоры о битности? Я спросил о многозадачности!

Ну, строго говоря, битность и многозадачность не зависят друг от друга. Должна быть возможность реализовать любой многозадачный режим в любой битности. Однако переход от 16-разрядных процессоров к 32-разрядным процессорам также представил другие аппаратные функции, которые могли бы упростить реализацию упреждающей многозадачности.

Кроме того, поскольку 32-разрядные программы были новыми, было проще заставить их работать, когда они принудительно отключены - что могло привести к поломке некоторых устаревших 16-разрядных программ.

Конечно, это все домыслы. Если вы действительно хотите знать, почему MS не реализовала вытесняющую многозадачность в Windows 3.x (несмотря на расширенный режим 386), вам нужно будет спросить кого-то, кто там работал.

Кроме того, я хотел бы исправить ваше предположение, что Windows 95 была просто оболочкой для DOS;)

боб
источник
4
Очень хорошая рецензия. Если я правильно помню (класс разработки ОС был для меня много лет назад), Windows 9x перехватила прерывания по таймеру, чтобы задействовать свой собственный планировщик, как вы предложили в своем втором-последнем абзаце. Были и другие ОС поверх DOS, которые делали то же самое. Я хорошо помню это из AMX (ОС реального времени для промышленных приложений) и XINU (небольшая Unix / Posix-подобная ОС для образовательных целей), которые работали поверх DOS. (AMX мог запускать «голый металл» прямо из СППЗУ. Было гораздо проще тестировать / отлаживать при запуске в DOS. Это избавило вас от повторной записи СППЗУ для каждого теста.)
Тонни
@ Тонни Спасибо за подтверждение того, что эта схема возможна (и используется на практике). Можно предположить, что причина того, что Windows 1-3 не использовала вытесняющую многозадачность, заключается не столько в том, что они не смогли этого сделать (в MS-DOS 4 она была, хотя и не была выпущена), но скорее, это нарушило бы обратную совместимость с DOS. программы.
Боб
3
Mmmmhhh Рассматривая Windows 1-3: тот факт, что это была общая база кода для процессоров 8086 и выше, возможно, имел больше общего с этим. Правильная обработка ring0-3 была возможна только с 80286 и выше, и именно это Win9x использовал для реализации многозадачности. 4DOS и другие уже предоставили ограниченную многозадачность для DOS (80286 было необходимо, если я правильно помню). Вы даже можете запустить Win3 как отдельный процесс в 4DOS.
Тонни
1
Xinu действительно не работал поверх DOS. В конце концов, он начинался как операционная система LSI-11. Утверждение об отсутствии приоритетной многозадачности в DOS + Windows 3.x неверно. В 386 Enhanced Mode была предоставлена ​​VMM. И бессмыслица о 4DOS дает вам часто задаваемый ответ: 4DOS не является операционной системой . Заявления о том, что он обеспечил многозадачность, совершенно неверны.
JdeBP
2
PDP-8 поддерживал упреждающую многозадачность, и это был только 12-битный компьютер.
Давид25272
26

Он постоянно запускал одну программу, называемую windows. Тот распределял время процессора (и другие ресурсы) между различными программами.

Рассмотрим эту аналогию:

У вас есть офис, в котором может быть только один человек (этот человек называется «мистер или миссис ДОС»). Этот человек работает над одной вещью в то время. Например, он звонит одному человеку и начинает общаться с ним 24 часа в сутки.

Теперь замените этого человека мистером секретарем. (окна). Он будет звонить кому-то и все время с ним разговаривать (все еще одна задача). Затем через некоторое время другой человек скажет: «Я уже достаточно поговорил. Поговори с кем-нибудь и перезвони мне немного».

Мистер секретарь позвонит другому человеку. Общайтесь с этим, пока этот человек не скажет то же самое. Затем он позвонит следующему человеку, пока не окажется в конце списка людей, с которыми можно поговорить. В это время это начнется снова на вершине.

  • В техническом плане это называется кооперативной многозадачностью. Это требует, чтобы другой человек сказал, что у него достаточно времени процессора. Если человек этого не делает, тогда все разваливается.
  • Современные системы намного умнее. Включая упреждающую многозадачность. Подумайте о том, как секретарь поставил будильник и отключил другого человека через 5 минут. «Это мило, Джейн. Но мне нужно поговорить с Джо. Я перезвоню немного позже. - Нажмите».

Если вы добавите несколько процессоров, это станет еще сложнее. :)

Hennes
источник
1
Разве вы не имеете в виду совместную / не упреждающую многозадачность в своем первом пункте? Также, что интересно, в Windows 95 появилась вытесняющая многозадачность для 32-битных программ. Это была не столько оболочка для DOS, сколько операционная система, которая использовала DOS в качестве загрузчика, но заменила его основные части (достаточно для поддержки 16-битных / DOS программ).
Боб
Мистер или скучает, почему не доктор DOS?
gtrak
1
«Он постоянно запускал одну программу ... Эта программа распределяла процессорное время (и другие ресурсы) между различными программами». нельзя ли это сказать о любой операционной системе? Хотя вопрос подразумевает, что MS-DOS не мог. Я категорически против аналогий / метафор при использовании технических деталей технологии. Хорошо, теперь мы знаем, как работает какой-то гипотетический офис? Это на самом деле не объясняет ответ на вопрос.
Celeritas
13

В современной операционной системе операционная система контролирует все аппаратные ресурсы, а запущенные приложения хранятся в песочницах. Приложению не разрешен доступ к памяти, которую ОС не выделяла этому приложению, и оно не может напрямую обращаться к аппаратным устройствам на компьютере. Если требуется аппаратный доступ, приложение должно взаимодействовать через драйверы устройств.

ОС может применять этот элемент управления, поскольку он заставляет ЦП переходить в защищенный режим .

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

И эта последняя часть позволяет приложениям, таким как Windows 95, запускать многопоточную среду, даже если они в основном запускались из DOS.

DOS (Disk Operating System) была, на самом деле, не намного больше, чем система управления файлами. Он предоставил файловую систему, механизмы навигации по файловой системе, несколько инструментов и возможность запуска приложений. Это также позволило некоторым приложениям оставаться резидентными, например, драйверы мыши и эмуляторы EMM. Но он не пытался контролировать аппаратное обеспечение компьютера, как это делает современная ОС.

* Когда DOS был впервые создан в 70-х годах, защищенный режим не существовал в CPU. Только в середине 80-х годов процессор 80286 стал защищенным режимом.

Пит
источник
2
Имейте в виду, что в то время процессоры не имели таких вещей, как защищенный режим.
jwenting
1
@jwenting - хороший момент, я добавил примечание об этом
Пит
6

До Windows 3.x, которая была первой версией для многозадачных приложений DOS, были такие программы, как DesqView, которые могли бы делать то же самое. Например, если один запускает три сеанса DOS одновременно, то DesqView создаст четыре виртуальные машины. Каждый из трех сеансов DOS будет думать, что они «владеют» всей машиной, за исключением того, что ни один из них на самом деле не выполняет файловый ввод-вывод. Вместо этого версия DOS, работающая в каждом сеансе, будет исправлена ​​так, что она будет пересылать любые запросы для файлового ввода-вывода специальному сеансу, который был выделен для этой цели. Поскольку аппаратное обеспечение текстового режима ПК будет непрерывно отображать содержимое области памяти в виде символов; DesqView может позволить каждому сеансу иметь свой собственный виртуальный экран, отображая диапазон 0xB8000-0xB9FFF каждого сеанса в свою область ОЗУ, и периодически копировать область текущего приложения в физический экранный буфер. Графическая поддержка была намного сложнее, потому что 256 КБ ОЗУ на плате дисплея контролировалось с использованием 64 КБ адресного пространства, некоторых регистров ввода-вывода и некоторого «интересного» оборудования, которое требовало чтения и записи в определенных специфических последовательностях. В текстовом режиме, когда приложение записывало что-то в текстовый буфер, был записан, DesqView мог установить флаг, указывающий, что это должно быть скопировано на дисплей при следующем тикании таймера; только первая запись в текстовый буфер в данный момент времени потребует вмешательства DesqView; все остальные будут объединены до следующего таймера. потому что 256 КБ ОЗУ на плате дисплея контролировалось с использованием 64 КБ адресного пространства, некоторых регистров ввода-вывода и некоторого «интересного» оборудования, которое требовало чтения и записи в определенных определенных последовательностях. В текстовом режиме, когда приложение записывало что-то в текстовый буфер, был записан, DesqView мог установить флаг, указывающий, что это должно быть скопировано на дисплей при следующем тикании таймера; только первая запись в текстовый буфер в данный момент времени потребует вмешательства DesqView; все остальные будут объединены до следующего таймера. потому что 256 КБ ОЗУ на плате дисплея контролировалось с использованием 64 КБ адресного пространства, некоторых регистров ввода-вывода и некоторого «интересного» оборудования, которое требовало чтения и записи в определенных определенных последовательностях. В текстовом режиме, когда приложение записывало что-то в текстовый буфер, был записан, DesqView мог установить флаг, указывающий, что это должно быть скопировано на дисплей при следующем тикании таймера; только первая запись в текстовый буфер в данный момент времени потребует вмешательства DesqView; все остальные будут объединены до следующего таймера. DesqView может установить флаг, указывающий, что он должен быть скопирован на дисплей при следующей отметке таймера; только первая запись в текстовый буфер в данный момент времени потребует вмешательства DesqView; все остальные будут объединены до следующего таймера. DesqView может установить флаг, указывающий, что он должен быть скопирован на дисплей при следующей отметке таймера; только первая запись в текстовый буфер в данный момент времени потребует вмешательства DesqView; все остальные будут объединены до следующего таймера.

В отличие от этого, для виртуализации графического режима требуется, чтобы DeskView перехватывал каждую отдельную запись для отображения памяти или регистров ввода / вывода. Учитывая, что это замедляло бы запись в память примерно в 100 раз, а графическим программам приходилось записывать намного больше данных, чем текстовым программам, виртуализация большинства графических программ в реальном времени была непрактичной. Вместо этого для обработки графики использовалось любое приложение, не являющееся передним планом, которое пыталось сделать графическую паузу, пока оно не стало приложением переднего плана, а затем предоставило ему полный контроль над экраном. Когда управление переключается на другое приложение, DesqView пытается скопировать состояние всех графических регистров, а затем переключается. После возврата в графическое приложение DesqView восстановит сохраненное состояние.

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

Supercat
источник
Спасибо, что напомнили мне о DesqView. Я использовал его все время, но полностью забыл об этом.
Эммет
3

Многозадачность - это не что иное, как иллюзия одновременного запуска приложений. Это воспринимается как одновременное выполнение на вашем конце, но на самом деле процессы A, B и C совместно используют процессорное время в следующем порядке: A, B, C, A, B, C, A, B ... они просто включаются и очень быстро На самом деле нет двух процессов, запущенных одновременно.

Таким образом, вполне возможно сделать многозадачность MS-DOS, заставив ее приостановить один процесс, запустить следующий на короткий промежуток времени, приостановить этот, вернуться к первому и так далее.

Многозадачность - это просто умная функция, разработанная, когда процессоры стали достаточно быстрыми, чтобы продолжать вращаться в этих процессах и заставлять конечного пользователя казаться одновременно.

Для тех, кто помнит, игры все еще запускались на DOS4GW, потому что Windows была слишком медленной.

Дэн Хорват
источник
1
и по большей части, это все еще, как вещи работают в операционных системах и по сей день. Вот почему вы можете запускать 10 вещей "одновременно" на 4-ядерном процессоре, например.
jwenting
2
Дело не в том, что «процессоры стали достаточно быстрыми». На 286-м можно было запускать многопользовательские многозадачные операционные системы (такие как Coherent The Mark Williams, отличная ОС, представленная на ПК в 1983 году). Версии MS-DOS и Windows (не NT) вплоть до (включая «Миллениум») действительно были ужасны для любого объективного стандарта, даже для технических стандартов того времени, но как только MS-DOS была установлена ​​IBM как стандарт для ПК, Маркетинг и импульс Microsoft (не говоря уже о криминальном злоупотреблении их монопольным влиянием) эффективно исключали лучшую конкуренцию на очень долгое время.
Эммет
2
«Многозадачность - это просто умная функция, разработанная, когда процессоры стали достаточно быстрыми ...» Вы имеете в виду то, как компьютер управления Apollo был многозадачным ?
CVn
1
Когда я говорил «процессоры», я имел в виду серийные, а когда я говорил «многозадачность», я имел в виду многозадачность приложений для ПК. И, наконец, под «конечным пользователем» я подразумевал ребенка за ПК, а не космонавта. Тем не менее, слава за интересный комментарий.
Дан Хорват
0

Несмотря на то, что он может сосредоточиться только на одной задаче, он просто переходит от одной к другой. Таким образом, казалось, что это многозадачность, но на самом деле она просто фокусируется на 1, затем на другом, затем на другом и т. Д.

Вос
источник
Вы смешиваете многозадачность с многопроцессорными вычислениями . Быстрое переключение между несколькими задачами является многозадачным в компьютерном мире. Обычное определение не требует параллельного выполнения. Различные «старые версии Windows» выполняли многозадачность по-разному, в зависимости от того, в какой версии Windows, в каком режиме она работала, и была ли она вообще на базе DOS. (Windows NT 3.1 старше, чем DOS + Windows 95, и может работать с SMP.) Как я указывал в другом комментарии, на эту тему написаны целые книги. Это действительно не лучшее резюме 2 предложений.
JdeBP
@JdeBP ... Я знаю разницу между многозадачностью и многопроцессорностью, так как я все еще использую одноядерные процессоры! Компьютеры работают серийно. Истинная параллель будет видна только в квантовых вычислениях.
Тот
0

Одна вещь, которую я здесь не заметил, была довольно интересной:

Windows 3.0 не была упреждающей многозадачной системой, она работала как все версии MacOS вплоть до OS X - одно приложение должно было вернуться из вызова, прежде чем любое другое приложение могло предпринять какие-либо действия.

Однако, как напомнил мне комментатор, DOS-приложения были многозадачными. Это потому, что они не были записаны в «Совместно» многозадачность (это всегда должно быть встроено в системы, которые его используют).

В то время существовали программы под названием TSR (Terminate-Stay Resident), которые заменили сегодняшние драйверы устройств. Эти драйверы будут работать независимо - обычно в своем собственном потоке, вставляя себя в один из обработчиков событий ОС. Windows вообще не знал о них, они работали на более низком уровне.

На самом деле это были не приложения для Windows, а то, как выполнялась вся работа с потоками перед Windows 3.1, например, драйверы принтера, драйверы связи и т. Д.

Хотя Windows 3.1 была многозадачной, DOS - нет, но Windows 3.1 просто убрала Dos с пути и вступила во владение, когда она запускалась (тогда вы часто запускали Windows из командной строки DOS).

Билл К
источник
Windows 3.0 поддерживает вытесняющую многозадачность приложений DOS при работе на процессоре 386 или выше. Только приложения Windows были многозадачны совместно.
Жюль
О, это правильно - в то время я кодировал приложения для Windows и не думал о DOS. Это относилось к приложениям DOS по-другому - спасибо за указание на это.
Билл К
-8

Хороший вопрос. В MS-DOS ядро ​​было монолитным, то есть оно обрабатывало только одну задачу за раз по сравнению с новым современным ядром, которое было реализовано в Windows 9x и текущей версии. Вы можете проверить больше здесь .

javathunderman
источник
11
-1 Вы предполагаете, что монотонная ОС не может работать в многозадачном режиме - это совершенно неправильно. linux - ЗНАКОМНОЕ монотитное ядро ​​(между Линусом Торвальдсом и Эндрю Таненбаумом были знаменитые дебаты), но linux, очевидно, может выполнять несколько задач. вот ссылка, чтобы показать вам, что Linux является монолитным stackoverflow.com/questions/1806585/…
barlop
4
Монолитный не означает, что вы думаете, что он делает.
Турбьёрн Равн Андерсен