Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lektsii_OC

.pdf
Скачиваний:
13
Добавлен:
19.05.2015
Размер:
1.39 Mб
Скачать

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

1.Метод представления ресурсов в порядке поступления запросов –FIFO (First in First out)

2.Обслуживание в порядке обратном поступлению запросов – LIFO (Last in First out)

3.Круговой циклический алгоритм

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

В этой дисциплине преимущество получают быстрые процессы (среднее время их ожидания меньше, чем у длительных процессов)

Для этих трёх дисциплин характерно то, что существует одна очередь заданий.

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

Новый запрос на обслуживание поступает в первую очередь. Если процесс не успевает выполниться за квант времени tк , то он приостанавливается, и перемещается во вторую очередь. Если в первой очереди не осталось невыполненных запросов, тогда начинает выполняться первый запрос второй очереди. Для i – ой очереди после того как истёк выделенный квант времени для текущего процесса этой очереди проверяется, нет ли запросов в очередях с номерами <i , если нет, то начинают выполнение процессы i – ой очереди, иначе выполняются процессы из самой младшей очереди. В данной дисциплине дискриминация остаётся для длительных процессов(больше, чем в третьем методе), возрастает нагрузка на ОС.

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

Планирование процессов включает в себя решение следующих задач:

1.определение момента времени для смены выполняемого процесса

2.выбор процесса на выполнение из очереди готовых процессов;

3.переключение контекстов "старого" и "нового" процессов.

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

1.алгоритмы, основанные на квантовании

2.алгоритмы, основанные на приоритетах (системы с явным приоритетом).

Алгоритмы, основанные на квантовании

(алгоритмы бесприоритетного планирования, простого квантования)

Смена активного процесса происходит, если:

процесс завершился и покинул систему, произошла ошибка, процесс перешел в состояние ОЖИДАНИЕ, исчерпан квант процессорного времени, отведенный данному процессу.

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

Эти алгоритмы делятся на 2 класса:

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

процессы из очереди (подряд).

Недостаток: все процессы в системе назначаются равными. б) алгоритм случайного выбора Процессы выбираются из очереди случайным образом.

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

Алгоритмы, основанные на приоритетах

Другая группа алгоритмов использует понятие "приоритет" процесса.

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

Приоритет - это число, характеризующее степень привилегированности процесса при использовании ресурсов вычислительной машины, в частности, процессорного времени: чем выше приоритет, тем выше привилегии.

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

Существует две разновидности приоритетных алгоритмов:

1.алгоритмы, использующие относительные приоритеты.

2.алгоритмы, использующие абсолютные приоритеты.

На выполнение выбирается процесс, имеющий наивысший приоритет. В системах

сотносительными приоритетами активный процесс выполняется до тех пор, пока он сам не покинет процессор, перейдя в состояние ОЖИДАНИЕ (или же произойдет ошибка, или процесс завершится). В системах с абсолютными приоритетами выполнение активного процесса прерывается еще при одном условии: если в очереди готовых процессов появился процесс, приоритет которого выше приоритета активного процесса. В этом случае прерванный процесс переходит в состояние готовности.

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

Многие операционные системы построены на смешанных алгоритмах. Например, в основе планирования лежит квантование, но величина кванта и/или порядок выбора процесса из очереди готовых определяется приоритетами процессов.

По сложности различают различные следующие алгоритмы а) Алгоритм простого приоритетного планирования

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

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

Всистемах, ориентированных на вычисления планирование

осуществляется следующим образом: на некотором промежутке времени, размер которого

Количество квантов

Приоритет

1

2

3

4

5

6

7

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

б) Алгоритм политического планирования Приоритет задается в виде функции, определяющей приоритетность

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

Ф(nобещали – nполучил)

Обещает ресурсы и процессорное время ОС, согласно приоритетам процесса.

Т.о. у процесса всегда существует некоторый “политический вес”, который практически является приоритетом.

в) Алгоритм адаптивного планирования Является одним из самых неудобных и трудоёмких для ОС.

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

1)какое количество памяти ему потребуется на следующем шаге

2)сколько ему потребуется процессорного времени

3)какие внешние ресурсы ему предположительно потребуются

Чем меньше будут эти предполагаемые требования, тем выше будет приоритет процесса.

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

Алгоритмы можно делить по другому признаку:

1.вытесняющие алгоритмы планирования (preemptive multitasking).

2.невытесняющие алгоритмы планирования (non-preemptive multitasking). Невытесняющая многозадачность - это способ планирования процессов, при

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

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

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

Windows 3.х.

Однако почти во всех современных операционных системах, ориентированных на высокопроизводительное выполнение приложений (UNIX, Windows NT, OS/2, VAX/VMS), реализована вытесняющая многозадачность.

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

Проблемы взаимодействия процессов

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

Рассматривают следующие проблемы: 1. Тупики (взаимоблокировки)

Процесс находится в состоянии тупика (clinch), взаимоблокировки (deadlock), в случае, когда он ожидает одного или более ресурсов, которые заранее никогда не будут выделены или события , которое никогда не произойдёт.

Пример.

{

WaitEvent(hEvent)

}

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

Ещё одна ситуация тупика заключается в бесконечном откладывании процессов. Выходом является реализация механизма устаревания процесса. По мере ожидания ОС повышает приоритет ожидающих процессов.

Для становления тупика достаточно и необходимо 4 условия

4)Процессу ОС выделяет запрошенные ресурсы монопольное использование.

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

6)ОС не может принудительно отобрать у процесса ресурс, выданный ему в монопольное использование, до тех пор, пока процесс сам его не освободит.

7)В ОС существует цикл некоторых процессов, каждый из которых владеет

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

Выделяют 4 метода борьбы с тупиковыми ситуациями: 1) недопущение тупика

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

стратегия №1. Предполагает условие: любой процесс запрашивает все требуемые ресурсы сразу и не продолжает выполнения до тех пор, пока это условие не будет выполнено.

стратегия №2. Если процессу отказывается в выделении ресурса, то он освобождает все выделенные ему ранее ресурсы и перезапрашивает их заново. Таким образом другие процессы могут захватить монопольные ресурсы, выделенные данному процессу ранее.

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

2) обход тупика Этот метод похож на первый, но применяется в тех случаях, когда нельзя

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

3) обнаружение тупика Основное назначение метода – обнаружить сам факт присутствия тупика и

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

Строится граф, узлы которого ресурсы и процессы, а рёбра – реальные или потенциальные взаимосвязи. Алгоритм заключается в следующем: Для данного графа говорят, что любой процесс может быть редуцирован, если он может освободить используемые ресурсы и получить запрошенные. Производится попытка редуцировать все процессы в графе. Если это возможно, то тупика нет. Нередуцированные процессы и ресурсы составляют цикл, участвующий в создании тупика.

4)Восстановление работоспособности системы после тупиковых ситуаций.

Одним из наиболее распространённых способов борьбы с тупиками является

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

2. Взаимное исключение процессов (синхронизация процессов)

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

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

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

Критическая секция

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

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

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

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

проблемы взаимного исключения, но и более общие задачи синхронизации процессов. Используются системные функции которые условно можно условно назвать WAIT(x) и POST(x), где x - идентификатор некоторого события. Если ресурс занят, то процесс не выполняет циклический опрос, а вызывает системную функцию WAIT(D), здесь D обозначает событие, заключающееся в освобождении

ресурса D. Функция WAIT(D) переводит активный процесс в состояние ОЖИДАНИЕ и делает отметку в его дескрипторе о том, что процесс ожидает события D. Процесс, который в это время использует ресурс D, после выхода из критической секции выполняет системную функцию POST(D), в результате чего операционная система просматривает очередь ожидающих процессов и переводит процесс, ожидающий события D, в состояние ГОТОВНОСТЬ.

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

V(S) : переменная S увеличивается на 1 одним неделимым действием; выборка, инкремент и запоминание не могут быть прерваны, и к S нет доступа другим процессам во время выполнения этой операции.

P(S) : уменьшение S на 1, если это возможно. Если S=0, то невозможно уменьшить S и остаться в области целых неотрицательных значений, в этом случае процесс, вызывающий P-операцию, ждет, пока это уменьшение станет возможным. Успешная проверка и уменьшение также является неделимой операцией.

В частном случае, когда семафор S может принимать только значения 0 и 1, он превращается в блокирующую переменную. Операция P заключает в себе потенциальную возможность перехода процесса, который ее выполняет, в состояние ожидания, в то время как V-операция может при некоторых обстоятельствах активизировать другой процесс, приостановленный операцией P (сравните эти операции с системными функциями WAIT и POST).

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

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

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

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

// Глобальные переменные

int e = N, f = 0, b = 1;

#define N 256

void Writer ()

 

{

 

 

 

 

while(1)

 

 

 

 

{

 

 

 

 

PrepareNextRecord(); /* подготовка новой

записи

*/

 

 

 

 

P(e); /*

Уменьшить

число свободных

буферов, если они есть */

 

 

 

/* в противном случае - ждать, пока

они освободятся */

 

 

 

 

P(b);

/* Вход в критическую секцию

*/

 

 

 

 

 

AddToBuffer();

/*

Добавить новую

запись в буфер */

 

 

 

 

V(b);

 

/* Выход из критической

секции

*/

 

 

 

 

V(f);

/*

Увеличить число занятых

буферов */

}

}

void Reader ()

{

while(1)

 

 

 

{

 

 

 

P(f);

/* Уменьшить число занятых

буферов, если они есть */

 

 

/* в противном случае ждать, пока они

появятся */

 

 

 

P(b);

 

/*

Вход в критическую

секцию

*/

 

 

GetFromBuffer();

/* Взять запись из

буфера

*/

 

 

V(b);

 

/* Выход из критической

секции

*/

 

 

V(e);

 

 

/* Увеличить число

свободных буферов

*/

 

ProcessRecord();

/* Обработать запись

*/

 

 

 

}

 

 

 

}

 

 

 

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

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

Сообщение состоит из двух полей:

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

2.несёт информацию о том, что произошло.

Механизм сообщений используется следующим образом:

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

2.Процесс создаёт т.н. поименованную трубу (Named Pipe). Такая труба фактически является своеобразным файлом (в него можно писать и читать с последовательным доступом). Второй процесс "открывает" на чтение или на запись эту "трубу" и по этой трубе процессы осуществляют коммуникацию между собой. Процесс может открыть несколько труб с одним и тем же названием (для коммуникации с несколькими процессами параллельно). Процесс может открыть две трубы так, чтобы одна была доступна для чтения, а другая для записи (обеспечение полнодуплексного режима обмена информацией). Некоторые ОС позволяют установить параметры трубы, например, указать максимальный объём данных в трубе, что гарантирует защиту ресурсов от "неаккуратного использования".

Нити. Внутренний параллелизм.

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

Операционная система поддерживает обособленность процессов: у каждого процесса имеется свое виртуальное адресное пространство, каждому процессу

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]