Académique Documents
Professionnel Documents
Culture Documents
LABORATÓRIO DE SISTEMAS
OPERACIONAIS
Escalonador
Poços de Caldas
11/06/2010
PONTIFÍCIA UNIVERSIDADE CATÓLICA DE MINAS GERAIS
Campus de Poços de Caldas
Curso de Graduação em Ciência da Computação
LABORATÓRIO DE SISTEMAS
OPERACIONAIS:
Escalonador
Poços de Caldas
11/06/201
2
Sumário
1.
U U Introdução ................................................................................................................ 5
U U
2.
U U Sistema Operacional ................................................................................................ 6
U U
2.1.
U U System Calls ...................................................................................................... 6
U U
2.2.
U U Processos ........................................................................................................... 6
U U
2.3.
U U Arquivos ............................................................................................................ 7
U U
3.
U U Escalonador de Processos ........................................................................................ 8
U U
3.1.
U U Objetivos do Escalonamento ............................................................................. 8
U U
3.2.
U U Algoritmos Escalonadores ................................................................................. 8
U U
3.2.1.
U U FIFO ........................................................................................................... 9
U U
3.2.2.
U U SJF .............................................................................................................. 9
U U
3.2.3.
U U SRT ............................................................................................................ 9
U U
3.2.4.
U U Algoritmo Loteria ...................................................................................... 9
U U
3.2.5.
U U Escalonamento garantido ........................................................................... 9
U U
3.2.6.
U U RR .............................................................................................................. 9
U U
3.2.7.
U U Múltiplas Filas ............................................................................................ 9
U U
4.
U U Simulação ............................................................................................................... 10
U U
5.
U U Funcionamento ....................................................................................................... 11
U U
6.
U U FILAS ..................................................................................................................... 12
U U
7.
U U Simulações ............................................................................................................. 13
U U
7.1.
U U Simulação 1 ..................................................................................................... 13
U U
7.2.
U U Simulação 2 ..................................................................................................... 14
U U
7.3.
U U Simulação 3 ..................................................................................................... 15
U U
7.4.
U U Simulação 4 ..................................................................................................... 16
U U
8.
U U Comparando ........................................................................................................... 17
U U
8.3.
U U Quantidade total de starvation durante a simulação. ....................................... 18
U U
8.4.
U U Conclusão das Simulações .............................................................................. 19
U U
9.
U U Outras Simulações .................................................................................................. 20
U U
9.1.
U U Simulação 5 ..................................................................................................... 20
U U
9.2.
U U Simulação 6 ..................................................................................................... 21
U U
9.3.
U U Simulação 7 ..................................................................................................... 22
U U
9.4.
U U Simulação 8 ..................................................................................................... 23
U U
10.
U U Média de Throughput .......................................................................................... 24
U U
11.
U U COMPARAÇÃO DAS SIMULAÇÕES 6, 7, 8 e 9 ............................................ 27
U U
11.1.
U U Quantidade total de processos criados durante a simulação. ....................... 27
U U
11.2.
U U Quantidade total de processos executados durante a simulação. ................. 28
U U
11.3.
U U Quantidade total de starvation durante a simulação. ................................... 28
U U
3
13.
U U CONCLUSÃO SIMULAÇÃO 2 ........................................................................ 29
U U
14.
U U Bibliografia ......................................................................................................... 30
U U
15.
U U Anexos ................................................................................................................ 31
U U
15.1.
U U Escalonador.c ............................................................................................... 31
U U
15.2.
U U Bibli.h .......................................................................................................... 34
U U
15.3.
U U Estatistica.txt ................................................................................................ 38
U U
4
1. Introdução
5
2. Sistema Operacional
2.2. Processos
6
descritor e, além dos valores dos registradores da UCP, contém outras
informações.
Assim, em um determinado sistema, cada programa em execução
constitui um processo. Portanto, podemos definir processo como sendo um
programa em execução, o qual é constituído por uma seqüência de instruções,
um conjunto de dados e um registro descritor.
2.3. Arquivos
7
3. Escalonador de Processos
Justiça: fazer com que cada processo ganhe seu tempo justo, para
usarem o mesmo tempo na CPU;
Eficiência: manter a CPU ocupada a maior parte do tempo;
Tempo de Reposta: minimizar o tempo de resposta para os usuários
interativos;
Tempo de Turnaround: minimizar o tempo que usuários devem esperar
pelo resultado;
Throughput: maximizar o número de tarefas executados por unidade de
tempo.
8
Alguns algoritmos de escalonamento mais utilizados são:
3.2.1. FIFO (First in, First Out) ou FCFS (First come, first served) que
como seu próprio nome já diz, o primeiro que chega será o primeiro
a ser executado;
3.2.2. SJF (Shortest Job First): Onde o menor processo ganhará a CPU
e atrás do mesmo formar uma fila de processos por ordem
crescente de tempo de execução;
3.2.3. SRT (Shortest Remaining Time): Neste algoritmo é escolhido o
processo que possua o menor tempo restante, mesmo que esse
processo chegue à metade de uma operação, se o processo novo
for menor ele será executado primeiro;
3.2.4. Algoritmo Loteria: O Sistema Operacional distribui tokens
(fichas), numerados entre os processos, para o escalonamento é
sorteado um numero aleatório para que o processo ganhe a vez na
CPU, processos com mais tokens têm mais chance de receber
antes a CPU.
3.2.5. Escalonamento garantido: Este algoritmo busca cumprir
promessas de alocação de CPU o mais preciso possível.
3.2.6. RR (Round-Robin): Nesse escalonamento o sistema operacional
possui um timer, chamado de quantum, onde todos os processos
ganham o mesmo valor de quantum para rodarem na CPU. Com
exceção do algoritmo RR e escalonamento garantido, todos os
outros sofrem do problema de Inanição (starvation).
3.2.7. Múltiplas Filas: São usadas várias filas de processos prontos
para executar, cada processo e colocado em uma fila, e cada fila
tem uma política de escalonamento própria e outra entre filas.
9
4. Simulação
10
5. Funcionamento
11
6. FILAS
12
7. Simulações
7.1. Simulação 1
100
90
80
70
60
Processos criados
50
processos executados
40
starvattion
30
20
10
0
0 500 1000 1500 2000
13
7.2. Simulação 2
100
90
80
70
60
Processos criados
50
processos executados
40
30 starvattion
20
10
0
0 500 1000 1500 2000
14
7.3. Simulação 3
100
90
80
70
60
Processos criados
50
processos executados
40
starvattion
30
20
10
0
0 500 1000 1500 2000
15
7.4. Simulação 4
100
90
80
70
60
Processos criados
50
processos executados
40
starvattion
30
20
10
0
0 500 1000 1500 2000
16
8. Comparando
Iterações = 2000
Quantum = randômico
100
90
80
70
60 Processos criados
50 processos executados
40 starvattion
30 #REF!
20
10
0
0 500 1000 1500 2000
17
8.2. Quantidade total de processos executados durante a
simulação.
800
700
600
500
Processos criados
400 processos executados
300 starvattion
#REF!
200
100
0
0 500 1000 1500 2000
800
700
600
500
Processos criados
400 processos executados
300 starvattion
#REF!
200
100
0
0 500 1000 1500 2000
18
significativamente, como observamos no primeiro gráfico. Em relação ao
starvation, podemos ver que o aumento de starvation foi proporcional ao
aumento de novos processos.
19
9. Outras Simulações
Nas próximas simulações (6, 7, 8 e 9) atribuímos o quantum aos novos
processos de forma diferente. Pegamos o tamanho do processo que está
chegando a CPU e dividimos por dois. O resultado será utilizado como
quantum para a execução. Foram feitas simulações com probabilidades de
20%, 40%, 60% e 80% de ser criado um processo, em 2000 iterações do
sistema. Pegamos informações em 4 faixas de tempo que são: 0-499, 500-999,
1000-1499 e 1500-1999 iterações.
9.1. Simulação 5
Iterações = 2000
Quantum = tamanho / 2
100
90
80
70
60
Processos criados
50
processos executados
40
starvattion
30
20
10
0
0 500 1000 1500 2000
20
9.2. Simulação 6
Iterações = 2000
Quantum = tamanho / 2
800
700
600
500
Processos criados
400
processos executados
300
starvattion
200
100
0
0 500 1000 1500 2000
21
9.3. Simulação 7
Iterações = 2000
Quantum = tamanho / 2
800
700
600
500
Processos criados
400
processos executados
300
starvattion
200
100
0
0 500 1000 1500 2000
22
9.4. Simulação 8
Iterações = 2000
Quantum = tamanho / 2
1400
1200
1000
200
0
0 500 1000 1500 2000
23
10. Média de Throughput
Fila 1
70
60
50
40
30 Fila 1
20
10
0
500 1000 1500 2000
Fila 2
25
20
15
10 Fila 2
0
500 1000 1500 2000
24
Fila 3
140
120
100
80
60 Fila 3
40
20
0
500 1000 1500 2000
Fila 4
140
120
100
80
60 Fila 4
40
20
0
500 1000 1500 2000
Fila 5
200
150
100
Fila 5
50
0
500 1000 1500 2000
25
Fila 6
160
140
120
100
80
60 Fila 6
40
20
0
500 1000 1500 2000
180
160
140
Fila 1
120
Fila 2
100
Fila 3
80
Fila 4
60
Fila 5
40
Fila 6
20
0
500 1000 1500 2000
26
11. COMPARAÇÃO DAS SIMULAÇÕES 6, 7, 8 e 9
Iterações = 12000
Quantum = tamanho / 2
500
450
400
350
300 20%
250 40%
200 60%
150 80%
100
50
0
0 500 1000 1500 2000
27
11.2. Quantidade total de processos executados durante a
simulação.
100
90
80
70
60 20%
50 40%
40 60%
30 80%
20
10
0
0 500 1000 1500 2000
1400
1200
1000
800 20%
40%
600
60%
400 80%
200
0
0 500 1000 1500 2000
28
12. CONCLUSÃO SIMULAÇÃO 2
29
14. Bibliografia
30
15. Anexos
15.1. Escalonador.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "bibli.h"
main(){
int i, j, x, iteracao=0;
lista Lista1Processos, Lista2Processos, Lista3Processos;
lista Lista4Processos, Lista5Processos, Lista6Processos;
c.tempo = 0;
ARQ = fopen("estatisticas.txt","w");
create(&Lista1Processos);
create(&Lista2Processos);
create(&Lista3Processos);
create(&Lista4Processos);
create(&Lista5Processos);
create(&Lista6Processos);
31
else if ((p.prioridade >= 60) && (p.prioridade <=
79)){
insert(&Lista5Processos, p);
atualiza_estatistica(1, 5, iteracao);
}
else if ((p.prioridade >= 80) && (p.prioridade <=
99)){
insert(&Lista6Processos, p);
atualiza_estatistica(1, 6, iteracao);
}
}
// caso não tenha sido criado novo processo, simula
execução de um processo
else {
if (!isEmpty(Lista1Processos)){
if (executa_processo(&Lista1Processos))
insert(&Lista1Processos, p);
else atualiza_estatistica(2, 1, iteracao);
}
else if (!isEmpty(Lista2Processos)){
if (executa_processo(&Lista2Processos))
insert(&Lista2Processos, p);
else atualiza_estatistica(2, 2, iteracao);
}
else if (!isEmpty(Lista3Processos)){
if (executa_processo(&Lista3Processos))
insert(&Lista3Processos, p);
else atualiza_estatistica(2, 3, iteracao);
}
else if (!isEmpty(Lista4Processos)){
if (executa_processo(&Lista4Processos))
insert(&Lista4Processos, p);
else atualiza_estatistica(2, 4, iteracao);
}
else if (!isEmpty(Lista5Processos)){
if (executa_processo(&Lista5Processos))
insert(&Lista5Processos, p);
else atualiza_estatistica(2, 5, iteracao);
}
else if (!isEmpty(Lista6Processos)){
if (executa_processo(&Lista6Processos))
insert(&Lista6Processos, p);
else atualiza_estatistica(2, 6, iteracao);
}
}
32
}
else if (iteracao == 999){
verifica_starvation(Lista1Processos, 1, 2);
verifica_starvation(Lista2Processos, 2, 2);
verifica_starvation(Lista3Processos, 3, 2);
verifica_starvation(Lista4Processos, 4, 2);
verifica_starvation(Lista5Processos, 5, 2);
verifica_starvation(Lista6Processos, 6, 2);
}
else if (iteracao == 1449){
verifica_starvation(Lista1Processos, 1, 3);
verifica_starvation(Lista2Processos, 2, 3);
verifica_starvation(Lista3Processos, 3, 3);
verifica_starvation(Lista4Processos, 4, 3);
verifica_starvation(Lista5Processos, 5, 3);
verifica_starvation(Lista6Processos, 6, 3);
}
else if (iteracao == 2000){
verifica_starvation(Lista1Processos, 1, 4);
verifica_starvation(Lista2Processos, 2, 4);
verifica_starvation(Lista3Processos, 3, 4);
verifica_starvation(Lista4Processos, 4, 4);
verifica_starvation(Lista5Processos, 5, 4);
verifica_starvation(Lista6Processos, 6, 4);
mostra_estatistica();
33
fclose(ARQ);
} // fim do main
15.2. Bibli.h
#define TRUE 1
#define FALSE 0
typedef struct{
int id;
int prioridade;
int tamanho;
int tamanho_restante;
int quantum;
}processo;
typedef struct{
int id;
int tempo;
}cpu;
typedef struct{
int cont_proc_novos;
int cont_proc_executados;
int cont_proc;
int cont_proc_starvation;
}estatistica;
processo p;
cpu c;
estatistica e[7][5];
FILE *ARQ;
struct no{
processo dado;
struct no *prox;
};
typedef struct
{
struct no *inicio;
} lista;
34
int cria_processo(int iteracoes){
int x;
srand(time(NULL) * (e[0][0].cont_proc_novos + 1 * iteracoes +
1));
x = rand()%100;
if (x < 80){
p.id = e[0][0].cont_proc_novos + 1;
p.prioridade = rand()%100;
p.tamanho = 1 + rand()%9;
p.tamanho_restante = p.tamanho;
p.quantum = p.tamanho / 2;
return(TRUE);
}
return(FALSE);
}
if (aux!=NULL){
aux->dado=d; aux->prox=NULL;
anterior = NULL; atual = q->inicio;
if (anterior == NULL){
aux->prox = q->inicio;
q->inicio = aux;
}
else {
anterior->prox=aux;
aux->prox = atual;
}
}
}
35
// guarda os dados do processo atual
p.id = (q->inicio)->dado.id;
p.prioridade = (q->inicio)->dado.prioridade;
p.tamanho = (q->inicio)->dado.tamanho;
p.tamanho_restante = (q->inicio)->dado.tamanho_restante;
p.quantum = (q->inicio)->dado.quantum;
if (!isEmpty(q)){
while (aux != NULL){
e[0][i].cont_proc++;
e[f][i].cont_proc++;
if (aux->dado.tamanho == aux->dado.tamanho_restante){
e[0][i].cont_proc_starvation++;
e[f][i].cont_proc_starvation++;
}
aux = aux->prox;
}
}
}
aux = q.inicio;
if (!isEmpty(q)){
while (aux != NULL){
ContadorNos++;
fprintf(ARQ,"ID: %d", aux->dado.id);
fprintf(ARQ,"\tTamanho: %d", aux->dado.tamanho);
fprintf(ARQ,"\tRestante: %d", aux-
>dado.tamanho_restante);
fprintf(ARQ,"\tQuantum: %d", aux->dado.quantum);
fprintf(ARQ,"\tPrioridade: %d\n", aux-
>dado.prioridade);
aux = aux->prox;
}
fprintf(ARQ,"\n\nQuantidade de processos: %d",
ContadorNos);
}
fprintf(ARQ,"\n\n\n");
}
36
if (interacoes <= 499){
e[0][1].cont_proc_novos++;
e[fila][1].cont_proc_novos++;
}
else if ((interacoes >= 500) && (interacoes <= 999)){
e[0][2].cont_proc_novos++;
e[fila][2].cont_proc_novos++;
}
else if ((interacoes >= 1000) && (interacoes <= 1499)){
e[0][3].cont_proc_novos++;
e[fila][3].cont_proc_novos++;
}
else if ((interacoes >= 1500) && (interacoes <= 1999)){
e[0][4].cont_proc_novos++;
e[fila][4].cont_proc_novos++;
}
}
else if (tipo == 2){
e[0][0].cont_proc_executados++;
- 42 -
e[fila][0].cont_proc_executados++;
void mostra_estatistica(){
int i;
int j;
int faixa = 499;
fprintf(ARQ,"\n_________________________________________________
______________\n\n");
fprintf(ARQ,"ESTATISTICAS");
fprintf(ARQ,"\n_________________________________________________
______________\n\n");
for(i=0;i<5;i++){
if(i==0) fprintf(ARQ,"GERAL\n");
else fprintf(ARQ," FAIXA %d (%d a %d)\n",i,faixa-
499,faixa);
fprintf(ARQ,"Fila\tProcessos Criados\tProcessos
Executados\tQtd Processos\tStarvation\n");
37
for(j=1;j<7;j++){
fprintf(ARQ," %d\t\t%2d\t\t\t%2d\t\t %2d\t %2d\n",j,
e[j][i].cont_proc_novos,
e[j][i].cont_proc_executados,
e[j][i].cont_proc,
e[j][i].cont_proc_starvation);
}
if(j>6) fprintf(ARQ, " T\t\t%2d\t\t\t%2d\t\t %2d\t %2d\n",
e[0][i].cont_proc_novos,
e[0][i].cont_proc_executados,
e[0][i].cont_proc,
e[0][i].cont_proc_starvation);
fprintf(ARQ,"\n_________________________________________________
_________________");
fprintf(ARQ,"\n\n");
faixa += 500;
}
}
15.3. Estatistica.txt
38