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; }
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); }
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); } }
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; }
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; }
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); } }