tipoRespuesta* ejecutarInstruccion(tipoInstruccion* instruccion,t_list* listaDeHuecosOcupados, t_list* listaDeHuecosLibres, tipoConfigSWAP* configuracion){

	tipoRespuesta* respuesta;

	switch (instruccion->instruccion) {
		case INICIAR:
			respuesta = reservarEspacio(listaDeHuecosOcupados,listaDeHuecosLibres,instruccion->pid,instruccion->nroPagina,configuracion->cantidadDePaginas,configuracion->tamanioDePagina,configuracion->nombreDeSWAP);
			break;

		case LEER:
			respuesta = leerPagina(listaDeHuecosOcupados,instruccion->pid,instruccion->nroPagina,configuracion->tamanioDePagina,configuracion->nombreDeSWAP);
			break;

		case ESCRIBIR:
			respuesta = escribirPagina(listaDeHuecosOcupados,instruccion->pid,instruccion->texto,instruccion->nroPagina,configuracion->tamanioDePagina,configuracion->nombreDeSWAP);
			break;

		case FINALIZAR:
			respuesta = liberarEspacio(listaDeHuecosOcupados,listaDeHuecosLibres,instruccion->pid);
			break;
	}

	return respuesta;

}
tipoRespuesta* ejecutarInstruccion(tipoInstruccion* instruccion,t_list* listaDeHuecosUtilizados,t_list* listaDeHuecosLibres,tipoConfigSWAP* configuracion, t_log* logger, bool* finalizarProceso){

	tipoRespuesta* respuesta;

	switch (instruccion->instruccion) {
		case INICIAR:
			respuesta = reservarEspacio(listaDeHuecosUtilizados,listaDeHuecosLibres,instruccion->pid,instruccion->nroPagina,configuracion->cantidadDePaginas,configuracion->tamanioDePagina,configuracion->nombreDeSWAP,configuracion->retardoDeCompactacion, logger);
			break;

		case LEER:
			respuesta = leerPagina(listaDeHuecosUtilizados,instruccion->pid,instruccion->nroPagina,configuracion->tamanioDePagina,configuracion->nombreDeSWAP, logger,configuracion->retardoDeSWAP);
			break;

		case ESCRIBIR:
			respuesta = escribirPagina(listaDeHuecosUtilizados,instruccion->pid,instruccion->texto,instruccion->nroPagina,configuracion->tamanioDePagina,configuracion->nombreDeSWAP, logger,configuracion->retardoDeSWAP);
			break;

		case FINALIZAR:
			respuesta = liberarEspacio(listaDeHuecosUtilizados,listaDeHuecosLibres,instruccion->pid, configuracion->tamanioDePagina, logger,configuracion->nombreDeSWAP);
			break;

		case FINALIZAR_PROCESO:
			respuesta = finalizarProcesoSWAP(finalizarProceso);
			break;
	}

	return respuesta;

}
示例#3
0
void recibir_operaciones_memoria(sock_t* socketMemoria) {

    int32_t finalizar = true;
    int32_t recibido;
    char* pedido_serializado;
    header_t* header = _create_empty_header();

    while(finalizar) {

        recibido = _receive_header(socketMemoria, header);

        if(recibido == ERROR_OPERATION) return;
        if(recibido == SOCKET_CLOSED) {
            socketMemoria = accept_connection(socketServidor);
            //set_operation_code(header, 5);
            header->cod_op=5;
        }

        switch(get_operation_code(header)) {

        case LEER_PAGINA: {
            pedido_serializado = malloc(get_message_size(header));
            recibido = _receive_bytes(socketMemoria, pedido_serializado, get_message_size(header));
            if(recibido == ERROR_OPERATION) return;
            t_pagina* pagina_pedida = deserializar_pedido(pedido_serializado);
            leer_pagina(pagina_pedida);
            sleep(arch->retardo);
            header_t* headerMemoria = _create_header(RESULTADO_OK, sizeof(int32_t)+pagina_pedida->tamanio_contenido);
            int32_t enviado = _send_header(socketMemoria, headerMemoria);
            enviado=_send_bytes(socketMemoria, &pagina_pedida->tamanio_contenido, sizeof(int32_t));
            enviado=_send_bytes(socketMemoria, pagina_pedida->contenido, pagina_pedida->tamanio_contenido);
            log_debug(loggerDebug, "Se leyeron :%d bytes", pagina_pedida->tamanio_contenido);
            if(enviado == ERROR_OPERATION) return;
            free(pagina_pedida->contenido);
            free(pagina_pedida);
            free(pedido_serializado);
            free(headerMemoria);
            break;
        }

        case ESCRIBIR_PAGINA: {
            pedido_serializado = malloc(get_message_size(header));
            recibido = _receive_bytes(socketMemoria, pedido_serializado, get_message_size(header));
            if(recibido == ERROR_OPERATION) return;
            t_pagina* pagina_pedida = deserializar_pedido(pedido_serializado);
            log_debug(loggerDebug, "Me llega a escribir pid: %d, pagina:%d, tam:%d, contenido:%s", pagina_pedida->PID, pagina_pedida->nro_pagina, pagina_pedida->tamanio_contenido, pagina_pedida->contenido);
            int32_t resultado= escribir_pagina(pagina_pedida);
            sleep(arch->retardo);
            if (resultado == RESULTADO_ERROR) {
                header_t* headerMemoria = _create_header(RESULTADO_ERROR, 0);
                int32_t enviado = _send_header(socketMemoria, headerMemoria);
                if(enviado == ERROR_OPERATION) return;
                free(headerMemoria);
                return;
            } else if (resultado == RESULTADO_OK) {
                header_t* headerMemoria = _create_header(RESULTADO_OK, 0);
                int32_t enviado = _send_header(socketMemoria, headerMemoria);
                if(enviado == ERROR_OPERATION) return;
                free(headerMemoria);
            }
            free(pedido_serializado);
            free(pagina_pedida);
            break;
        }

        case RESERVAR_ESPACIO: {
            t_pedido_memoria* pedido_memoria = malloc(sizeof(t_pedido_memoria));
            recibido = _receive_bytes(socketMemoria, &(pedido_memoria->pid), sizeof(int32_t));
            if (recibido == ERROR_OPERATION)return;

            recibido = _receive_bytes(socketMemoria, &(pedido_memoria->cantidad_paginas),sizeof(int32_t));
            if (recibido == ERROR_OPERATION)return;

            log_debug(loggerDebug, "Recibi este pedido: %d y cant paginas %d", pedido_memoria->pid, pedido_memoria->cantidad_paginas);

            int32_t operacionValida= reservarEspacio(pedido_memoria);
            sleep(arch->retardo);
            if (operacionValida == RESULTADO_ERROR) {
                header_t* headerMemoria = _create_header(RESULTADO_ERROR, 0);
                int32_t enviado = _send_header(socketMemoria, headerMemoria);
                if(enviado == ERROR_OPERATION) return;
                log_debug(loggerDebug, "No se reservo el espacio solicitado");
                free(headerMemoria);

            } else if (operacionValida == RESULTADO_OK) {
                header_t* headerMemoria = _create_header(RESULTADO_OK, 0);
                int32_t enviado = _send_header(socketMemoria, headerMemoria);
                if(enviado == ERROR_OPERATION) return;
                log_info(loggerInfo, ANSI_COLOR_GREEN"Se reservo el espacio solicitado" ANSI_COLOR_RESET);
                free(headerMemoria);
            }
            break;
        }

        case BORRAR_ESPACIO: {
            int32_t PID;
            recibido = _receive_bytes(socketMemoria, &(PID), sizeof(int32_t));
            if (recibido == ERROR_OPERATION)return;
            int32_t operacionValida= borrarEspacio(PID);
            sleep(arch->retardo);
            if (operacionValida == RESULTADO_ERROR) {
                header_t* headerMemoria = _create_header(RESULTADO_ERROR, 0);
                int32_t enviado = _send_header(socketMemoria, headerMemoria);
                if(enviado == ERROR_OPERATION) return;
                log_debug(loggerDebug, "Finalizado erroneo");
                free(headerMemoria);
                return;
            } else if (operacionValida == RESULTADO_OK) {
                header_t* headerMemoria = _create_header(RESULTADO_OK, 0);
                int32_t enviado = _send_header(socketMemoria, headerMemoria);
                if(enviado == ERROR_OPERATION) return;
                log_debug(loggerDebug, "Finalizado correcto, se envia:%d", RESULTADO_OK);
                free(headerMemoria);
            }
            break;
        }

        case RECONEXION : {
            log_info(loggerInfo, ANSI_COLOR_BOLDYELLOW "Se conecto una nueva instancia de la memoria" ANSI_COLOR_RESET);
            break;
        }

        default: {
            log_error(loggerError, ANSI_COLOR_BOLDRED "Se recibió un codigo de operación no valido"ANSI_COLOR_RESET);
        }

        }
    }
    free(header);
}
示例#4
0
//Aplicamos todos los algoritmos a todos los archivos
void TodosArchivos(){
    int n, costo=0;
    int nficheros=20;
    char *nombres[nficheros];
    double tiempo;
    DarNombres(nombres);

    int finales[nficheros][5];
    float tiempos[nficheros][5];
		int tamanio[nficheros];
		int resultadosoptimos[nficheros];
		resultadosoptimos[0]=2192;
		resultadosoptimos[1]=14142;
		resultadosoptimos[2]=6194;
		resultadosoptimos[3]=3796;
		resultadosoptimos[4]=130;
		resultadosoptimos[5]=116;
		resultadosoptimos[6]=64;
		resultadosoptimos[7]=88700;
		resultadosoptimos[8]=360630;
		resultadosoptimos[9]=15812;
		resultadosoptimos[10]=23386;
		resultadosoptimos[11]=90998;
		resultadosoptimos[12]=115534;
		resultadosoptimos[13]=140691;
		resultadosoptimos[14]=1855928;
		resultadosoptimos[15]=13499184;
		resultadosoptimos[16]=15844731;
		resultadosoptimos[17]=441786736;
		resultadosoptimos[18]=43849646;
		resultadosoptimos[19]=7620628;
    double desviacion_total[5];
		double desviaciones[nficheros][5];

    for (int i=0; i<nficheros; i++){
        n = leerNumeroDatos(nombres[i]);
        reservarEspacio(n);
        obtenerMatrices(nombres[i], mat1, mat2);
        tamanio[i]=n;

			  //Aplico Greedy
        start_timers();
        alg_Greedy(n, mat1, mat2, sol, &costo);
        tiempo = elapsed_time();
        finales[i][0]=costo;
        tiempos[i][0]=tiempo;
        desviaciones[i][0]=(finales[i][0] - resultadosoptimos[i])*10;
        desviaciones[i][0] = desviaciones[i][0]/resultadosoptimos[i];
        desviaciones[i][0] = desviaciones[i][0]*10;

			  //Aplico AGG posicional
        start_timers();
        alg_Memetico(n, mat1, mat2, sol, &costo,0,0);
        tiempo = elapsed_time();
        finales[i][1]=costo;
        tiempos[i][1]=tiempo;
        desviaciones[i][1]=(finales[i][1] - resultadosoptimos[i])*10;
        desviaciones[i][1] = desviaciones[i][1]/resultadosoptimos[i];
        desviaciones[i][1] = desviaciones[i][1]*10;

		    alg_Greedy(n, mat1, mat2, sol, &costo);
				//Aplico AGG posicional
				start_timers();
				alg_Memetico(n, mat1, mat2, sol, &costo,0,1);
				tiempo = elapsed_time();
				finales[i][2]=costo;
				tiempos[i][2]=tiempo;
				desviaciones[i][2]=(finales[i][2] - resultadosoptimos[i])*10;
				desviaciones[i][2] = desviaciones[i][2]/resultadosoptimos[i];
				desviaciones[i][2] = desviaciones[i][2]*10;

	    	alg_Greedy(n, mat1, mat2, sol, &costo);
				//Aplico AGG posicional
				start_timers();
				alg_Memetico(n, mat1, mat2, sol, &costo,0,2);
				tiempo = elapsed_time();
				finales[i][3]=costo;
				tiempos[i][3]=tiempo;
				desviaciones[i][3]=(finales[i][3] - resultadosoptimos[i])*10;
				desviaciones[i][3] = desviaciones[i][3]/resultadosoptimos[i];
				desviaciones[i][3] = desviaciones[i][3]*10;

  }

   int cont1=0,cont2=0,cont3=0,cont4=0, cont5=0;
    for (int i=0; i<nficheros; i++){
        int mejor=0;
        if (finales[i][mejor]>=finales[i][1])
            mejor=1;
		    if (finales[i][mejor]>=finales[i][2])
		        mejor=2;
		    if (finales[i][mejor]>=finales[i][3])
		        mejor=3;
        if (mejor == 0) cont1++;
        if (mejor == 1) cont2++;
        if (mejor == 2) cont3++;
        if (mejor == 3) cont4++;

        printf("Problema: %s con n: %d\n",nombres[i],tamanio[i]);
        printf("\tGreeedy: %d en %f\n", finales[i][0],tiempos[i][0]);
        printf("\tAM0: %d en %f\n", finales[i][1],tiempos[i][1]);
        printf("\tAM1: %d en %f\n", finales[i][2],tiempos[i][2]);
        printf("\tAM2: %d en %f\n", finales[i][3],tiempos[i][3]);
    }
    printf("\nNuevo de veces que es mejor:\n Greedy: %d\n AM0: %d\n AM1: %d\n AM2: %d\n",
		       cont1, cont2, cont3, cont4);
    for(int j=0; j< nficheros; j++){
	desviacion_total[0] += desviaciones[j][0];
	desviacion_total[1] += desviaciones[j][1];
	desviacion_total[2] += desviaciones[j][2];
	desviacion_total[3] += desviaciones[j][3];
   }
   desviacion_total[0] = desviacion_total[0]/nficheros;
   desviacion_total[1] = desviacion_total[1]/nficheros;
   desviacion_total[2] = desviacion_total[2]/nficheros;
   desviacion_total[3] = desviacion_total[3]/nficheros;

   printf("\nDesviaciones: \n Greedy: %f\n AM0: %f\n AM1: %f\n AM2: %f\n",
		desviacion_total[0], desviacion_total[1], desviacion_total[2], desviacion_total[3]);
}
示例#5
0
int main(int argc, char * argv[])
{
    int todos = 1;
    if (todos == 1){
        TodosArchivos();
        return 0;
    }

	int n = leerNumeroDatos(argv[1]);
	if (n > 0) {
		reservarEspacio(n);
		obtenerMatrices(argv[1], mat1, mat2);
    double tiempo;
    int costo;
		//Aplico Greedy
    start_timers();
		alg_Greedy(n, mat1, mat2, sol, &costo);
		tiempo = elapsed_time();
		printf("Greedy de %d datos: Coste-> %d. Tiempo-> %fs.\n", n, costo, tiempo);

		printf("Solucion encontrada: ");
		for (int i=0; i<n; i++){
			printf("%d ", sol[i]);
		}
		printf("\n\n");

		//Aplico AM0
    start_timers();
		alg_Memetico(n, mat1, mat2, sol, &costo, 0,0); 
    tiempo = elapsed_time();
		printf("Algoritmos Memeticos 0 de %d datos: Coste-> %d. Tiempo-> %fs.\n", n, costo, tiempo);
		printf("Solucion encontrada: ");
		for (int i=0; i<n; i++){
			printf("%d ", sol[i]);
		}
		printf("\n\n");

		alg_Greedy(n, mat1, mat2, sol, &costo);
		//Aplico AM1
		start_timers();
		alg_Memetico(n, mat1, mat2, sol, &costo, 0,1); 
		tiempo = elapsed_time();
		printf("Algoritmos Memeticos 1 de %d datos: Coste-> %d. Tiempo-> %fs.\n", n, costo, tiempo);
		printf("Solucion encontrada: ");
		for (int i=0; i<n; i++){
			printf("%d ", sol[i]);
		}
		printf("\n\n");


		alg_Greedy(n, mat1, mat2, sol, &costo);
		//Aplico AM2
		start_timers();
		alg_Memetico(n, mat1, mat2, sol, &costo, 0,2); 
		tiempo = elapsed_time();
		printf("Algoritmos Memeticos 2 de %d datos: Coste-> %d. Tiempo-> %fs.\n", n, costo, tiempo);
		printf("Solucion encontrada: ");
		for (int i=0; i<n; i++){
			printf("%d ", sol[i]);
		}
		printf("\n\n");


	}

  return 0;
}