Операционные системы. Многозадачность и многопотоковость, страница 2

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

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

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

n содержимое счетчика команд

n содержимое регистров арифметического устройства

n состояние регистров, запрещающих отдельные виды прерываний

n причину прерывания

n признаки последней исполняемой команды (например, знак результата)

n ключ защиты памяти и многое другое.

Вся эта информация хранится в блоке управления программой - Program Status Words PSW.

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

n текущее PSW становится старым для прерывания этого типа

n новое прерывание для данного типа становится текущим.

После такого замещения текущее состояние содержит адрес программы обработки данного типа прерываний, которой соответственно, и приступает к работе.

Новые PSW                                                     Старые PSW

Прерывания
ввода - вывода
,Программные
прерывания
Прерывания
ввода - вывода
,Программные
прерывания
Внешние
прерывания
,Контроль 
аппаратуры
Внешние
прерывания
Текущее
PSW
Контроль 
аппаратуры
,Контроль программы
Контроль программы
 


Замещение PSW при обработке прерывания.

Существуют и другие схемы прерываний. Мы рассмотрели одну из наиболее распространенных. В частности, схема прерываний UNIX почти соответствует рассмотренной нами.

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

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

Диспетчеризация потоков.

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

Основным фактором, учитываемым при диспетчеризации, служит приоритет (execution priority) каждого потока. В Windows NT каждому потоку присваивается приоритет - от 0- до 31; чем больше число, тем выше приоритет. Приоритет 31 резервируется для особых случаев - например, прием данных в режиме реального времени. Приоритет 0 присваивается ОС некоторым второстепенным задачам, выполнение которых происходит в то время, когда никаких других готовых к исполнению задач нет. Например, Windows 95 “любит” в свободное время заниматься переуплотнением диска. Не замечали, что он сам начинает “жужжать”, если долго ничего не делать.

Большинство потоков работает с приоритетами от 7 до 11. Каждые несколько миллисекунд процессор просматривает все работающие в системе и готовые к выполнению потоки и выделяет процессорное время потоку с наивысшим приоритетом. Если потоков с одинаковым приоритетом несколько, время выделяется тому потоку, который ожидает дольше. Потоки с низким приоритетом никогда не вытесняют потоки с более высоким приоритетом. Когда потоки с более высоким приоритетом ожидают события, может выполняться менее приоритетный поток. Но естественно, не исключена ситуация, когда бездарно написанная программа может замедлить выполнение остальных работающих программ. Современные ОС способны динамически изменять приоритеты исполняемых потоков. Они автоматически увеличивают приоритет активных прикладных программ (на один - два пункта), тем самым увеличивая их “реактивность”. Кроме того, диспетчер временно повышает приоритет потока, получившего внешнее сообщение. Это обеспечивает более быструю обработку этого сообщения. Затем приоритет этого потока понижается до исходного уровня.