示例#1
0
文件: ab.c 项目: jlessa/AVB
TAB *Insere(TAB *T, int k, int t){
  if(Busca(T,k)) return T;
  if(!T){
    T=Cria(t);
    T->chave[0] = k;
    T->nchaves=1;
    return T;
  }
  if(T->nchaves == (2*t)-1){
    TAB *S = Cria(t);
    S->nchaves=0;
    S->folha = 0;
    S->filho[0] = T;
    S = Divisao(S,1,T,t);
    S = Insere_Nao_Completo(S,k,t);
    return S;
  }
  T = Insere_Nao_Completo(T,k,t);
  return T;
}
示例#2
0
void RemoveUltimo(TipoLista *Lista){

    if (Lista -> Primeiro == Lista -> Ultimo){
        Cria(Lista);
        free(Lista -> Primeiro);
        return;
    }

    TipoApontador Aux;

    Aux = Lista -> Ultimo;
    Lista -> Ultimo = Aux -> Anterior;
    Lista -> Ultimo -> Prox = NULL;
    Lista -> len--;
    Lista -> paginas_livres++;

    free(Aux);
}
示例#3
0
void RemovePrimeiro(TipoLista *Lista){

    // Se for o único elemento da lista
    if (Lista -> Primeiro -> Prox == Lista -> Ultimo){
        LiberaLista(Lista);
        Cria(Lista);
        return;
    }
    else{
        TipoApontador Aux;

        Aux = Lista -> Primeiro -> Prox;
        Lista -> Primeiro -> Prox = Aux -> Prox;
        Lista -> Primeiro -> Prox -> Anterior = Aux -> Anterior;
        Lista -> len--;
        Lista -> paginas_livres++;

        free(Aux);
    }
}
示例#4
0
文件: ab.c 项目: jlessa/AVB
TAB *Divisao(TAB *x, int i, TAB* y, int t){
  int j;
  TAB *z=Cria(t);
  z->nchaves= t - 1;
  z->folha = y->folha;

  for(j=0;j<t-1;j++) z->chave[j] = y->chave[j+t];
  if(!y->folha){
    for(j=0;j<t;j++){
      z->filho[j] = y->filho[j+t];
      y->filho[j+t] = NULL;
    }
  }
  y->nchaves = t-1;
  for(j=x->nchaves; j>=i; j--) x->filho[j+1]=x->filho[j];
  x->filho[i] = z;
  for(j=x->nchaves; j>=i; j--) x->chave[j] = x->chave[j-1];
  x->chave[i-1] = y->chave[t-1];
  x->nchaves++;
  return x;
}
示例#5
0
int Insere(TLista *lista, int tamanho){
    int cont = 0;
    TNo *aux = Cria(tamanho, lista->QuantidadeDeProcessos);
   if(lista->Inicio == NULL){
   		//printf("TAMANHO DO NO %d", aux->tam);
   		aux->code = -2;
        lista->Inicio = aux;
        lista->Fim = lista->Inicio;
        lista->UltimoPesquisado = lista->Inicio;
        lista->QuantidadeDeProcessos++;
        printf("Inseriu o primeiro: %d \n", tamanho);
        return 1;

	}else{
        //ALOCA PROCESSO PARA MEMÓRIA JÁ DISPONVEL
        TNo *aux2 = lista->UltimoPesquisado;
		TNo *menor = NULL;
        while(cont < lista->QuantidadeDeProcessos){
            if(aux2->disp == SIM){

                if(aux->tam <= aux2->tam){
					if(menor == NULL){
						menor = aux2;
					}
					else if(aux2->tam < menor->tam){
							menor = aux2;
					}

                }
            }
            cont++;
            aux2 = aux2->prox;
        }
			if(menor != NULL){
					aux->disp = SIM;
	                aux->tam = menor->tam - tamanho;
					aux->prox = menor->prox;
                    menor->prox = aux;

					menor->code = lista->QuantidadeDeProcessos;
                    menor->disp = NAO;
                    menor->tam = tamanho;

					lista->UltimoPesquisado = aux2;
					//lista->Inicio->tam-= tamanho;
                    printf("Inseriu %d \n", tamanho);

					lista->QuantidadeDeProcessos++;
					return 1;
			}


            //Chegou ao fim da lista
            if(aux->tam <= lista->Inicio->tam){
                lista->Fim->prox = aux;
                aux->prox = lista->Inicio;
                lista->Inicio->tam -= aux->tam;
                lista->Fim = aux;

                lista->QuantidadeDeProcessos++;
                printf("Inseriu %d \n", tamanho);
                return 1;

			}

    }
    printf("Nao ha memoria suficiente para alocar um processo de tamanho %d\n", tamanho);
    return 0;
}
示例#6
0
int main(int argc, char *argv[]){


    if (argc == 3){ // Nome do arquivo (argv[0]) mais os dois parâmetros

        char entrada[40] = "entrada/";
        char saida[40] = "saida/";
        int k; // instâncias a serem simuladas
        int tam_mem_fis, tam_pagina, n_acessos; // tamanho (em bytes) da memória física, de cada página e o número n de acessos
        int num_paginas; // Quantas páginas a memória primária terá
        int posicao_acessada;

        TipoCelula pagina_atual;

        strcat(entrada,argv[1]);
        strcat(saida,argv[2]);

        FILE * inp = abreArquivoLeitura(entrada);
        FILE * out = abreArquivoEscrita(saida);

        fscanf(inp, "%d ", &k); // Lê as k instâncias de problemas

        for (int l=0; l<k; l++){

            fscanf(inp, "%d %d %d\n", &tam_mem_fis, &tam_pagina, &n_acessos);

            num_paginas = tam_mem_fis / tam_pagina; // Num de páginas é a razão do tam da memória com o tamanho de cada página

            TipoLista memoria_fifo, memoria_lru, memoria_lfu;
            Cria(&memoria_fifo);
            Cria(&memoria_lru);
            Cria(&memoria_lfu);
            memoria_fifo.paginas_livres = num_paginas;
            memoria_lru.paginas_livres = num_paginas;
            memoria_lfu.paginas_livres = num_paginas;


            for (int a=0; a<n_acessos; a++){

                fscanf(inp, "%d", &posicao_acessada);

                pagina_atual.pagina = posicao_acessada / tam_pagina;

                pagina_atual.num_acessos = 1;

                FIFO(&memoria_fifo, pagina_atual);
                LRU(&memoria_lru, pagina_atual);
                LFU(&memoria_lfu, pagina_atual);
            }

            fprintf(out,"%d ",memoria_fifo.misses);
            fprintf(out,"%d ",memoria_lru.misses);
            fprintf(out,"%d\n",memoria_lfu.misses);

            LiberaLista(&memoria_fifo);
            LiberaLista(&memoria_lru);
            LiberaLista(&memoria_lfu);


        }

        fechaArquivo(inp);
        fechaArquivo(out);

    }

}