Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СППО .doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
190.46 Кб
Скачать

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

Многопоточность позволяет параллельно выполнять отдельные участки программы на ЭВМ с несколькими процессорами или выполнять их на одном процессоре «псевдопараллельно», используя механизм вытесняющей многозадачности 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.