Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
System programming / Конспект лекций / Лекция 10 Многозадачность.doc
Скачиваний:
53
Добавлен:
08.05.2015
Размер:
62.46 Кб
Скачать

Лекция 10 Многозадачность и многопоточность

Общие сведения

Многозадачность (multitasking) – это способность операционной системы выполнять несколько программ одновременно. В основе реализации этого принципа на персональных ЭВМ лежит использование операционной системой аппаратного таймера для выделения отрезков времени (time sliced) для каждого из одновременно выполняемых процессов. Если эти отрезки времени достаточно малы, и машина не перегружена слишком большим числом программ, то пользователю кажется, что все эти программы выполняются параллельно.

Многопоточность (multithreading) – режим, при котором машинная программа содержит в себе параллельно исполняемые участки или процедуры (threads). Таким образом, механизм многопоточности дает возможность программе самой быть многозадачной.

Идея многозадачности не нова. Многозадачность реализуется на больших многопользовательских компьютерах типа мэйнфрэйм (mainframe), к которым подключены десятки, сотни терминалов. У каждого пользователя, сидящего за экраном такого терминала, создается впечатление, что он имеет эксклюзивный доступ ко всей машине. Кроме того, операционные системы таких компьютеров часто дают возможность пользователям перевести задачу в фоновый режим, где они выполняются в то время, как пользователь может работать с другой программой.

Персональные компьютеры на заре своей юности аппаратно не поддерживали многозадачность. Это было вполне оправдано. С одной стороны, стремление к дешевизне приводило к упрощенным аппаратным решениям. С другой стороны, пользователь и так получал в свое распоряжение все ресурсы компьютера, а работать с несколькими программами одновременно невозможно для обычного пользователя. Для решения другой задачи, пользователь мог выйти из текущей программы и загрузить новую.

Однако, со временем, работа на персональном компьютере стала просто требовать многозадачности. Например, представьте, что вам необходимо распечатать страниц 100 текста, да еще на матричном принтере. На это занятие уходит несколько часов. И если, при этом, компьютер не может делать ничего большего, как посылать информацию принтеру, то насколько утомительным будет этот процесс. А ведь еще совсем недавно именно так и печатались курсовые, дипломные и другие работы.

Вытесняющая многозадачность.

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

Схема обработки прерывания следующая:

  1. Работа основной программы пользователя.

  2. Возникновение прерывания.

  3. Сохранение параметров работающей программы (регистров процессора).

  4. Переход по адресу процедуры обработки прерывания.

  5. Выполнение процедуры обработки прерывания.

  6. Восстановление параметров работающей программы.

  7. Переход по адресу следующей команды основной программы.

Прерывания с более высоким приоритетом, в свою очередь, могут прервать обработку текущего прерывания и т.д.

Прерывания использовались для написания так называемых резидентных (terminate-and-stay-resident, TSR) программ. Данные программы позволяли писать драйверы клавиатуры, спулеры печати, копировальщики экрана, которые работали в фоновом режиме. Но порядок работы процессора оставался прежним – в конкретный момент времени процессор выполнял только одну программу, и только эта программа могла вернуть управление той, которую прервала. И, если происходил сбой в работе резидентной программы или при обработке прерывания, компьютер "зависал" и не давал возможности вернутся к прерванной программе.

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

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

Невытесняющая многозадачность.

16-и разрядная Windows уже стала поддерживать и вытесняющую многозадачность (non-preemptive multitasking). Такой тип многозадачности стал возможен благодаря основанной на сообщениях архитектуре Windows. Windows – программа может находиться в памяти и не выполняться до тех пор, пока не получила сообщение. Ранее, эти сообщения часто являлись прямым или косвенным результатом ввода информации пользователем с клавиатуры или мыши. Сейчас, механизм посылки сообщений широко используется и для обмена данными, инициации какого-либо действия приложения и т.п.

При всем при этом, Windows использовала вытесняющую многозадачность для выполнения DOS – программ, а также позволяла некоторым программам, например, для целей мультимедиа, получать аппаратные прерывания от таймера.

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

Частично преодолеть последнее ограничение, можно, опять таки используя таймер для периодической смене выполняемых программ. Другим решением по преодолению невытесняющей многозадачности является вызов функции PeekMessage. Обычно программа использует вызов функции GetMessage для извлечения сообщений из очереди. Однако, если в данный момент времени очередь сообщений пуста, то функция GetMessage будет ждать поступления сообщения в очередь, а затем возвратит его. Функция PeekMessage работает иначе – она возвращает управление программе даже в том случае, если сообщений в очереди нет. Таким образом, выполнение работы, требующей больших затрат времени, будет продолжаться до того момента, пока в очереди не появятся сообщения для данной или любой другой программы.