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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

7. Основы API Win32. Примеры.

Windows API(application programming interfaces — интерфейсы прикладного программирования) - набор базовых функций интерфейсов программирования приложений операционных систем семейства Windows. Они обеспечивают самое прямое взаимодействие приложений с Windows.

Объектом Windows называется структура данных, описывающая системный ресурс. Существует 3 категории объектов Windows:

1)Объекты категории users. Они используются для организации работы с пользователем(окна, кнопки...).

2)GDI(Graphic Device Interface) - это составная часть Win32 API, обеспечивающая графический вывод на устройства отображения информации, такие как дисплей или принтер.

3)Kernel — объекты ядра. К ним относятся процессы, потоки, файлы. Этими объектами оперирует ядро системы, а не пользователь.

Особенностью Windows программирования является то, что пользователь не имеет доступа к объектам, не знает адресов и указателей, а использует дескриптор, то есть адресация косвенная.

Дескриптор — целое число, идентифицирующее объект. Соотношение между объектом и адресом устанавливает систему, которая хранит в памяти таблицу дескрипторов. Большинство функций API принимают дескриптор в качестве одного из своих параметров.

Win32 API поддерживает вызовы свыше двух тысяч функций, которые можно использовать в приложениях. Все основные функции Windows объявлены в заголовочных файлах. Главным заголовочным файлом является windows.h. В этом файле содержится множество ссылок на другие заголовочные файлы. Вызовы функций Win32 API в программе осуществляются аналогично вызовам библиотечных функций C/C++. Основное различие заключается в том, что компоновщик связывает код библиотечных функций C/C++ с кодом программы на этапе компоновки (статическое связывание), в то время как для функций Windows это связывание откладывается и осуществляется только на этапе выполнения программы (динамическое связывание). Библиотеки динамической компоновки (DLL) содержатся в файлах с расширением .dll. Большая часть этих библиотек расположена в подкаталоге SYSTEM каталога установки Windows. С одной стороны это обеспечивает очень маленький объём Windows приложений, так как мы не храним функции, а лишь их адреса. С другой стороны появляется гарантия того, что все программы будут использоваться одни и те же версии функций.

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

1) дескриптор окна, которому адресовано сообщение;

2)код (номер) сообщения;

3)дополнительную информацию, зависящую от кода сообщения.

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

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

Любая Windows-программа должна иметь 3 секции:

1)Цикл ожидания сообщения

2)Оконная функция

3)Инициализация — создание структур и объектов, получение их дескрипторов.

Пример программы завершающей дочернее приложение:

var

H:tHandle;

begin

H:=FindWindow('SciCal','Калькулятор')l

if H<>0 then SendMessage(H,wm_close,0,0);

end;

 

Многопоточность позволяет параллельно выполнять отдельные участки программы на ЭВМ с несколькими процессорами или выполнять их на одном процессоре «псевдопараллельно», используя механизм вытесняющей многозадачности Windows. Например, различные потоки в Microsoft Word одновременно принимают пользовательский ввод, проверяют орфографию в фоновом режиме и печатают документ. Microsoft Excel строит диаграммы и выполняет математические расчеты в фоновом режиме.

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

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

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

 

9.Процессы и потоки. Примеры.

 

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

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

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

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

2)Коллизии тупика(взаимная блокировка). Упрощенно ситуация может быть представлена в следующем виде. Поток А блокирует ресурс 1, поток Б блокирует ресурс 2. А ждёт освобождения ресурса 2, Б ждёт освобождения ресурса 1. Таким образом ни один из потоков не может продолжить работу.

Коллизия гонок предотвращается средствами синхронизации. Средств синхронизации довольно много, к ним относятся мьютексы и семафоры, однако все они основаны на блокировке.

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

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

Кдассы процессов:

1)фоновые — обладают минимальным приоритетом. К ним относятся, например, задачи висящие в трее и ожидающие некоторого события.

2)обычные

3)с высоким приоритетом

4)процессы реального времени — работа с аппаратурой, низкоуровневые системные процессы и т. д.

 

Пример программы, которая выводит счётчик чисел.

unit ThrdUnit; interface uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ExtCtrls;

type

TForm1 = class(TForm) Edit1: TEdit;

bRun: TButton;

bStop: TButton;

procedure bRunClick(Sender: TObject);

procedure bStopClick(Sender: TObject);

public

end;

var

Form1: Tform1;

implementation

{$R *.DFM}

type   // Объявление потока-потомка TSimpleThread = class(TThread)

procedure Execute; override;

public

// Здесь удобно добавить любые поля и методы,

// которые будут использоваться локально, внутри потока

Count: Integer; // Счетчик цикла

procedure OutMessage;

end;

procedure TSimpleThread.Execute; begin

// Содержание потока

while not Terminated do begin

//Поток будет выполняться,

// пока не будет нажата кнопка bStop Count := Count+1;

Synchronize(OutMessage); // Безопасный вывод

end;

end;

procedure TSimpleThread.OutMessage; begin

Form1.Edit1.Text:=IntToStr(count); // Обращение к VCL

end;

var Thread1: TSimpleThread; // Экземпляр класса «поток»

procedure TForm1.bRunClick(Sender: TObject); begin

Thread1:=TSimpleThread.Create(True); // Создание потока
Thread1.Priority := tpLowest;             // Приоритет

Thread1.Count := 0;       // Начальное значение счетчика

Thread1.Resume; end;

procedure TForm1.bStopClick(Sender: TObject); begin

Thread1.Terminate; // Завершаем бесконечный поток end;

end.



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 50; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.128 (0.006 с.)