}
switch_context(next); //переключаемся на избранный
//процесс в результате планирования
}
Разработайте структуры данных (контекст процесса и др.), определите необходимые системные вызовы (переключения контекста, завершения процесса и др.) и напишите функцию-планировщик процессорного времени, которая реализует дисциплину планирования RR с постоянной величиной кванта, но активный процесс получает дополнительный квант, если за время кванта в системе появился новый процесс. (Выход из планировщика должен выполняться только системным вызовом переключения контекста switch_context).
RR (round robin - карусель) - простейшая дисциплина с вытеснением. Процесс получает в свое распоряжение ЦП на некоторый квант времени Q.
Если за время Q процесс не завершился, он вытесняется с ЦП и направляется в конец очереди готовых процессов, где ждет выделения нему следующего кванта, и т.д. Показатели эффективности RR существенным образом зависят от выбора величины кванта Q. RR обеспечивает наилучшие показатели, если продолжительность большинства процессов приближается к размеру кванта, но не превосходит его: тогда большинство процессов укладываются в один квант и не становятся в очередь повторно. При величине кванта стремящейся к бесконечности RR вырождается в FCFS. При Q стремящемуся к 0 накладные затраты на переключение процессов возрастают настолько, что поглощают весь ресурс ЦП. RR обеспечивает наилучшие показатели справедливости: штрафное отношение P на большом участке длин процессов t остается практически постоянным. Только на участке t < Q штрафное отношение начинает изменяться и при уменьшении t от Q до 0 возрастает экспоненциально. Утерянное же время M существенным образом растет с увеличением продолжительности процесса.
Разработаем упрощенный вариант планировщика процессорного времени.
Очередь готовых процессов представляется как
struct QUE {
process *PROC; // указатель на контекст процесса
struct QUEUE *next; // указатель на следующий элемент очереди
unsigned int Q; // квант времени для каждого процесса
} *PROCESS;
При добавлении нового процесса в функции add_process(PROCESS, PROC) квант времени устанавливается равным заданной константе QUANT в системе.
Контекст каждого процесса имеет поля:
unsigned long timer; // время выполнения процесса в текущем кванте
События, по которым вызывается планировщик процессорного времени:
NEW – поступление нового процесса, EOJ – завершение процесса, TMR – тик таймера.
Для хранения данных про текущий активный процесс в системе используется глобальная переменная
process *CUR_P;
Функция-планировщик:
function Scheduler(event EVENT, process *PROC)
{
process *next=NULL;
switch(EVENT){
case(NEW): add_process(PROCESS, PROC); //добавить //процесс в очередь
CUR_P->Q++; break; // увеличиваем квант времени для
// текущего процесса
case(EOJ): next=getfirst(PROCESS); // выбираем следующий процесс
case(TMR): CUR_P->timer++; if(!CUR_P->timer== CUR_P->Q)
// если исчерпан квант времени тогда
// сбрасываем значение таймера и размер кванта
// для текущего процесса
{ CUR_P->timer=0;
CUR_P->Q=QUANT;
// выбираем процесс с начала списка и заносим
next=getfirst(PROCESS);
// текущий процесс в очередь
add_process(PROCESS, CUR_P);
// иначе следующим будет текущий активный процесс
} else {next=CUR_P;}
}
switch_context(next); //переключение на процесс,
// выбранный в результате планирования
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.