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); } }
/* SEU PROGRAMA - MAIN */ int main() { int op_tot = -1, mem_total, i, mem_arquivo, erro = 0, inserido = 0; char operacao[8], arquivo[11], memoria[7], arq_tamanho[7]; Lista *disco_memoria, *aux_disco; /* Entrada da quantidade de operacoes */ scanf("%d", &op_tot); while(op_tot != 0){ erro = 0; /* Entrada da memoria total do disco */ scanf("%s", memoria); printf("memoria %s\n", memoria); mem_total = interpretar_memoria(memoria); /* Criacao da lista de alocacao de arquivos */ disco_memoria = (Lista*)malloc(sizeof(Lista)); InicializaLista(disco_memoria, mem_total); /* Execucao das operacoes */ for(i=0; i < op_tot; i++){ /* Ponteiro auxiliar para manipulacao da lista */ aux_disco = disco_memoria; scanf("%s", operacao); scanf("%s", arquivo); printf("%s em %s ", operacao, arquivo); /* Operacao insere */ if(!strcmp("insere", operacao)){ /* Entrada do tamanho do arquivo */ scanf("%s", arq_tamanho); printf("de tamanho %s ", arq_tamanho); mem_arquivo = interpretar_memoria(arq_tamanho); printf("que eh igual a %d\n", mem_arquivo); /* Tentativa de inserir arquivo em espacos vazios entre nos */ inserido = 0; /* Percorrer ate o fim porque senao inserir agora eh preciso inserir no fim */ while(aux_disco->prox != NULL){ if((aux_disco->prox->memoria >= mem_arquivo) && !(aux_disco->prox->ocupado) && !inserido){ InsereProx(aux_disco, mem_arquivo, arquivo); disco_memoria->memoria -= mem_arquivo; inserido = 1; printf("inserindo entre nohs %d e inserido vale %d\n", mem_arquivo, inserido); } aux_disco = aux_disco->prox; } /* Caso nao seja encontrado espaco entre arquivos e ainda exista * espaco na memoria, inserir no fim da lista */ if(disco_memoria->memoria - mem_arquivo >= 0 && !inserido){ InsereProx(aux_disco, mem_arquivo, arquivo); disco_memoria->memoria -= mem_arquivo; inserido = 1; printf("inserindo no fim %d e inserido vale %d\n", mem_arquivo, inserido); } /* Caso nao seja possivel inserir em nenhuma posicao, otimizar memoria */ if(!inserido){ /* Auxiliar volta para o inicio da lista */ aux_disco = disco_memoria; /* Procura espacos vazios entre os arquivos */ while(aux_disco->prox != NULL){ if(!aux_disco->prox->ocupado){ /* Retira o noh vazio para otimizar a memoria */ operacao_otimiza(aux_disco); disco_memoria->memoria += mem_arquivo; } aux_disco = aux_disco->prox; } /* Testa se eh possivel inserir apos a otimizacao */ if(disco_memoria->memoria - mem_arquivo >= 0){ InsereProx(aux_disco, mem_arquivo, arquivo); disco_memoria->memoria -= mem_arquivo; printf("inserindo pos otimizacao %d\n", mem_arquivo); /* Caso nao seja possivel inserir, acusa erro */ }else{ printf("entrou em %d\n", i+1); erro = 1; } } } /* Operacao remove */ else if(!strcmp("remove", operacao)){ /* Procura arquivo na lista para remocao */ while(strcmp(arquivo, aux_disco->prox->arquivo) && aux_disco->prox != NULL){ aux_disco = aux_disco->prox; } if(aux_disco->prox != NULL && aux_disco->prox->ocupado){ /* Muda o noh para desocupado e passa a memoria desse para o total*/ RemoveProx(aux_disco); disco_memoria->memoria += mem_arquivo; printf("removendo %d\n", mem_arquivo); } } /* Operacao otimiza */ else if(!strcmp("otimiza", operacao)){ /* Procura espacos vazios entre os arquivos */ while(aux_disco->prox != NULL){ if(!aux_disco->prox->ocupado){ /* Retira o noh vazio para otimizar a memoria */ operacao_otimiza(aux_disco); disco_memoria->memoria += mem_arquivo; } aux_disco = aux_disco->prox; } } } if(!erro){ ImprimeLista(aux_disco, mem_total, disco_memoria->memoria); }else{ printf("ERRO: disco cheio\n"); } LiberaLista(disco_memoria); scanf("%d", &op_tot); } 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); } }