ROUND ROBIN,
uma técnica preemptiva de escalonamento.
A seguir, entenderemos o funcionamento do algoritmo de
escalonamento chamado Round Robin, ou Escalonamento Circular.
O que é escalonamento?
Políticas ou técnicas de escalonamento são uma série de técnicas usadas com o objetivo de se obter uma melhor utilização da CPU. As políticas de escalonamento se dividem em duas classes: aquelas que usam preempção e as que não usam preempção.
> Preempção
Preempção é a interrupção forçada de um processo, para que outro processo de maior prioridade possa usar a CPU. A preempção é usada em sistemas multiprogramados para evitar que um processo monopolize a CPU. A preempção é implementada através de um relógio de tempo real que interrompe a CPU a intervalos de tempo regulares, a fim de que o escalonador de tarefas possa fazer uma reavaliação de prioridades e escalonar outro processo. Este intervalo é a unidade básica de alocação de tempo da CPU e é denominado quantum.
Escalonamento circular (Round-Robin)
É o tipo de escalonamento preemptivo mais simples e consiste em repartir uniformemente o tempo da CPU entre todos os processos prontos para a execução. Os processos são organizados numa fila circular, alocando-se a cada um uma fatia de tempo da CPU, igual a um número inteiro de quanta. Caso um processo não termine dentro de sua fatia de tempo, ele é colocado no fim da fila e uma nova fatia de tempo é alocada para o processo no começo da fila, como ilustrado na figura abaixo:

O escalonamento circular é muito simples, mas pode trazer problemas se os tempos de execução são muito discrepantes entre si. Quando existirem muitas tarefas ativas e de longa duração no sistema, as tarefas curtas terão o seu tempo de resposta degradado, pois as tarefas longas reciclarão continuamente na fila circular, compartilhando de maneira equitativa a CPU com tarefas curtas.
Vídeo
O vídeo exemplifica o funcionamendo do código (em linguagem C) encontrado abaixo. Para maior entendimento, pode-se baixar o arquivo para que ele seja executado na sua própria máquina.
Código
O código em linguagem C abaixo associa o escalonamento circular à situação de uma fila em um banco. O caixa é a CPU, e as pessoas na fila são os processos. Cada processo precisa "pagar" um certo número de "contas" para terminar sua execução, ou seja, usar a CPU por um determinado tempo. Porém, o caixa (CPU) só permite que cada pessoa pague X contas de cada vez. Esse valor X é chamado de Quantum. Se o processo terminar sua execução, ou seja, todas as contas forem pagas, a pessoa sai da fila, caso contrário, volta ao final da fila e espera sua vez novamente. O vídeo acima também exemplifica o funcionamento do código a seguir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | //O código foi escrito baseando-se no exemplo mostrado no vídeo para uma compreensão facilitada //Pessoas pagando contas em um caixa que só permite certo numero de contas #include <stdlib.h> #include <stdio.h> #define tam 30 //número máximo de pessoas int pessoas[tam]; //Fila de pessoas int NumEscolhidoPessoas; int quantum; //Numero de contas pra pagar no caixa void contas(){ //Para que o usuario possa testar com diferentes quantidades de contas int numero; int i; for (i=1; i<=NumEscolhidoPessoas; i++){ printf( "\nDigite o numero de contas a pagar da pessoa %d:" , i); scanf( "%d" , &numero); //Leitura de valor inserido pelo usuario pessoas[i]= numero; //cada pessoa recebe o valor informado } } void fila(){ int contadorFila=NumEscolhidoPessoas; //contagem de pessoas que estão na fila int frenteFila = 1; //Primeira posição da fila while (contadorFila !=0){ while (pessoas[frenteFila] <= 0){ //Tira pessoas que não tem contas da primeira posição frenteFila++; if (frenteFila>= NumEscolhidoPessoas) //Faz a rotação frenteFila=0; } printf( "\n\nA pessoa %d vai para o caixa com %d contas" , frenteFila , pessoas[frenteFila]); printf( "\nPaga ate %d contas" , quantum); pessoas[frenteFila] = pessoas[frenteFila] - quantum; //Pagamento de quantum contas if ( pessoas[frenteFila]<=0){ printf( "\nE sai da fila.\n" ); contadorFila--; } else { printf( "\nE vai pro final da fila com %d contas restantes.\n" , pessoas[frenteFila]); } frenteFila++; //Atualiza primeira posição if (frenteFila>NumEscolhidoPessoas) //Faz a rotação frenteFila=0; system( "PAUSE" ); } } main(){ printf( "::::::: Programa exemplo sobre round-robin :::::::" ); printf( "\nDigite o numero maximo de contas a pagar no caixa (quantum): " ); scanf( "%d" , &quantum); printf( "\nDigite o numero de pessoas na fila: " ); scanf( "%d" , &NumEscolhidoPessoas); contas(); fila(); printf( "\n\n::::::::: Fim ::::::::::\n" ); getch(); } |