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); } }
void moverAPrimeraPosicionProceso(void) { proceso* procesoAMover = listaSwap; moverPaginas(procesoAMover, 0); eliminarDelBitMapLasPaginasDelProceso(procesoAMover); procesoAMover->comienzo = 0; actualizarBitMap(procesoAMover, 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; }