Разработка лабораторного практикума по алгоритмам диспетчеризации вычислений в операционной системе

Анализ образовательного стандарта по специальности 090303 "Информационная безопасность автоматизированных систем". Качество диспетчеризации и гарантии обслуживания. Экспериментальное исследование возможности внедрения разработанной лабораторной работы.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.12.2013
Размер файла 722,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

выбор для выполнения потока из очереди готовых потоков.

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

Алгоритмы планирования делятся на:

невытесняющие (non-preemptive), основанные на том, что активному потоку позволяется выполняться, пока он сам, по собственной инициативе не отдаст управление операционной системе для того, чтобы та выбрала из очереди другой готовый к выполнению поток;

вытесняющие (preemptive), в которых решение о переключении процессора с выполнения одного потока на выполнение другого потока принимается операционной системой, а не активной задачей.

Понятие очереди процессов

Распределение процессов между имеющимися ресурсами носит название планирование процессов. Одним из методом планирования процессов, ориентированных на эффективную загрузку ресурсов, является метод очередей ресурсов. Новые процессы находятся во входной очереди, часто называемой очередью работ - заданий (job queue).

Входная очередь располагается во внешней памяти, во входной очереди процессы ожидают освобождения ресурса -- адресного пространства основной памяти.

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

Процесс в состоянии ожидания завершения операции ввода - вывода находится в одной из очередей к оборудованию ввода - вывода, которая носит название devices queue.

При прохождении через компьютер процесс мигрирует между различными очередями под управлением программы, которая называется планировщик. (scheduler) Операционная система, обеспечивающая режим мультипрограммирования, обычно включает два планировщика -- долгосрочный (long term scheduler) и краткосрочный (short term scheduler/CPU scheduler).

Порядок работы:

Перехватывание прерывание 08h.

В MS-DOS переопределение стандартного прерывания производится следующим образом:

Получить адрес старого обработчика.

Установить новый обработчик.

Выполнить программу.

восстановить старый обработчик.

Получаем адрес старого обработчика. Таблица векторов прерывания находится с адреса 0000:0000 и имеет 256 элементов (по количеству прерываний). Каждый элемент таблицы - 4-ех байтный вектор - адрес процедуры обработчика.

Для получения адреса старого прерывания можно воспользоваться функцией Си: getvect.

Входной параметр - номер прерывания, в данном случае 0x08.

Выходной параметр - указатель на текущую процедуру обработчика прерывания.

Устанавливаем новый обработчик. Для установки адреса нового прерывания можно воспользоваться функцией Си: setvect.

Входные параметры:

номер прерывания, в данном случае 0x08;

имя процедуры или указатель на неё.

Выходных параметров нет.

Новый обработчик прерывания.

Основные действия, производимые новым обработчиком:

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

Сохранить адрес стека текущей задачи, регистры сохраняются автоматически (при использовании языков высокого уровня ).

Вызвать старый обработчик прерываний, во избежание «потери времени».

Вызвать менеджер процессов (Лабораторная работа №2), для определения процесса, на который необходимо переключиться.

Записать в регистры стека, адрес стека новой задачи.

Закончить обработчик, регистры восстанавливаются автоматически (при использовании языков высокого уровня).

Отключение прерываний в Си возможно с помощью функции disable() или в любом языке с помощью ассемблерной вставки: asm{cli}.

Адрес вершины стека определяется регистрами SS (сегмент стека, в данном случае идентичен, сегменту кода - регистр CS) и SP (смещение стека). Т.к. SS=CS=Сегмент_с_загруженной_задачей, то сохранять (но восстанавливать обязательно) SS необязательно, т.к. CS должен храниться в дескрипторе процесса. Доступ к этим регистрам в Си возможен с помощью предопределенных переменных _SS и _SP (и на запись и на чтение) или в любом языке с помощью ассемблерной вставки: asm{mov ваша_переменная,sp} на чтении, asm{mov sp, ваша_переменная} на запись.

Включение прерываний в Си возможно с помощью функции enable() или в любом языке с помощью ассемблерной вставки: asm{sti}.

Требования к отчету

Отчет должен содержать задание, текст программы и результаты прогонов программы.

Лабораторная работа № 2

Менеджер процессов.

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

Теоретические сведения:

Состояния процесса в вычислительной среде.

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

Различают следующие состояния процесса:

новый (new) - процесс только что создан.

выполняемый (running) - реализация процесса, команды программы выполняются в CPU.

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

готовый (ready) - имеются все ресурсы кроме процессора, процесс ожидает его освобождения.

завершенный (terminated) - процесс завершил свою работу, высвобождение всех ресурсов.

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

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

Операционную систему можно представить в виде определенного набора планировщиков процессов и распределителей ресурсов (мониторов-распределителей ресурсов, обеспечивающих виртуализацию при распределении эластичного ресурса) для обслуживания очередей процессов:

Процессор мультипрограммной ЭВМ по очереди предоставляется процессам.

Очереди существуют при обращении к каналам, внешним устройствам, наборам данных, модулям операционной системы.

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

Дисциплины распределения ресурсов подразделяются:

дисциплины планирования очередей к ресурсам, содержащие правила помещения процессов в очередь;

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

Основным конструктивным, согласующим элементом при реализации той или иной дисциплины диспетчеризации (распределения ресурсов) является очередь, в которую по определенным правилам заносятся и извлекаются запросы. На дисциплину формирования очередей влияют следующие факторы:

Информация о классах и приоритетах заданий и шагов заданий.

Информация о необходимости обращения к тем или иным устройствам, массивам данных (зафиксированных в операторах языка управления заданиями).

Соглашение о приоритете уровней запросов прерывания и прерывающих программ.

Соглашения в ВУ.

Используемые дисциплины обслуживания очередей.

Дисциплины формирования очередей разделяются на два класса: статический (приоритеты назначаются до выполнения задания) и динамический (приоритеты определяются в процессе выполнения пакета).

Стратегии обслуживания очередей.

. Первым пришел -- первым обслуживается (FCFS).

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

Когда процесс попадает в очередь готовых процессов, process control block присоединяется к хвосту очереди.

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

Пример: Пусть три процесса попадают в очередь одновременно в момент 0 и имеют следующие значения времени последующего обслуживания в CPU.

вариант 1: П1(24 мс), П2(3 мс), П3(3 мс);

вариант 2: П2(3 мс), П3(3 мс), П1(24 мс).

На рисунке приведены диаграммы Ганга очереди готовых процессов

вариант 1:

П1

П2

П3

WT=17 мс

WT1=0 мс

WT2=24 мс

WT3=27 мс

вариант 2:

П2

П3

П1

WT=3 мс

WT2=0 мс

WT3=3 мс

WT1=6 мс

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

. Стратегия наиболее короткой работы (SJF).

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

Пример: Пусть четыре процесса одновременно попадают в очередь готовых процессов и имеют следующие значения времени последующего обслуживания:

П1(6 мс), П2(8 мс), П3(7 мс), П4(3 мс)

На рисунке приведена диаграмма Ганга, построенная в соответствии со стратегией SJF.

П4

П1

П3

П2

WT=7 мс

WT4=0 мс

WT1=3 мс

WT3=9 мс

WT2=16 мс

Легко посчитать, что при использовании FCFS - стратегии среднее время ожидания для тех же процессов равно 10.25 мс, таким образом стратегия SJF снижает время ожидания очереди. Наибольшая трудность в практической реализации SJF заключается в невозможности заранее определить величину времени последующего обслуживания, так же существует риск отстранения выполнения длинных заданий при повышенной норме прибытия коротких заданий.

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

Приоритетное обслуживание.

Приоритет - информация, которая позволяет классифицировать место объекта среди других при каком-либо выборе. Способы определения приоритета:

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

меняющийся с течение времени приоритет, функция прошедшего времени ожидания, прошедшего времени обслуживания и т.п.

Описанные ранее стратегии могут рассматриваться как частные случаи стратегии приоритетного планирования. Эта стратегия предполагает, что каждому процессу приписывается приоритет, определяющий очередность предоставления ему CPU. Например, стратегия FCFS предполагает, что все процессы предполагает, что все процессы имеют одинаковые приоритеты, а стратегия SJF предполагает, что приоритет есть величина, обратная времени последующего обслуживания.

Приоритет -- это целое положительное число, находящееся в некотором диапазоне, например от 0 до 7, от 0 до 4095. Будем считать, что чем меньше значение числа, тем выше приоритет процесса.

Пример: П1(10 мс) с приоритетом 3, П2(1 мс) с приоритетом 1, П3(2 мс) с приоритетом 3, П4(1 мс) с приоритетом 4, П5(5 мс) с приоритетом 2.

На рисунке приведена диаграмма Ганга, располагающая процессы в очереди в соответствии со стратегией приоритетного планирования

П2

П5

П1

П3

П4

WT2=0 мс

WT5=1 мс

WT1=6 мс

WT3=16 мс

WT4=18 мс

Приоритеты определяются исходя из совокупности внутренних и внешних по отношению к операционной системе факторов.

Внутренние факторы:

требования к памяти

количество открытых файлов

отношение среднего времени ввода - вывода к среднему времени CPU и так далее

Внешние факторы:

важность процесса

тип и величина файлов, используемых для оплаты

отделение, выполняющее работы и так далее

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

Главный недостаток приоритетного планирования заключается в возможности блокирования на неопределенно долгое время низкоприоритетных процессов.

Известен случай, когда в 1973 году в Массачусетском технологическом институте MIT при остановке компьютера IBM 7094 в очереди готовых процессов были обнаружены процессы, представленные в 1967 и все еще не выполненные.

Для устранения отмеченного недостатка используются следующие методы:

Процессы, время ожидания которых превышает фиксированную величину, например 15 минут, автоматически получают единичное приращение приоритета.

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

Привелегиями пользуются короткие задания. Санкции против длинных заданий "смягчаются" за счет меняющегося приоритета.

"Карусельная" стратегия (Round Robin).

Round Robin стратегия применяется в системах разделения времени. Определяется небольшой отрезок времени, названный квантом времени (10..100 мс). Очередь готовых процессов рассматривается как кольцевая. Процессы циклически перемещаются по очереди, получая CPU на время, равное одному кванту. Новый процесс добавляется в хвост очереди. Если процесс не завершился в пределах выделенного ему кванта времени, его работа принудительно прерывается, и он перемещается в хвост очереди.

Пример: П1(24 мс), П2(3 мс), П3(3 мс), q=4 мс.

Диаграмма Ганга соответственно Round Robin стратегии для этого случая имеет вид:

П1

П2

П3

П1

П1

П1

П1

П1

WT1=0 мс

7

10

14

18

22

26

30

Свойства Round Robin стратегии сильно зависят от величины временного кванта q. Чем больше временной квант, тем дольше Round Robin стратегия приближается к FCFS стратегии. (для рассмотренного примера, если q>24 мс, то -> FCFS.) При очень малых значениях временного кванта Round Robin стратегия называют разделением процессора -- processor sharing. Теоретически это означает, что каждый из N процессов работает со своим собственным процессором, производительность процессора равна 1/N от производительности физического процессора.

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

Стратегия с использованием многоуровневой очереди.

Эта стратегия разработана для ситуации, когда процессы могут быть легко классифицированы на несколько групп, например, часто процессы разделяют на две группы: интерактивные (процессы переднего плана) и пакетные (фоновые).

Интерактивные и пакетные процессы имеют различные требования к краткосрочному планировщику, например по отношению ко времени отклика.

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

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

Работа процесса из очереди с более низким приоритетом может быть приостановлена, если в одной из очередей с более высоким приоритетом появился процесс.

В качестве примера организуется N очередей. Все новые запросы поступают в конец первой очереди. Первый запрос из очереди i поступает на обслуживание лишь тогда, когда все очереди от 1 до (i-1) пустые. На обслуживание выделяется квант времени tk. Если за это время обслуживание запроса завершается полностью, то он покидает систему. В противном случае недообслуженный запрос поступает в конец очереди (i+1)

После обслуживания из очереди i система выбирает для обслуживания запрос из непустой очереди с самым младшим номером. Таким запросом

может быть следующий запрос из очереди i или из очереди i+1 (при условии, что после обслуживания запроса из очереди i последняя оказалась пустой). Новый запрос поступает в первую очередь (i=1). В такой ситуации после окончания времени tk, выделенного для обслуживания запроса из очереди i, будет начато обслуживание запроса первой очереди. Если система выходит на обслуживание заявок из очереди N, то они обслуживаются либо по дисциплине FIFO (каждая заявка обслуживается до конца), либо по циклическому алгоритму. Данная система наиболее быстро обслуживает все короткие по времени обслуживания запросы. Недостаток системы заключается в затратах времени на перемещение запросов из одной очереди в другую.

2.6. Стратегия с использованием многоуровневой очереди с обратными связями.

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

Процессы первоначально попадают в очередь 0, где каждому из них предоставляется квант времени, равный 8 мс. Те процессы, которые не успели выполниться в течение этого времени, перемещаются в очередь 1. Процессы из очереди 1 начинают обрабатываться только тогда, когда очередь 0 становиться пустой. Те процессы, которые не выполнились в очереди 1 (q=16 мс) перемещаются в очередь 2. Процессы из очереди 2 будут обрабатываться только в том случае, если становятся пустыми очереди 0 и 1.

Размещено на http://www.allbest.ru

Рассмотренная стратегия является наиболее универсальной и сочетает в себе свойства всех рассмотренных раньше стратегий: FCFS, SJF, приоритетная, Round Robin, многоуровневая очередь.

В качестве примера приоритетная многоочередная дисциплина обслуживания. Вновь поступающие в систему запросы устанавливает не обязательно в первую очередь, а в очередь в соответствии с имеющимися приоритетами, которые определяются параметрами обслуживания процессов. Приоритетные многоочередные дисциплины обслуживания могут использовать обслуживание с абсолютным и относительным приоритетом. При обслуживании с абсолютным приоритетом приоритет определяется номером очереди, и первыми обслуживаются запросы, обладающие наивысшим приоритетом (из очереди с меньшим номером - запрос из очереди i-1 будет прерывать обработку запроса из очереди i)

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

Порядок работы:

1. Добавить в дескриптор процесса дополнительный атрибуты статус и приоритет.

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

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

2. Написать процедуру обработки очереди процессов согласно заданному алгоритму.

Приоритет определяет количество квантов времени выделяемых процессу;

Выбирается процесс с наибольшим приоритетом, приоритеты динамически меняются:

У активного уменьшается на 1, у процесса с наименьшим приоритетом увеличивается на 1.

У активного уменьшается на 1, у остальных процессов приоритет увеличивается на 1.

Требования к отчету

Отчет должен содержать задание, текст программы и результаты прогонов программы.

Лабораторная работа № 3

Загрузчик задач.

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

Теоретические сведения:

1. Форматы программных файлов

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

Указанные программные файлы имеют различный формат и загружаются по-разному, однако, когда загрузка завершена, структура распределенной для них памяти выглядит совершенно одинаково.

Программы, которые хранятся в файлах с расширением имени .com - это двоичный образ программы, состоящий из кода и данных. Образно говоря, com-файл содержит программу в "чистом" виде. Такая программа (как и exe-программа) может загружаться в любое место памяти. MS-DOS выполняет ее привязку к физическим адресам при загрузке с помощью установки сегментных регистров. Существенным ограничением com-программы является то, что она не может занимать больше одного сегмента (соответственно, стандартный com-файл не может иметь размер, превосходящий 64 Кбайта).

Программа второго типа (exe-программа) может иметь любой размер. В самом начале файла программы содержится заголовок (у файла com-программы заголовка нет). Этот заголовок используется операционной системой в процессе загрузки программы в память для правильной установки сегментных регистров. Заголовок exe-файла нужен только при загрузке; когда программа загружена и готова к работе, самого заголовка уже нет в памяти.

2. Процесс загрузки программ в память

Загрузка com- и exe-программ происходит по-разному, однако есть некоторые действия, которые операционная система выполняет в обоих случаях одинаково:

определяется сегментный адрес свободного участка памяти для загрузки программы (обычно MS-DOS загружает программу в младшие адреса памяти, если при редактировании не указана загрузка в старшие адреса);

создаются два блока памяти (и, следовательно, два блока MCB , описанные во второй главе) - блок памяти для переменных среды, а также блок памяти для PSP и программы;

в блок памяти переменных среды помещается путь к файлу программы;

заполняются поля префикса сегмента программы PSP в соответствии с характеристиками программы (количество памяти, доступное программе, адрес сегмента блока памяти, содержащего переменные среды и т. д.);

адрес области Disk Transfer Area (DTA ) устанавливается на вторую половину PSP (PSP:0080);

анализируются параметры запуска программы на предмет наличия в первых двух параметрах идентификаторов дисковых устройств. По результатам анализа устанавливается содержимое регистра AX при входе в программу. Если первый или второй параметры не содержат правильного идентификатора дискового устройства, то соответственно в регистры AL и AH записывается значение FFh.

А дальше действия системы по загрузке com- и exe-программ будут различаться.

Для com-программ, которые представляют собой двоичный образ односегментной программы, выполняется чтение файла программы с диска и запись его в память по адресу PSP :0100h.

Размер обычных com-программ, как мы уже говорили, не превышает 64 Кбайт, так как они состоят только из одного сегмента. Но, строго говоря, com-программы могут состоять и из нескольких сегментов. В этом случае они должны сами управлять содержимым сегментных регистров, используя в качестве базового адрес PSP .

2.1. Загрузка COM-программы

В процессе загрузки com-программы операционная система выполняет следующие действия:

сегментные регистры CS, DS, ES, SS устанавливаются на начало PSP ;

регистр SP устанавливается на конец сегмента PSP ;

вся область памяти после PSP распределяется программе;

в стек записывается слово 0000;

указатель команд IP устанавливается на 100h (начало программы) с помощью команды JMP по адресу PSP :100h.

3. Префикс программного сегмента PSP

Префикс программного сегмента всегда создается при загрузке программы в память и имеет следующий формат:

Программы могут получить из PSP такую информацию, как параметры командной строки при запуске, размер доступной памяти. Зная адрес PSP, легко найти сегмент области переменных среды и получить другую полезную информацию.

Формат блока PSP и описание назначения всех его полей приведены ниже:

Смещение, байт

Размер, байт

Имя поля

Описание

0

2

int20h

Двоичный код команды INT 20h (программы могут использовать эту команду для завершения своей работы)

2

2

mem_top

Нижняя граница доступной памяти в системе в параграфах

4

1

reserv1

Зарезервировано

5

5

call_dsp

Команда CALL межсегментного вызова диспетчера MS-DOS

10

4

term_adr

Адрес завершения (Terminate Address)

14

4

cbrk_adr

Адрес обработчика прерывания, который получает управление, если пользователь нажал комбинацию клавиш <Ctrl+Break>

18

4

crit_err

Адрес обработчика критической ошибки

22

2

parn_psp

Сегмент PSP программы, запустившей данную программу (программы-родителя)

24

20

file_tab

Таблица открытых файлов; если в этом поле находятся байты 0FFH, то таблица не используется

44

2

env_seg

Сегмент блока памяти, содержащего переменные среды

46

4

ss_sp

Адрес стека программы SS:SP

50

2

max_open

Максимальное количество открытых файлов

52

4

file_tba

Адрес таблицы открытых файлов

56

24

reserv2

Зарезервировано

80

3

disp

Диспетчер функций MS-DOS

83

9

reserv3

Зарезервировано

92

16

fcb1

Если первый аргумент командной строки содержит правильное имя файла, поле форматируется как стандартный блок FCB

108

20

fcb2

Заполняется для второго аргумента командной строки аналогично fcb1

128

1

p_size

Количество значащих символов в неформатированной области параметров, либо буфер обмена с диском DTA , назначенный по умолчанию

129

127

parm

Неформатированная область параметров, заполняется при запуске программы из командной строки

Для обращения к полям PSP мы определим тип данных PSP:

typedef struct

{

unsigned char int20h[2];

unsigned mem_top;

unsigned char reserv1;

unsigned char call_dsp[5];

void far *term_adr;

void far *cbrk_adr;

void far *crit_err;

unsigned parn_psp;

unsigned char file_tab[20];

unsigned env_seg;

void far *ss_sp;

unsigned max_open;

void far *file_tba;

unsigned char reserv2[24];

unsigned char disp[3];

unsigned char reserv3[9];

unsigned char fcb1[16];

unsigned char fcb2[20];

unsigned char p_size;

unsigned char parm[127];

} PSP ;

Используя поле parn_psp, можно определить адрес PSP родительской программы, то есть программы, запустившей вашу программу.

Поле term_adr содержит значение, полученное из таблицы векторов прерываний для прерывания INT 22h. Это адрес программы, которая получает управление, когда текущая программа завершает свою работу. Такой программой может быть, например, программа command.com .

Ваша программа может определить функцию, которая будет получать управление при завершении ее работы. Для этого она должна записать свой собственный адрес в ячейку таблицы векторов прерываний, соответствующую прерыванию INT 22h, а затем запустить другую программу. Поле term_adr блока PSP запущенной программы будет содержать адрес родительской программы. Когда основная программа завершит свою работу, MS-DOS восстановит адрес программы завершения в векторе прерывания INT 22h из поля term_adr блока PSP.

Поле cbrk_adr содержит адрес программы обработки прерывания, которое возникает, когда пользователь нажимает комбинацию клавиш <Ctrl+Break>. При запуске программы этот адрес переписывается из ячейки таблицы векторов прерываний, соответствующей прерыванию INT 23h .

Программа может устанавливать свою собственную функцию обработки прерывания по комбинации клавиш <Ctrl+Break>. Поэтому при завершении работы программы MS-DOS восстанавливает оригинальное значение из поля cbrk_adr.

Поле crit_err предназначено для восстановления содержимого вектора прерывания INT 24h (адреса обработчика критических ошибок).

Конечно, программы, составленные на языке С, не обязательно должны использовать PSP для доступа к параметрам командной строки и переменным среды. Для этого есть параметры функции main и набор функций типа getenv, putenv и т. п., предназначенных для работы со средой. Но блок PSP содержит и другую информацию, доступ к которой с помощью стандартных функций невозможен.

4. Определение адреса PSP

Очень просто сделать это в программах, составленных на языке ассемблера: при запуске программы адрес PSP передается ей через регистры DS и ES. То есть этот адрес равен DS:0000 или ES:0000 (для com-программ на PSP указывают также регистры CS и SS).

Программам, составленным на языке С, доступна глобальная переменная _psp типа unsigned int. Эта переменная содержит сегментный адрес PSP .

5. Запуск программ из программ

Ваша программа может при необходимости запустить другую exe- или com-программу.

Программа, составленная на языке ассемблера, запускает другую программу с помощью функции 4Bh прерывания INT 21h . Для выполнения той же задачи из программ, составленных на языке С, следует использовать разнообразные функции, входящие в состав стандартной библиотеки системы разработки.

Сначала рассмотрим процедуру запуска программы при помощи функции 4Bh прерывания INT 21h .

Перед вызовом прерывания вы должны загрузить регистры процессора следующим образом:

Регистр

Содержимое

AH

4Bh

AL

Код подфункции (0, 1, 2, 3, 5)

DS:DX

Указатель на текстовую строку в формате ASCIIZ , содержащую путь к запускаемой программе

ES:BX

Указатель на блок параметров EPB

После возврата из прерывания флаг переноса CF устанавливается в 0, если ошибок не было, и в 1 - при обнаружении ошибок. Если произошла ошибка, ее код записывается в регистр AX:

Код ошибки

Описание

1

Неверный код подфункции

2

Не найден файл запускаемой программы

3

Указанный путь не найден

4

Слишком много открытых файлов

5

Нет доступа

8

Нет памяти для загрузки программы

10

Длина блока среды больше 32 Кбайт

11

Неправильный формат запускаемого exe-файла

Функция 4Bh прерывания INT 21h имеет несколько подфункций:

Код

Описание

0

Загрузить и выполнить программу

1

Загрузить, но не выполнять программу

2

Загрузить, но не выполнять программу (недокументированная подфункция)

3

Загрузить программу как оверлей (не создавая при этом блок PSP )

5

Подготовить программу для выполнения

Опишем эти подфункции более подробно.

Загрузка и выполнение программы

Для функции 0 регистры DS:DX должны указывать на полный путь запускаемой программы в формате ASCIIZ (т. е. на текстовую строку, закрытую двоичным нулем). Блок параметров EPB (Exec Parameter Block ) в этом случае имеет следующий формат:

Смещение, байт

Размер, байт

Имя поля

Описание

0

2

seg_env

Сегментный адрес среды, которая создается родительской программой для запускаемой программы. Если в этом поле находится 0, то для запускаемой программы копируется среда родительской программы

2

4

cmd

Дальний адрес строки параметров для запускаемой программы. Эта строка должна иметь такой же формат, как и в PSP , т. е. в начале строки находится байт со значением, равным количеству символов в строке параметров, а затем - сама строка параметров

6

4

fcb1

Адрес блока FCB . Этот адрес будет записан в блок PSP со смещением 5Ch

10

4

fcb2

Адрес блока FCB . Этот адрес будет записан в блок PSP со смещением 6Ch

Запущенной программе доступны все файлы, открытые родительской программой.

Если родительская программа сама формирует среду для дочерней программы, она должна подготовить новую среду на границе параграфа и поместить значение сегментного адреса в поле seg_env блока EPB.

Загрузка программы без выполнения

Подфункции 1 и 2 прерывания INT 4Bh используются операционной системой MS-DOS для собственных нужд (это внутренние подфункции MS-DOS). Они также необходимы для создания программ-отладчиков, таких как, например, debug.com или td.exe. Мы приведем недокументированный формат блока EBP для этих функций.

Для подфункции 1 блок EBP имеет следующий формат:

Смещение, байт

Размер, байт

Имя поля

Описание

0

2

seg_env

Сегментный адрес среды, которая создается родительской программой для запускаемой программы. Если в этом поле находится 0, то для запускаемой программы копируется среда родительской программы

2

4

cmd

Дальний адрес строки параметров для запускаемой программы

6

4

fcb1

Адрес блока FCB . Этот адрес будет записан в блок PSP со смещением 5Ch

10

4

fcb2

Адрес блока FCB . Этот адрес будет записан в блок PSP со смещением 6Ch

14

4

ss_sp

В это поле после завершения работы запускаемой программы будет записано содержимое регистров SS:SP

18

4

entry_p

Адрес точки входа в загруженную программу, который нужно записать в регистры CS:IP при запуске программы

Формат блока EPB для подфункции 2:

Смещение, байт

Размер, байт

Имя поля

Описание

0

2

seg_env

Сегментный адрес среды, которая создается родительской программой для запускаемой программы. Если в этом поле находится 0, то для запускаемой программы копируется среда родительской программы

2

4

cmd

Дальний адрес строки параметров для запускаемой программы

6

4

fcb1

Адрес блока FCB . Этот адрес будет записан в блок PSP со смещением 5Ch

10

4

fcb2

Адрес блока FCB . Этот адрес будет записан в блок PSP со смещением 6Ch

Загрузка программного оверлея

Подфункция 3 используется для загрузки программных оверлеев . Оверлей загружается в адресное пространство родительской программы, поэтому MS-DOS не заказывает дополнительной памяти и не строит PSP . Формат EPB для этой подфункции:

Смещение, байт

Размер, байт

Имя поля

Описание

0

2

seg_env

Сегментный адрес, по которому загружается программа

2

4

reloc

Фактор перемещения. Для exe-программ обычно содержит то же значение, что и поле seg_env, для com-программ в этом поле находится значение 0

Подготовка программы для выполнения

Подфункция 5 используется для загрузки и предварительной подготовки программы к выполнению. Она впервые появилась в MS-DOS версии 5.0. Вы можете использовать ее вместо недокументированных подфункций 1 и 2.

Если программа, запущенная с помощью подфункции 5, попытается определить версию MS-DOS, ей будет предоставлен не истинный номер версии, а определенный с учетом действия драйвера setver.

Напомним, что с помощью драйвера setver MS-DOS может "обмануть" программу, сообщив ей, что работает MS-DOS, например, версии 3.31 или любой другой версии, указанной пользователем. Такая возможность требуется в тех случаях, когда программа была рассчитана на конкретную версию MS-DOS, но, тем не менее, способна работать и в новой версии.

Для подфункции 5 указатель, расположенный в регистрах DS:DX, должен указывать на структуру EXECSTATE, описанную ниже:

Смещение, байт

Размер, байт

Имя поля

Описание

0

2

Reserved

Зарезервировано

2

2

Flags

Тип программы: 0 - com-программа, 1 - exe-программа, 2 - оверлей

4

4

ProgName

Указатель на текстовую строку ASCIIZ , содержащую имя программы

8

2

PSP

Сегмент блока PSP новой программы

10

4

StartAddr

Стартовый адрес CS:IP новой программы

14

4

ProgSize

Общий размер программы с учетом размера блока PSP

Запуск программ из программ, составленных на языке С

Пользователи языка С имеют в своем распоряжении несколько возможностей запустить программу.

Самый простой способ - использовать функцию system . Эта функция может выполнить любую команду MS-DOS или любую программу, а также пакетный файл. Например:

system("FORMAT A:");

При использовании этой функции должен быть доступен файл command.com .

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

Bad command or file name

Код возврата в этом случае будет 0 - как будто все хорошо!

Другая возможности запустить программу - использовать функции spawn и exec.

Функция spawn и ее разновидности запускают программу как дочерний процесс. Функция exec загружает новую программу как оверлей на место старой и передает ей управление без возврата. После завершения дочерней программы управление будет передано программе command.com или программе, которая запустила родительскую программу.

Семейство функций spawn обеспечивает запуск дочерней программы, передавая ей родительскую или с специально сформированную среду. Кроме того, в файле process.h описаны параметры, которые можно передать функции spawn:

Параметр

Описание

P_WAIT

Выполнение родительской программы задерживается до завершения дочерней программы

P_NOWAIT

Родительская программа продолжает выполнение сразу после запуска дочерней программы. Этот параметр имеет смысл только для мультизадачных операционных систем

P_OVERLAY

Загружает программу как оверлей и передает ей управление. Этот режим соответствует функции exec в том смысле, что родительская программа не получит управления после завершения дочерней

Порядок работы:

1. Подготовить дескриптор процесса и занести в него все необходимые сведения.

2. Загрузить com программу в память и записать в дескриптор её местонахождение в памяти (сегмент кода, данных, стека).

Требования к отчету

Отчет должен содержать задание, текст программы и результаты прогонов программы.

Лабораторная работа № 4

Выгрузчик задач.

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

Теоретические сведения:

1. Завершение работы программы

Старые версии MS-DOS (до 2.0) требовали выполнения достаточно сложной процедуры для завершения программы. В начале работы программы было нужно сохранить адрес PSP , затем перед завершением работы поместить этот адрес в стек, записать туда же слово 0000h и выполнить команду дальнего возврата. Управление при этом передается в начало PSP, где находится команда INT 20h .

Для версий MS-DOS, начиная с 2.0, существуют более удобные способы.

С помощью прерывания INT 20h или функции 0 прерывания INT 21h обычно завершают свою работу com-программы. Учтите, что перед завершением работы программы регистр CS должен указывать на PSP .

Более удобна функция 4Ch прерывания INT 21h которую можно использовать с любым содержимым регистров.

Последний способ рекомендуется для повсеместного использования. Он позволяет передать родительской программе (например, программе command.com ) код завершения. Этот код доступен для анализа в пакетных файлах командой if errorlevel.

Примеры программ на языке ассемблера, приведенные в нашей книге, содержат директиву .EXIT . Эта директива завершает выполнение программы с помощью функции 4Ch и позволяет передать код завершения.

Если ваша программа запустила дочернюю программу и та завершилась, передав код возврата, то родительская программа может определить этот код с помощью функции 4Dh прерывания INT 21h . Эта функция возвращает код в регистре AX.

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

Существуют еще способы завершения работы программы, при которых программа (или ее часть) остается резидентной в памяти. Это вызов прерывания INT 27h или функции 31h прерывания INT 21h . О таком способе будет подробно рассказано в главе, посвященной резидентным программам.

Порядок работы:

1. Перехватывание прерывание 21h.

В MS-DOS переопределение стандартного прерывания производится следующим образом:

Получить адрес старого обработчика.

Установить новый обработчик.

Выполнить программу.

восстановить старый обработчик.

Получаем адрес старого обработчика. Таблица векторов прерывания находится с адреса 0000:0000 и имеет 256 элементов (по количеству прерываний). Каждый элемент таблицы - 4-ех байтный вектор - адрес процедуры обработчика.

Для получения адреса старого прерывания можно воспользоваться функцией Си: getvect.

Входной параметр - номер прерывания, в данном случае 0x08.

Выходной параметр - указатель на текущую процедуру обработчика прерывания.

Устанавливаем новый обработчик. Для установки адреса нового прерывания можно воспользоваться функцией Си: setvect.

Входные параметры:

номер прерывания, в данном случае 0x021;

имя процедуры или указатель на неё.

Выходных параметров нет.

Новый обработчик прерывания.

Основные действия, производимые новым обработчиком:

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

Освобождение дескриптора соответствующего процесса.

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

Закончить обработчик.

Требования к отчету

Отчет должен содержать задание, текст программы и результаты прогонов программы.

Приложение Б

Форма отчета:

Ф.И.О., группа студента

Дата

Подпись

Название лабораторной работы, №

Допуск

Выполнение

Зачет

Отчет должен содержать:

цель лабораторной работы;

вариант задания;

краткий конспект теоретической части;

описание процесса выполнения практических заданий;

результаты выполнения практических заданий;

полные ответы на вопросы.

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.