Skip to content

Instantly share code, notes, and snippets.

@edgardmota
Created June 27, 2017 18:37
Show Gist options
  • Save edgardmota/034f7075cc8be1b386fca41f7c568301 to your computer and use it in GitHub Desktop.
Save edgardmota/034f7075cc8be1b386fca41f7c568301 to your computer and use it in GitHub Desktop.
void processo(int meu_tipo, int minha_prioridade, int minha_duracao, Fila * fila_interrupcoes, int * interrupcoes_ativas, int * tempo_total){
Processo * nova_interrupcao;
Processo * primeiro_fila_interrupcoes;
int tempo_total_inicial;
tempo_total_inicial = *tempo_total;
printf("\nTempo de início do Processo: %d\n", *tempo_total);
printf("Duracão Esperada do Processo: %d\n", minha_duracao);
for(int i = 1; i <= minha_duracao; i++){
nova_interrupcao = gera_processo(TIPO_INTERRUPCAO,interrupcoes_ativas); // Gera, com certa probabilidade, um processo do tipo interrupção aleatório, com duração aleatória
if(nova_interrupcao) // Como existe chance de não gerar interrupção, já que é gerado com certa probabilidade, é necessário checar se gerou
insere_por_prioridade(fila_interrupcoes,nova_interrupcao);
primeiro_fila_interrupcoes = primeiro(fila_interrupcoes);
if((primeiro_fila_interrupcoes) && (primeiro_fila_interrupcoes->prioridade < minha_prioridade)){ // A primeira parte do 'if' é porque a fila pode estar vazia
remove(fila_interrupcoes);
processo(primeiro_fila_interrupcoes->tipo,primeiro_fila_interrupcoes->prioridade,primeiro_fila_interrupcoes->duracao,fila_interrupcoes,tempo_total);
free(primeiro_fila_interrupcoes);
}
*tempo_total += 1;
printf("U\n");
sleep(TEMPO_ESPERA);
}
printf("\nTempo Final do Processo: %d\n", *tempo_total);
printf("Duracão Real do Processo: %d\n", *tempo_total - tempo_total_inicial);
return;
}
int main(void){
Processo * processo_usuario;
Fila * fila_interrupcoes = cria_fila(); // Fila de prioridade com as interrupções esperando pra serem executadas
int interrupcoes_ativas[NUMERO_DE_INTERRUPCOES]; //Matém quais interrupções estão ativas pra não gerar duas interrupções do mesmo tipo
int tempo_total = 1; //Tempo total do sistema
while(1){
processo_usuario = gera_processo(TIPO_USUARIO,NULL);
processo(processo_usuario->tipo,processo_usuario->prioridade,processo_usuario->duracao,fila_interrupcoes,&interrupcoes_ativas,&tempo_total);
free(primeiro_fila_interrupcoes);
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment