Example #1
0
void insertarProceso(proceso* proceso) {
	int comienzoDelHueco;
	comienzoDelHueco = hayHuecoDondeCabeProceso(proceso);
	if (comienzoDelHueco >= 0) {
		proceso->comienzo = comienzoDelHueco;
		actualizarBitMap(proceso, comienzoDelHueco);
		agregarProcesoAListaSwap(proceso);
	} else {
		compactar();
		comienzoDelHueco = hayHuecoDondeCabeProceso(proceso);
		proceso->comienzo = comienzoDelHueco;
		actualizarBitMap(proceso, comienzoDelHueco);
		agregarProcesoAListaSwap(proceso);
	}

}
Example #2
0
void moverAPrimeraPosicionProceso(void) {
	proceso* procesoAMover = listaSwap;
	moverPaginas(procesoAMover, 0);
	eliminarDelBitMapLasPaginasDelProceso(procesoAMover);
	procesoAMover->comienzo = 0;
	actualizarBitMap(procesoAMover, 0);
}
Example #3
0
void unirProcesos(proceso* procesoAnterior, proceso* procesoAJuntar) {
	int nuevoComienzo = procesoAnterior->comienzo + 1;
	moverPaginas(procesoAJuntar, nuevoComienzo);
	eliminarDelBitMapLasPaginasDelProceso(procesoAJuntar);
	procesoAJuntar->comienzo = nuevoComienzo;
	actualizarBitMap(procesoAJuntar, nuevoComienzo);

}
void iniciar_programa(void *msj) {

	int *respuesta = reservarMemoria(INT);
	*respuesta = PERMITIDO;

	inicioPrograma *mensaje = (inicioPrograma*) msj;
	int pid = mensaje->pid;
	int paginas = mensaje->paginas;
	log_info(logger, "[INICIAR_PROGRAMA]: (#pid: %d) (#paginas: %d).", pid, paginas);

	if(paginasLibresTotales >= paginas) { // se puede alojar el proceso aunque sea compactando

		int posLibre = buscarPosLibresEnBitMap(paginas);
		if(posLibre != ERROR) { // se encontraron espacios contiguos para alojar proceso

			paginasLibresTotales -= paginas;
			int pagina;
			for(pagina=0; pagina < paginas ; pagina++) {
				tablaPaginas[posLibre].pid = pid;
				tablaPaginas[posLibre].pagina = pagina;
				tablaDeBitMap[posLibre].ocupada = 1;
				posLibre++;
			}

		} else { // no se encontraron espacios contiguos para alojar proceso

			dormir(config->retardoCompactacion);
			compactar();

			actualizarBitMap();

			int posLibre = buscarPosLibresEnBitMap(paginas);
			int pagina;
			for(pagina=0; pagina < paginas; pagina++) {
				tablaPaginas[posLibre].pid= pid;
				tablaPaginas[posLibre].pagina = pagina;
				tablaDeBitMap[posLibre].ocupada=1;
				posLibre++;
			}

			paginasLibresTotales -= paginas;
		}

	} else {
		log_info(logger, "[Programa Rechazado]");
		*respuesta = NO_PERMITIDO; // no hay paginas disponibles para satisfacer la demanda
	}

	if(*respuesta == PERMITIDO) {
		log_info(logger, "[Programa Aceptado]");
		int pos = buscarPaginaEnTablaDePaginas(pid, 0);
		avanzarPaginas(pos);
		dormir(config->retardoAcceso);
		// Escribo la totalidad del código en el archivo:
		fwrite(mensaje->contenido, CHAR, strlen(mensaje->contenido), archivoSwap);
	}

	free(mensaje->contenido); mensaje->contenido = NULL;
	free(mensaje); mensaje = NULL;

	aplicar_protocolo_enviar(sockUMC, RESPUESTA_PEDIDO, respuesta);
	free(respuesta); respuesta = NULL;
}