Разработка структуры данных (контекст процесса и др.), определение необходимых системных вызовов, страница 2

}

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); //переключение на процесс,

// выбранный в результате планирования

}