Пример #1
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);
    }
}
Пример #2
0
/* 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;
}
Пример #3
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);

    }

}