Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

_Isis_

[Resolvido] Criar um round robin

Recommended Posts

Coloque uma variável que conta quantas vezes foi impresso dentro da struct.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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

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

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

é.. 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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.