Кафедра автоматики и телемеханики

МИНИСТЕРСТВО ОБЩЕГО И ПРОФЕССИОНАЛЬНОГО

ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

Южно-Российский государственный технический университет (НПИ)

Кафедра автоматики и телемеханики

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

к лабораторным работам по курсу

“Системное программное обеспечение"

       
  Кафедра автоматики и телемеханики - student2.ru   Кафедра автоматики и телемеханики - student2.ru
 

Новочеркасск 2012

УДК 681.3

Рецензент канд. техн. наук А.В. Седов

Составители: Дереча С.В. , Фоменко Г.П., Онышко Д.А., Фугаров Д.Д.

Методические указания к лабораторным работам по курсу «Системное программное обеспечение» / Южно-Российский. государственный технический университет. Новочеркасск: ЮРГТУ, 2012. 61 с.

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

Предназначены для студентов 3–го курса специальности 2101 - “Управление и информатика в технических системах” дневной формы обучения.

© Южно-Российский государственный технический университет, 2012

© Дереча С.В. , Фоменко Г.П., Онышко Д.А., Фугаров Д.Д.

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

Использование стандартных функций и разработка собственных прерываний в ОС MSDOS

Продолжительность работы – 4 часа.

Цель работы: приобретение навыков использования стандартных и разработка собственных прерываний в ОС MSDOS.

Используемое оборудование: любой IBM РС-совместимый компьютер.

Используемое программное обеспечение: система программирования Turbo Pascal 7.0.

Подготовка к работе

Изучить по конспекту лекций и приведенной ниже литературе, следующие вопросы:

· аппаратные и программные прерывания в IBM PC;

· обращение к функциям MSDOS;

· разработка собственных прерываний в ОС MSDOS;

· дополнение к существующему прерыванию в ОС MSDOS;

· назначение и состав модуля DOS в Turbo Pascal 7.0.

Программа работы

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

2. Использование стандартных функций MSDOS. В соответствии с вариантом (табл. 2), заданным преподавателем, добавьте в текст основной программы операторы для вызова требуемой функции MSDOS и вывода полученных результатов на экран дисплея.

3. Разработка собственного программного прерывания. Добавьте к основной программе процедуру обработки собственного прерывания (номер прерывания задан в табл. 3), в котором будут выполняться те же действия, что и в п.2.

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

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

6. Сделайте выводы и оформите отчет по лабораторной работе.

табл. 1

№ варианта
Нумерация меню 1 - 4 F1 – F4 ABCD abcd АБВГ абвг F5 – F8

табл. 2

Функция MSDOS  
Вар. Номер прерыв Входные параметры Выходные параметры Сообщение
1. 12H   AX- размер памяти в кБ. Количество памяти в кБ.
2. 21H AX=3000H AL- основной номер версии. AH- вспомогат. номер версии. Номер версии ОС
3. 21H AH=2AH AL- день недели (0-вс. и т.д.). CX- год (1980-2099). DH- месяц (1-12). DL- день (1-31). Дата в формате: день.месяц.год
4. 21H AH=2CH CH- часы (0-23). CL- минуты (0-59). DH- секунды (0-59). Время в формате: час.минута.сек.
5. 21H AH=1BH AL- кол. сект. в кластере. CX- кол. байт в секторе. DX- кол. кластеров. Объем диска в байтах.
6. 21H AH=36H DL- номер диска (0; 1-А). AX- кол. сект. в кластере. BX- кол. своб. кластеров. CX- длина сектора в байтах. DX- кол. класт. на дорожке. Количество свободного места в байтах.
7. 21Н AH=09H DS:DX- нач.адрес строки с символом ‘$’ в конце.    

табл. 3

№ варианта
Номер прерывания

табл. 4



№ вар. Действие
1. Отсчет секунд и десятых долей с начала работы программы.
2. Выдача звукового сигнала с периодичностью 1 сек.
3. Изменение фона экрана с периодичностью 2 сек.
4. Изменение цвета символов с периодичностью 3 сек.
5. Пульсирующее окно с дискретностью изменения параметров 1/9 сек.
6. Перемещающееся окно с дискретностью изменения координат – 1/6 сек.
7. Вариант 3 + Вариант 4.

Внутренние регистры МП

В состав МП входят следующие блоки регистров (табл. 5):

табл. 5

  CS сегмент кода  
  DS сегмент данных Сегментные
  SS сегмент стека Регистры
  ES дополнительный сегмент  
  IP указатель команд  
  SP указатель стека  
  BP указатель базы Регистры
  SI индексный регистр  
  DI индексный регистр Общего
AX AH AL аккумулятор  
BX BH BL указатель базы Назначения
CX CH CL счетчик  
DX DH DL расширитель аккумулятора  
  F регистр флагов  

· блок сегментных регистров. 4 сегментных регистра используются для хранения 16-и разрядных сегментных адресов начала сегмента.

· IP – 16-и разрядный регистр указателя команд, в котором хранится адрес смещения команды в кодовом сегменте.

· регистры общего назначения (РОН) могут использоваться для хранения любой информации. Но, как правило, РОН AX, BX, CX и DX используются в основном для хранения данных и допускают раздельное использование их байтов, а регистры SP,BP,SI,DI используются, в основном, для хранения адресной информации. Кроме того, каждый из РОН имеет специальные функции, которые используются по умолчанию в некоторых командах.

· регистр флагов (признаков) F содержит признаки последней выполненной АЛУ операции.

Организация памяти

Память представляет собой последовательность байтов, каждый из которых имеет 20-и разрядный физический адрес (исполнительный адрес) в диапазоне 00000-FFFFF. Все пространство памяти представляется как набор сегментов, определяемых программным путем. Размер каждого сегмента составляет 64К. В каждый момент времени в памяти имеется 4 сегмента: CS, SS, DS, ES. Эти сегменты могут не пересекаться, могут частично пересекаться, а если содержимое сегментных регистров одинаково, то они полностью совпадают.

Для определения физического адреса памяти необходимо знать начальный адрес сегмента и внутрисегментное смещение. Физический адрес формируется сумматором блока шинного интерфейса МП (рис. 1) в соответствии со следующей формулой:

FA = SR*16 + ЕА, где:

FA – физический адрес;

SR – содержимое текущего сегментного регистра;

ЕА – эффективный адрес.

Кафедра автоматики и телемеханики - student2.ru

рис. 1

Сегментный адрес хранится в одном из сегментных регистров (16 старших разрядов 20-ти разрядного адреса памяти). При вычислении физического адреса памяти к содержимому сегментного адреса дописываются нули. Поэтому начальные адреса сегментов всегда кратны 16.

Смещение в сегменте формируется процессором в зависимости от его режима работы. Если процессор выполняет выборку команд из памяти, то сегментный адрес берется из регистра CS, а смещение – из указателя команд IP (рис. 2). Во всех остальных случаях смещение формируется из содержимого РОН, индексных или базовых регистров. Способ вычисления смещения является способом адресации.

Кафедра автоматики и телемеханики - student2.ru

рис. 2

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

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

SR:EA; где SR – содержимое сегментного регистра; EA – эффективный адрес.

Например, пусть DS=2000H, EA=3100H. Тогда:

Логический адрес: 2000:3100

Физический адрес: 2000 0 + 3100 = 23100

Иногда объем памяти измеряется в параграфах (§): 1§ = 16 байт.

Система прерываний МП

Прерывание – это событие, которое прерывает нормальный ход выполнения программы (процесса).

МП 80х86 имеет эффективную систему прерываний, в которой каждому прерыванию поставлен в соответствие код (от 0 до 255), который идентифицирует тип прерывания. В системах с МП 8086 различают внешние и внутренние прерывания.

Внешние прерывания – это прерывания, обусловленные каким-либо внешним событием. Сигнал свершения этого события поступает на один из двух входов МП:

INTR – вход маскируемого запроса прерывания от внешних устройств;

NMI – вход немаскируемого запроса прерывания.

Для разрешения обслуживания внешних прерываний используется выход подтверждения прерывания Кафедра автоматики и телемеханики - student2.ru .

МП имеет только один вход для запроса прерывания, а устройств, требующих обслуживания по прерыванию в системе может быть несколько. Для обслуживания прерываний от нескольких устройств используется специализированная МС - программируемый контроллер прерывания (ПКП). ПКП выполняет следующие основные функции:

· фиксирует запросы прерываний от внешних устройств;

· анализирует приоритеты поступивших прерываний;

· запрашивает у МП и, в случае подтверждения прерывания, выдает МП номер прерывания с наивысшим приоритетом.

При поступлении на один из входов ПКП IRQ0-IRQ7 запроса прерывания от внешнего устройства (рис. 3), ПКП фиксирует это прерывание, анализирует его приоритет и, если поступившее прерывание имеет наивысший в данный момент приоритет, выдает МП сигнал запроса прерывания INTR. При поступлении на вход INTR сигнала высокого уровня процессор заканчивает выполнение текущей команды и выдает сигнал подтверждения прерывания Кафедра автоматики и телемеханики - student2.ru , который поступает на соответствующий вход ПКП. В ответ на этот сигнал ПКП процессору информации не передает. Затем процессор вырабатывает еще один сигнал Кафедра автоматики и телемеханики - student2.ru , в ответ на который ПКП передает МП по шине данных байт, определяющий номер (тип) прерывания (0¸255). Этот номер однозначно связан с ПП обслуживания прерывания, на которую затем переходит процессор.

Кафедра автоматики и телемеханики - student2.ru

рис. 3

Прерывания по входу INTR можно разрешить или запретить(замаскировать), управляя состоянием флага I. Для этих целей имеются две специальные команды:

CLI – очистить флаг I=0 (запретить прерывания по входу INTR);

STI – установить флаг I=1 (разрешить прерывания по входу INTR).

Если пришел запрос прерывания, а прерывания были запрещены (I=0), то процессор не обслуживает этот запрос и не запоминает его.

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

Запрос прерывания по входу NMI запоминается в МП и имеет более высокий приоритет, чем прерывания по входу INTR.

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

1. прерывание при ошибке деления на “0”. Возникает в том случае, если частное слишком велико или делитель = 0 (тип 0);

2. прерывание по переполнению. Выполняется по команде INTO при условии, что установлен флаг переполнения V=1 (тип 4);

3. прерывание при трассировке. Возникает по окончании команды, если установлен флаг трассировки Т=1 (тип 1);

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

5. программные прерывания при выполнении двухбайтных команд INTn (где n – номер прерывания). Программные прерывания на самом деле ничего не прерывают, а являются удобным средством для доступа к стандартным подпрограммам (функциям ОС).

Рассмотрим взаимосвязь между типом прерывания и п/пр обслуживания прерываний.

Таблица векторов прерываний

Кафедра автоматики и телемеханики - student2.ru

рис. 4

Для обслуживания прерываний в системах с МП 8086 используется таблица векторов прерываний объемом 1Кбайт, расположенная с нулевого адреса памяти (0...3FF). На каждый тип прерывания отводится 2 слова (4 байта) памяти, в которых хранится логический адрес п/пр обслуживания прерывания. Слово с большим адресом загружается в сегментный регистр CS, а с меньшим адресом – в регистр указателя команд IP. Таблица векторов прерываний имеет вид представленный на рис. 4.

Таким образом, получив номер типа прерывания, процессор умножает номер типа прерывания на 4 и получает адрес вектора прерывания. При переходе к п/пр обслуживания прерываний МП сохраняет в стеке содержимое CS,IP,F. Затем CS и IP загружаются новым содержимым из вектора прерываний. Возврат из п/пр осуществляется по команде IRET, которая восстанавливает содержимое регистров CS,IP,F из стека.

Выполнение работы

К п. 1. Текст основной программы на языке Turbo Pascal может выглядеть следующим образом:

Begin

{сохранение старых и установка новых векторов прерываний в п.3,4}

Repeat

Repeat

Until Keypressed; {ожидание нажатия клавиши}

Ch:=ReadKey; {чтение кода нажатой клавиши}

Case Ch of

...{обработка нажатия клавиши }

End; {Case}

Until Ch=’E’; {выход из программы при нажатии клавиши ‘E’}

{восстановление ‘старых’ векторов прерываний в п.3,4}

End.

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

К п. 2. Turbo Pascal предусматривает возможность использования стандартных функций ОС MS DOS. Единственным механизмом обращения к функциям DOS является вызов программного прерывания. При возникновении программного прерывания, в большинстве случаев необходимо передать процедуре обработки прерывания некоторые параметры, в которых конкретизируется запрос нужной функции. Эти параметры, а также выходная информация (результат обработки прерывания) передаются из программы в процедуру и обратно через регистры ЦП. В составе модуля Dos Турбо-Паскаля для этих целей определен специальный тип данных:

Type

Registers=record

Case integer of

0: (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags: Word); {16-ти разр. регистры}

1: (AL,AH,BL,BH,CL,CH,DL,DH); {8-ми разр. регистры}

End; {Case}

End;

Этот тип имитирует регистры ЦП и дает возможность обращаться к ним как к 16-ти и 8-ми разрядным регистрам.

Для обращения к функциям DOS в Турбо-Паскале используются следующие процедуры:

процедура Intr -вызывает программное прерывание с заданным номером:

Intr( <№ прерывания: Byte>,<регистры: Registers>);

процедура MSDOS -инициирует прерывание с номером 33 ($21):

MSDOS(<регистры: Registers>).

Программное прерывание $21 дает доступ к большому количеству функций DOS (85 функций). Процедура MSDOS эквивалентна вызову Intr с номером $21.

Пример программы:

Uses dos;

Var r: Registers;

Begin

r.AH:=$30; {в AH заносится номер функции прерывания $21}

MSDOS(r); {вызов программного прерывания $21} или {Intr($21,r)}

Writeln (‘версия DOS:’, r.AL,’.’,r.AH);

End.

К п.3. Для использования собственных подпрограмм обработки прерываний необходимо выполнить следующие действия:

· разработать подпрограмму обслуживания прерывания;

· в начале работы программы сохранить старый вектор прерывания в переменной типа Pointer;

· задать новый вектор прерывания, указывающий на разработанную подпрограмму;

· вызывать программное прерывание нужно в соответствии с правилами, описанными в п.2 лабораторной работы;

· при завершении работы программы восстановить “старый” вектор прерывания.

Турбо-Паскаль предоставляет возможность разработки процедур обработки прерывания на языке высокого уровня. Процедура обработки прерывания должна содержать служебную директиву Interrupt (прерывание), например:

Procedure ProcInt (Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP:Word); Interrupt;

Begin

{действия по обработке прерывания}

End;

Директива Interrupt обеспечивает автоматическое сохранение содержимого регистров ЦП в стеке при вызове процедуры обработки прерывания и извлечение их из стека перед выходом из процедуры. Это необходимо для того, чтобы процедура обработки прерывания не искажала работу прерванной программы.

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

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

Процедура GetIntVec -возвращает вектор прерывания с указанным номером:

GetIntVec (<№ прерывания: Byte>,<вектор прерывания: Pointer>);

Процедура SetIntVec- устанавливает новое значение вектора прерывания:

SetIntVec (<№ прерывания: Byte>,<адрес входа в процедуру: Pointer>;

Для получения адреса входа в процедуру обработки прерывания необходимо использовать функцию Addr, например:

SetIntVec($61,Addr(ProcInt));

К п.4. Часто в программах для отсчета временных интервалов удобно использовать системный таймер, прерывание от которого формируется 18,2 раза в секунду. Перекрытие стандартного прерывания от таймера нецелесообразно, т.к. таймер в системе играет важную роль.

Для добавления своего кода к прерыванию от таймера удобно использовать пустое специальное прерывание BIOS $1C, которое вызывается прерыванием от таймера и ничего не делает, пока вы не напишете для него свой код. Вы должны изменить вектор прерывания $1C так, чтобы он указывал на процедуру в вашей программе. При завершении работы программы, вы должны восстановить исходное значение вектора (см. п.3.).

Любая процедура обработки прерывания (и особенно от таймера) должна выполняться быстро и не содержать длительных операций ввода-вывода. Поэтому основное назначение разработанного дополнения к прерыванию должно заключаться в подсчете и/или контроле числа обработанных прерываний от таймера. Прерывание от таймера обрабатывается каждые »0,055с. Таким образом, интервал времени в 1с, можно получить, обработав 18 прерываний от таймера. Например, используя глобальную переменную и изменяя ее значение при обработке прерывания (число обработанных прерываний от таймера), можно контролировать ее текущее значение в основной программе и там же выполнять необходимые действия (менять цвет фона, символов и т.д.).

К п.5. Значения векторов прерывания хранятся в оперативной памяти компьютера, т.е. представляют собой последовательность байтов. В языке Pascal для прямого доступа к любому участку оперативной памяти предварительно объявлены массивы Mem, MemW и MemL. Компоненты массива Mem – значения типа Byte; массива MemW – типа Word; массива MemL – типа Longint. Для обращения к элементам этих массивов необходимо указать индекс, который представляет собой абсолютный адрес ячейки памяти. Абсолютный адрес состоит из двух выражений типа Word; первое дает адрес начала сегмента, а второе задает смещение внутри этого сегмента. Эти выражения разделяются двоеточием. Например:

S:= Mem [$0000:$FFFF];

MemW [$4000:$0001]:=3578;

Начальные адреса процедур можно получить, как отмечалось выше, с помощью функции Addr, которая возвращает значение типа Pointer. Но тип Pointer нельзя распечатать с помощью стандартных процедур. Для преобразования типа Pointer используют функции Seg(X) и Ofs(X), которые возвращают значения типа Word соответственно для начального адреса сегмента и смещения в сегменте для объекта Х (переменной, процедуры или функции).

Контрольные вопросы

1. Что такое вектор прерывания?

2. Каким образом осуществляется обслуживание прерывания?

3. Каким образом используется стек при обслуживании прерывания?

4. Средства TP7.0, позволяющие использовать стандартные функции MSDOS.

5. Последовательность действий для задания собственного прерывания.

6. Расширение существующего прерывания.

7. Что такое таблица векторов прерываний ?

8. Какие внешние прерывания МП 8086 вы знаете ?

9. Какие внутренние прерывания МП 8086 вы знаете ?

10. Что такое программируемый контроллер прерываний ?

11. Какие и сколько аппаратных прерываний используется в IBM PC ?

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

Подготовка к работе

Изучить по конспекту лекций и приведенной ниже литературе, следующие вопросы:

· скан-коды клавиш в IBM PC;

· преобразование скан-кодов в коды символов: ASCII коды и расширенные коды;

· функции аппаратного прерывания клавиатуры 09Н;

· буфер клавиатуры;

· клавиши статуса и слово состояния клавиатуры;

· расширение стандартного прерывания клавиатуры 09Н.

Программа работы

1. Составить программу на языке Pascal, которая должна генерировать меню, соответствующее п.п.2 – 5 данной лабораторной работы.

2. Составить фрагмент программы, которая считывает скан-коды нажатия и отжатия заданной клавиши (табл. 7) из порта контроллера клавиатуры.

3. Составить фрагмент программы, которая выводит на экран содержимое указателей буфера клавиатуры до и после нажатия заданной клавиши (табл. 7), а также ASCII код нажатой клавиши.

4. Составить фрагмент программы, которая выводит на экран состояние клавиш статуса клавиатуры Shift, CapsLock и NumLock при нажатии на клавиши, указанные в табл. 8.

Примечание: если в приведенной таблице в одном задании встречаются одинаковые символы, например ‘A’,’A’ или ‘1’,’1’ подразумевается, что они должны набираться соответственно на латинском/русском языке или на основной/дополнительной клавиатуре.

5. Создайте свою подпрограмму прерывания от клавиатуры, которая будет являться расширением стандартного прерывания BIOS 09H. Ваша подпрограмма должна выполнять следующую последовательность действий:

· вызов процедуры ScanCode_Read модуля KeyBoard;

· вызов стандартного прерывания клавиатуры, вектор которого вы должны обменять с вектором прерывания, заданным в табл. 3;

· вызов процедуры Status_Print модуля KeyBoard;

· вызов процедуры Buffer_Print модуля KeyBoard.

6. Запустить программу, разработанную в предыдущем пункте, и выполнить последовательное нажатие клавиш, соответствующих символам в табл. 8. Зафиксировать содержимое буфера клавиатуры, слова состояния клавиатуры, указателей головы и хвоста буфера после ввода каждого символа. В основной программе ограничить число нажатий на клавиши – не более 7 раз (по числу заданных символов).

7. Повторить п.6, увеличив число нажатий до 20 раз. Запустить программу и нажать какую-либо клавишу указанное число раз. Объяснить происходящее.

8. Сделайте выводы и оформите отчет по лабораторной работе.

табл. 7

Номер варианта
Клавиша A T F1 Ctrl Enter C Tab
Скан-код клавиши
ASCII код клавиши

табл. 8

№ вар.
Набор символов A a a A 5% F1 Tab 2 » @ 3#№ BackSpace 6 ^ 4 $ 6 4 Esc F10 , < Б б / ? Y y Н н \ | Enter Z я ~ ` + = + * * ; : ж Ж Tab

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

Подготовка к работе

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

- реализация многозадачности в ОС Windows 2000;

- объекты ядра ОС Windows 2000;

- управление процессами и потоками средствами Win32 API;

- управление процессами и потоками средствами Delphi;

- классы приоритетов процессов и относительные приоритеты потоков;

- хронометраж процессов и потоков.

Программа работы

1. Получите у преподавателя вариант задания в соответствии с табл. 1. Запустите Delphi и создайте новый проект в отдельной рабочей папке.

2. Разместите на форме компоненты для отображения текущего состояния, управления приоритетом и работой процесса (приложения). Напишите необходимый код и запустите приложение на выполнение для проверки его работоспособности. Проверьте возможность изменения приоритета процесса при помощи заданного компонента (табл. 1).

3. Добавьте в проект поток, который при выполнении должен определять сумму десяти случайных целых чисел, увеличивая при этом счетчик числа выполненных суммирований за одну секунду. Разместите на форме компоненты для отображения текущего состояния, управления приоритетом, а также режима работы, создания, запуска на выполнение, останов и уничтожение потока. Запустите приложение на выполнение для проверки его работоспособности. Проверьте возможность изменения приоритета потока при помощи заданного компонента (табл. 1).

4. Разместите на форме компоненты, для обеспечения возможности работы с двумя потоками в приложении. Для этого скопируйте компоненты, размещенные на форме в п.3 и поместите их на форму, задав новые координаты. Запустите приложение на выполнение для проверки его работоспособности. Оцените производительность потоков и время их выполнения при раздельной и совместной работе в соответствии с заданными относительными приоритетами и классом приоритета процесса (табл. 1). Результаты занесите в форму, приведенную в табл. 2.

5. Запустите диспетчер задач Windows и повторите выполнение пп.2-4, следя за общим количеством процессов и потоков в системе, загрузкой центрального процессора. Зафиксируйте и объясните полученные результаты.

6. Создайте новое приложение, которое обеспечивает запуск двух экземпляров разработанного в пп. 1-4 приложения. Приложение должно обеспечивать отображение информации о вновь созданных процессах – идентификаторы процессов и их главных потоков, режимы доступа, работы и т.д. Оцените время выполнения процессов и потоков при их совместной работе в соответствии с заданными относительными приоритетами и классами приоритетов процессов (табл. 2). Результаты занесите в форму в соответствии с табл. 2.

7. Оформите отчет по лабораторной работе, который должен содержать:

- название и цель лабораторной работы;

- программу работы;

- оконные формы разработанных приложений;

- результаты оценки производительности потоков;

- исходные тексты разработанных модулей.

Выполнение работы

К п.1. При помощи программы Проводник необходимо создать рабочую папку проекта в своем каталоге, например G:\DSV\SPO\3-1\MYFAMILY\LAB1, и затем запустить Delphi. После загрузки программы на экране появится оболочка среды с заготовкой приложения Windows. Затем следует сохранить проект в ранее созданной папке проекта. Для этого нужно выбрать пункт меню File½Save Project As…, и в появившемся диалоговом окне установить путь к файлам модулей проекта (расширение *.pas) и основному файлу проекта (расширение *.dpr).

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

Кафедра автоматики и телемеханики - student2.ru

рис. 1 Внешний вид основного окна приложения

К п.2. Задайте подходящее значение для свойства Caption формы Form1, а свойство BoderStyle установите в значение bsDialog (диалоговое окно). После этого разместите на форме компонент Panel1 (панель), задайте свойству Align значение alTop и удалите значение свойства Caption.

Затем последовательно разместите на панели указанные ниже компоненты, и после размещения каждого из них задавайте свойству Align компонента значение alTop:

- Label1 (Caption = Состояние процесса);

- StringGrid1 (ColCount = 2, Enabled = False, FixedCols = 0, FixedRows = 0, RowCount = 4);

- Label2 (Caption = Приоритет процесса);

- TrackBar1(Max = 4, Position = 2).

МеткиLabel1 и Label2 отображают назначение соответственно компонентов StringGrid1 (таблица) и TrackBar1(ползунок).

Первый из них используется для отображения статистической текстовой информации о состоянии процесса, поэтому, для вывода названий параметров процесса в левой колонке таблицы StringGrid1 создайте обработчик события OnCreate формы TForm1, который должен содержать следующие операторы:

procedure TForm1.FormCreate(Sender: TObject);

begin

StringGrid1.Cells[0,0]:='Идентификатор процесса';

StringGrid1.Cells[0,1]:='Время создания процесса';

StringGrid1.Cells[0,2]:='Время работы процесса';

StringGrid1.Cells[0,3]:='Класс приоритета процесса';

…………

end;

Второй компонент – ползунок – используется для задания или изменения класса приоритета процесса (табл. 5). При выполнении лабораторной работы не рекомендуется использовать класс приоритета для процессов реального времени - REALTIME_PRIORITY_CLASS, поэтому TrackBar1 должен иметь пять фиксированных позиций. По умолчанию Delphi присваивает процессу класс приоритета NORMAL_PRIORITY_CLASS, поэтому первоначально ползунок должен быть установлен на второй позиции.

Для изменения класса приоритета процесса создайте обработчик события OnChange для TrackBar1, который в зависимости от положения ползунка будет изменять класс приоритета процесса:

procedure TForm1.TrackBar1Change(Sender: TObject);

var ClassPriority: integer;

begin

case TrackBar1.Position of

0: ClassPriority:=IDLE_PRIORITY_CLASS;

// 1: ClassPriority:=BELOW_NORMAL_PRIORITY_CLASS;

1: ClassPriority:=$4000;

2: ClassPriority:=NORMAL_PRIORITY_CLASS;

// 3: ClassPriority:=ABOVE_NORMAL_PRIORITY_CLASS;

3: ClassPriority:=$8000;

4: ClassPriority:=HIGH_PRIORITY_CLASS;

end;

SetPriorityClass(GetCurrentProcess,ClassPriority);

end;

В Delphi 6.0 не учтены два новых класса приоритетов процессов добавленных в Windows 2000: BELOW_NORMAL_PRIORITY_CLASS и ABOVE_NORMAL_PRIORITY_CLASS, поэтому для задания приоритета необходимо использовать конкретные значения констант. Для получения свойства Handle текущего процесса и установки его класса приоритета используются соответственно функции Win32 GetCurrentProcess и SetPriorityClass, более подробную информацию о них можно получить в разделе Windows SDK справочной системы Delphi.

Затем разместите на текущей панели кнопку Button1 (Caption = “Закрыть”) и создайте для нее обработчик события OnClick для обеспечения возможности выхода из программы:

procedure TForm1.Button1Click(Sender: TObject);

begin

Close;

end;

Для мониторинга текущего состояния процесса и порожденных им потоков разместите на панели компонент Timer co страницы System. Компонент Timer является невизуальным, то есть он не виден на форме во время выполнения программы. Компонент таймер работает следующим образом: через заданное число миллисекунд, которое определяется свойством Interval, генерируется событие OnTimer. В обработчике данного события нужно поместить код, который будет выполняться с заданной периодичностью. При выполнении лабораторной работы рекомендуется установить интервал таймера в 1 сек. (1000 мс).

procedure TForm1.Timer1Timer(Sender: TObject);

var STime: TSystemTime;

CrTime,ExTime,KrTime,UsTime: TFileTime;

begin

StringGrid1.Cells[1,0]:=IntToStr(GetCurrentProcessID);

StringGrid1.Cells[1,3]:=IntToStr(GetPriorityClass(GetCurrentProcess));

if GetProcessTimes(GetCurrentProcess,CrTime,ExTime,KrTime,UsTime) then begin

if FileTimeToSystemTime(CrTime,STime) then

StringGrid1.Cells[1,1]:=DateTimeToStr(SystemTimeToDateTime(STime));

if FileTimeToSystemTime(UsTime,STime) then

StringGrid1.Cells[1,2]:=TimeToStr(SystemTimeToDateTime(STime));

end;

……………

end;

Для получения идентификатора и класса приоритета процесса используются соответственно функции Win32 GetCurrentProcessID, GetPriorityClass. Для получения информации о времени создания, завершения, времени работы в режимах ядра и пользователя используется функция Win32 GetProcessTimes, которая возвращает перечисленные значения в формате времени TFileTime. Для отображения времени используется три промежуточных преобразования форматов времени:

- TFileTime в формат TSystemTime– функция FileTimeToSystemTime;

- TSystemTime в формат TDateTime – функция SystemTimeToDateTime;

- TDateTime при помощи функций DateTimeToStr и TimeToStr преобразуем соответственно в строки символов времени-даты создания и времени работы процесса в пользовательском режиме

TDateTime является внутренним форматом представления времени в Delphi. Тип TDateTime хранится в вещественной переменной типа Double, целая часть которой соответствует количеству дней, прошедших с 30 декабря 1899 года, а дробная – части текущего дня (6.00 ® 0.25, 12.00 ® 0.5, 18.00 ® 0.75).

При выполнении работы время завершения работы и время работы процесса в режиме ядра не являются информативными и поэтому не используются.

К п.2. Для добавления потока в приложение выберите в основном меню пункт File/New/Other/Thread Object. В появившемся диалоговом окне задайте имя класса добавляемого потока, например TMyThread. После этого появится заготовка модуля соответствующего потока.

unit Unit1;

interface

uses Classes;

type

TMyThread = class(TThread)

private

{ Private declarations }

protected

procedure Execute; override;

end;

implementation

procedure TMyThread.Execute;

begin

…………

end;

end.

Класс TThread, от которого порожден поток, является о

Наши рекомендации