_Isis_ 202 Denunciar post Postado Maio 31, 2010 Coloque uma variável que conta quantas vezes foi impresso dentro da struct. Compartilhar este post Link para o post Compartilhar em outros sites
Brayan Rastelli 2 Denunciar post Postado Maio 31, 2010 Fala galera, criei um tópico esses dias para arrumar um programa q simula o processador. Agora o próximo passo é criar um round-robin. Exemplo: Processos: 3 (4,5,3) a impressao ta sendo feita da seguinte maneira 1111 | 22222 | 333 eu preciso limitar isso a 3 jobs por processo e executar o próximo. Exemplo: 111 | 222 | 333 | 1 | 22 alguma idéia/lógica de como desenvolver isso? Obrigado ^_^ Compartilhar este post Link para o post Compartilhar em outros sites
Brayan Rastelli 2 Denunciar post Postado Maio 31, 2010 Boa.. fiz oq você falou.. quase deu certo.. olha só for ( i = 0; i < np; i++ ) { // for ( j = 0;j < vet[i].jobs;j++ ) { for ( j = 0;j < maxjobs;j++ ) { //maxjobs é uma constante.. definida como 3 ++vet[i].imp; if(vet[i].imp <= vet[i].jobs) printf("%d",vet[i].nproc + 1); } if(vet[i].imp < vet[i].jobs) i--; if( i+1 != np ) printf("|"); } só q assim ele imprime desse jeito: Processos: 3 (5,3,7) 111 | 11 | 222 | 333 | 333 | 3 eu tentei incrementar a variavel pra imprimir a da frente, e fazer um do.. while até q todos os vet.imp estivessem iguais ao vet.jobs mas ele entrou em loop infinito.. e em outra tentativa.. sem do..while imprimiu lixo de memoria. =[ to me quebrando na lógica.. pra ir até o fim, imprimindo de 3 em 3 (cada processo) e depois voltar e checar os q nao imprimiu todos :mellow: Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Maio 31, 2010 Não adianta jogar de qualquer forma no código. int check_print(PROC *vet) { int j; int cont = 0; for(j = 0; j < np; j++) { if (vet[j].jobs == vet[j].imp || vet[j].imp == -1) cont++; } return cont; } void printjob(PROC *vet) { int seg = 0; int i, j; for (i = 0; check_print(vet) != np; i = (i+1)%np) { if (vet[i].imp < vet[i].jobs) { for(j = 0; j < maxjobs && vet[i].imp < vet[i].jobs; j++, vet[i].imp++) { printf("%d", vet[i].nproc); } } if (check_print(vet) != np) { printf("|"); if (vet[i].imp == vet[i].jobs) vet[i].imp = -1; } seg += vet[i].jobs; } printf("\n\nTempo de uso da CPU: %d\n",seg); printf("Tempo total de espera: %d\n\n",total); } isis@linux-ke4t:~/src> ./a.out Numero de Processos:1 Processo 0: 8 Jobs 000|000|00 Tempo de uso da CPU: 24 Tempo total de espera: 0 isis@linux-ke4t:~/src> ./a.out Numero de Processos:2 Processo 0: 13 Jobs Processo 1: 13 Jobs 000|111|000|111|000|111|000|111|0|1 Tempo de uso da CPU: 130 Tempo total de espera: 13 Compartilhar este post Link para o post Compartilhar em outros sites
Brayan Rastelli 2 Denunciar post Postado Maio 31, 2010 Funcionou.. mas quando tem numeros muito distantes eele as vezes entra em loop e n para ;x tipo Processos:2 Jobs : 4 Jobs : 14 tenta ai fazer dar mais ou menos assim se você colocar mais de 2 processos acontece qse sempre =\ eu até ia mudar.. mas nao entendi nd daquele seu for :s código final (fiz algumas alterações): #include <stdio.h> #include <stdlib.h> #include <time.h> #define maxjobs 3 typedef struct{ int jobs, nproc, imp; }PROC; void printproc(PROC *proc); int check_print(PROC *proc); void printjob(PROC *vet); int np; int main() { int i; srand(time(NULL)); printf("Numero de Processos:"); scanf("%d",&np); PROC proc[np]; for ( i = 0;i < np;i++ ) { proc[i].jobs = 4+rand()%12; proc[i].nproc = i; proc[i].imp = 0; } printproc(proc); //impressao dos processos e quantos jobs tem printjob(proc); //impressao dos jobs sendo executados, tempo de uso e total da espera da cpu return 0; } void printproc(PROC *proc) { int i; for( i = 0;i < np;i++ ) printf("\nProcesso %d: %d Jobs\n",proc[i].nproc + 1,proc[i].jobs); printf("\n"); } int check_print(PROC *vet) { int j; int cont = 0; for(j = 0; j < np; j++) { if (vet[j].jobs == vet[j].imp || vet[j].imp == -1) cont++; } return cont; } void printjob(PROC *vet) { int i, j; for (i = 0; check_print(vet) != np; i = (i+1)%np) { if (vet[i].imp < vet[i].jobs) { for(j = 0; j < maxjobs && vet[i].imp < vet[i].jobs; j++, vet[i].imp++) { printf("%d", vet[i].nproc + 1); } } if (check_print(vet) != np) { printf("|"); if (vet[i].imp == vet[i].jobs) vet[i].imp = -1; } } } Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Maio 31, 2010 Questão de arrumar a condição do if e colocar os prints pra dentro. Execute o algoritmo na mão pra entender, se esse é o problema. for (i = 0; check_print(vet) != np; i = (i+1)%np) { if (vet[i].imp < vet[i].jobs && vet[i].imp != -1) { for(j = 0; j < maxjobs && vet[i].imp < vet[i].jobs; j++) { printf("%d", vet[i].nproc); vet[i].imp++; } if (check_print(vet) != np) { printf("|"); if (vet[i].imp == vet[i].jobs) vet[i].imp = -1; } seg += vet[i].jobs; } } Numero de Processos: Processo 0: 6 Jobs Processo 1: 14 Jobs 000|111|000|111|111|111|11 Tempo de uso da CPU: 82 Tempo total de espera: 6 Numero de Processos: Processo 0: 5 Jobs Processo 1: 8 Jobs Processo 2: 14 Jobs 000|111|222|00|111|222|11|222|222|22 Tempo de uso da CPU: 104 Tempo total de espera: 13 Numero de Processos: Processo 0: 10 Jobs Processo 1: 11 Jobs Processo 2: 6 Jobs Processo 3: 7 Jobs 222|333|000|111|222|333|000|111|3|000|111|0|11 Tempo de uso da CPU: 117 Tempo total de espera: 27 Numero de Processos: Processo 0: 14 Jobs Processo 1: 13 Jobs Processo 2: 13 Jobs Processo 3: 5 Jobs Processo 4: 7 Jobs 333|444|111|222|000|33|444|111|222|000|4|111|222|000|111|222|000|1|2|00 Tempo de uso da CPU: 231 Tempo total de espera: 45 Numero de Processos: Processo 0: 12 Jobs Processo 1: 7 Jobs Processo 2: 13 Jobs Processo 3: 5 Jobs Processo 4: 5 Jobs Processo 5: 15 Jobs 333|444|111|000|222|555|33|44|111|000|222|555|1|000|222|555|000|222|555|2|555 Tempo de uso da CPU: 229 Tempo total de espera: 42 Numero de Processos: Processo 0: 10 Jobs Processo 1: 11 Jobs Processo 2: 5 Jobs Processo 3: 9 Jobs Processo 4: 10 Jobs Processo 5: 13 Jobs Processo 6: 5 Jobs 222|666|333|000|444|111|555|22|66|333|000|444|111|555|333|000|444|111|555|0|4|11|555|5 Tempo de uso da CPU: 236 Tempo total de espera: 58 Numero de Processos: Processo 0: 11 Jobs Processo 1: 12 Jobs Processo 2: 14 Jobs Processo 3: 8 Jobs Processo 4: 7 Jobs Processo 5: 9 Jobs Processo 6: 12 Jobs Processo 7: 13 Jobs 444|333|555|000|111|666|777|222|444|333|555|000|111|666|777|222|4|33|555|000|111|666|777|222|00|111|666|777|222|7|22 Tempo de uso da CPU: 347 Tempo total de espera: 73 Numero de Processos: Processo 0: 13 Jobs Processo 1: 7 Jobs Processo 2: 11 Jobs Processo 3: 13 Jobs Processo 4: 4 Jobs Processo 5: 4 Jobs Processo 6: 8 Jobs Processo 7: 7 Jobs Processo 8: 12 Jobs 444|555|111|777|666|222|888|000|333|4|5|111|777|666|222|888|000|333|1|7|66|222|888|000|333|22|888|000|333|0|3 Tempo de uso da CPU: 304 Tempo total de espera: 67 Numero de Processos: Processo 0: 9 Jobs Processo 1: 9 Jobs Processo 2: 12 Jobs Processo 3: 5 Jobs Processo 4: 6 Jobs Processo 5: 6 Jobs Processo 6: 9 Jobs Processo 7: 8 Jobs Processo 8: 8 Jobs Processo 9: 8 Jobs 333|444|555|777|888|999|000|111|666|222|33|444|555|777|888|999|000|111|666|222|77|88|99|000|111|666|222|222 Tempo de uso da CPU: 235 Tempo total de espera: 72 Numero de Processos: Processo 0: 10 Jobs Processo 1: 7 Jobs Processo 2: 9 Jobs Processo 3: 6 Jobs Processo 4: 9 Jobs Processo 5: 8 Jobs Processo 6: 15 Jobs Processo 7: 8 Jobs Processo 8: 7 Jobs Processo 9: 15 Jobs Processo 10: 15 Jobs 333|111|888|555|777|222|444|000|666|999|101010|333|111|888|555|777|222|444|000|666|999|101010|1|8|55|77|222|444|000|666|999|101010|0|666|999|101010|666 |999|101010 Tempo de uso da CPU: 421 Tempo total de espera: 94 Numero de Processos: Processo 0: 4 Jobs Processo 1: 13 Jobs Processo 2: 10 Jobs Processo 3: 7 Jobs Processo 4: 10 Jobs Processo 5: 12 Jobs Processo 6: 5 Jobs Processo 7: 6 Jobs Processo 8: 6 Jobs Processo 9: 7 Jobs Processo 10: 4 Jobs Processo 11: 8 Jobs 000|101010|666|777|888|333|999|111111|222|444|555|111|0|10|66|777|888|333|999|111111|222|444|555|111|3|9|1111|222|444|555|111|2|4|555|111|1 Tempo de uso da CPU: 309 Tempo total de espera: 84 Numero de Processos: Processo 0: 11 Jobs Processo 1: 5 Jobs Processo 2: 9 Jobs Processo 3: 14 Jobs Processo 4: 12 Jobs Processo 5: 7 Jobs Processo 6: 15 Jobs Processo 7: 8 Jobs Processo 8: 10 Jobs Processo 9: 12 Jobs Processo 10: 9 Jobs Processo 11: 6 Jobs Processo 12: 5 Jobs 111|121212|111111|555|777|222|101010|888|000|444|999|333|666|11|1212|111111|555|777|222|101010|888|000|444|999|333|666|5|77|222|101010|888|000|444|999| 333|666|8|00|444|999|333|666|33|666 Tempo de uso da CPU: 456 Tempo total de espera: 118 Compartilhar este post Link para o post Compartilhar em outros sites
Brayan Rastelli 2 Denunciar post Postado Junho 1, 2010 é.. realmente.. agora ta perfect http://forum.imasters.com.br/public/style_emoticons/default/joia.gif porém ontem acabei criando uma outra solução, add uma variavel global t = 0 no for do int main: for ( i = 0;i < np;i++ ) { proc[i].jobs = 4+rand()%12; proc[i].nproc = i; t = t + proc[i].jobs; } e o printjob ficou assim: void printjob(PROC *vet) { int i, j; do{ for (i = 0; i < np; i++ ) { for(j = 0; j < maxjobs; j++ ) { if(vet[i].jobs > 0){ printf("%d",i+1); t--; vet[i].jobs--; } } printf("|"); } } while(t > 0); } valeeu http://forum.imasters.com.br/public/style_emoticons/default/clap.gif Compartilhar este post Link para o post Compartilhar em outros sites