예제 #1
0
void inicializar_memoria() {

	memoria_size = umc_config->frames_size * umc_config->cant_frames;

//	memoria_principal = malloc(memoria_size);
//	memset(memoria_principal, 0, memoria_size);
	memoria_principal = (void *) calloc(umc_config->cant_frames,
			umc_config->frames_size);

//	log_trace(logger, "Se ha creado el espacio de memoria de %d bytes",
//			memoria_size);

	frames_memoria = list_create();
	int indice_frame = 0;

	for (indice_frame = 0; indice_frame < umc_config->cant_frames;
			indice_frame++) {
		t_mem_frame * frame = malloc(sizeof(t_mem_frame));

		frame->pagina = -1;
		frame->pid = -1;
		frame->libre = 1;

		list_add_in_index(frames_memoria, indice_frame, frame);
	}
}
예제 #2
0
void iniciar(uint8_t idProc, uint8_t cantPag, int socketCPU) {
	uint8_t contador;
	t_TablaDePaginas* tablaDePag;
	t_PID * estructuraEnvio;
	estructuraEnvio = crearPID();

	for (contador = 0; contador < cantPag; contador++) {
		tablaDePag = iniciarTablaDePaginas();
		tablaDePag->idProc = idProc;
		tablaDePag->paginaDelProceso = contador;
		tablaDePag->idMarco = variableIdMarco;
		tablaDePag->bitPagModificada = 0;
		tablaDePag->bitPresencia = 0;
		pthread_mutex_lock(&mutexTablaPags);
		list_add(listaTablaDePag, tablaDePag);
		pthread_mutex_unlock(&mutexTablaPags);

		variableIdMarco++;
	}

	estructuraEnvio->PID = idProc;

	uint8_t* cero = malloc(sizeof(uint8_t));
	*cero = 0;
	list_add_in_index(listaIndices, idProc, cero);

	enviarRtaIniciarOkCPU(estructuraEnvio, socketCPU);

}
void list_add_order_by(t_list* list, void* data, int(*isBigger)(void*,void*)){

	int index=0;

	if(list_is_empty(list)){

		list_add_in_index(list,0,data);
		return;
	}
	while((index<list_size(list)))
		if ((*isBigger)((void*)list_get(list,index), data))
			index++;
		else
			break;
	list_add_in_index(list,index,data);
	return;
}
void leerRegistroDeUltimoArchivoQueEntregoRegistro(ArchivoApareado *archivo)
{
	list_remove(archivo->listaRegistrosLeidos, archivo->indiceArchivoQueEntregaRegistro);

	Archivo *ultimoArchivoQueEntregoRegistro = list_get(archivo->listaArchivos,
														archivo->indiceArchivoQueEntregaRegistro);

	list_add_in_index(archivo->listaRegistrosLeidos,
			archivo->indiceArchivoQueEntregaRegistro,
			obtenerRegistro(ultimoArchivoQueEntregoRegistro));
}
void ubico_al_principio(pagina_t* pag){
	//lock_lista_indice_paginas();
	uint64_t id_inicial = pag->id_en_indice;
	list_remove(get_indice_paginas(), id_inicial);
	list_add_in_index(get_indice_paginas(), 0, pag);
	//unlock_lista_indice_paginas();

	// reasigno id en indice de los demas
	_reasigno_indices(id_inicial);

	pag->id_en_indice = 0;
}
예제 #6
0
infoNodo* avanzarClock(infoNodo* worker, t_list* listaNodos){
	bool nodoConNumero(infoNodo* nodo){
		return nodo->numero == worker->numero;
	}

	infoNodo* siguienteWorker = malloc(sizeof(infoNodo));
	list_remove_by_condition(listaNodos, (void*)nodoConNumero);
	list_add_in_index(listaNodos, list_size(listaNodos), worker);

	siguienteWorker = list_get(listaNodos, 0);


	return siguienteWorker;
}
//nodo ordenado por PID
void insertarNodoOrdenadoEnTLB(t_tlb*unNodo) {
	int contador = 0;
	if (list_size(TLB) == 0)
		list_add(TLB, unNodo);
	else {
		t_tlb*nodoActual = list_get(TLB, contador);
		while (!(nodoActual->pid < unNodo->pid || contador < list_size(TLB))) {
			contador++;
			if (contador == list_size(TLB)) {
				list_add(TLB, unNodo);
				break;
			}
			nodoActual = list_get(TLB, contador);
		}
		if (contador != list_size(TLB))
			list_add_in_index(TLB, contador, unNodo);
	}
}
예제 #8
0
int almacenar_particion(t_memoria segmento, char id, int tamanio, t_memoria contenido) {
	// TODO: ver si no hay otro posible error.
	if(obtenerPorId(listaParticiones, id) != NULL || tamanio > tamanioTotal) {
		return ASIGNAR_MEMORIA_ERROR;
	}

	int inicio = buscarEspacio(listaParticiones, tamanio);
	if(NO_HAY_PARTICION_LIBRE == inicio) {
		return ASIGNAR_MEMORIA_SIN_LUGAR;
	}

	int index = buscarIndiceEnBaseAlInicio(listaParticiones, inicio);

	t_particion* nuevaParticion = (t_particion*) malloc(sizeof(t_particion));
	(*nuevaParticion).id = id;
	(*nuevaParticion).inicio = inicio;
	(*nuevaParticion).tamanio = tamanio;
	(*nuevaParticion).dato = (char*) (segmento + inicio);
	(*nuevaParticion).libre = OCUPADO;

	// Copiamos el contenido:
	int pos;
	for(pos = 0; pos < tamanio; pos++) {
		*((*nuevaParticion).dato + pos) = *(contenido + pos);
	}

	t_particion* hueco = (t_particion*) list_replace(listaParticiones, index, (void*) nuevaParticion);

	// Si queda lugar libre, se genera un nuevo hueco:
	if((*hueco).tamanio > tamanio) {
		t_particion* nuevoHueco = (t_particion*) malloc(sizeof(t_particion));
		(*nuevoHueco).id = ID_UNDEFINED;
		(*nuevoHueco).inicio = inicio + tamanio;
		(*nuevoHueco).tamanio = (*hueco).tamanio - tamanio;
		(*nuevoHueco).dato = (char*) (segmento + tamanio + inicio);
		(*nuevoHueco).libre = LIBRE;

		list_add_in_index(listaParticiones, index + 1, (void*) nuevoHueco);
	}

	free(hueco);
	return ASIGNAR_MEMORIA_SUCCESS;
}
예제 #9
0
void terminaDeFormaAbortiva(int pid_local) {
	//Ak aviso a consola
	int esEl_Pid(pcb_t* pcb_compara) {
		return (*pcb_compara->PID == pid_local);
	}
	printf("Se termino un CPU de forma abortiva\n");
	if (pid_local == -1) {

	} else {
		t_sock_mje* socketConsola;
		pthread_mutex_lock(&sem_l_Exec);
		pcb_t* pcb_elegido = list_remove_by_condition(proc_Exec,
				(void*) esEl_Pid);
		pthread_mutex_unlock(&sem_l_Exec);
		if(pcb_elegido == NULL){
			pthread_mutex_lock(&sem_temp);
				pcb_elegido = list_remove_by_condition(temp,
						(void*) esEl_Pid);
			pthread_mutex_unlock(&sem_temp);
			pthread_mutex_lock(&sem_l_Ready);
				list_add_in_index(proc_Ready, 0, pcb_elegido);
				log_debug(logger,"PCB con PID %d pasado al principio de READY xfin CPU",pid_local);
			pthread_mutex_unlock(&sem_l_Ready);
		}else{
		log_debug(logger, "PCB con PID %d sacado de EXEC xfin Proceso",
				pid_local);
		pthread_mutex_unlock(&sem_l_Exec);
		pthread_mutex_lock(&sem_l_Reject);
		list_add(proc_Reject, pcb_elegido);
		log_debug(logger, "PCB con PID %d pasado a EXIT xfin Proceso",
				pid_local);
		pthread_mutex_unlock(&sem_l_Reject);
		pthread_mutex_lock(&sem_pid_consola);
		socketConsola = dictionary_get(dict_pid_consola, &pid_local);
		pthread_mutex_unlock(&sem_pid_consola);
		free(socketConsola->mensaje);
		socketConsola->mensaje = strdup("123456");
		sem_post(&sem_REJECT_dispo);}
	}
	int a = 100;
	pthread_exit(&a);
}
예제 #10
0
int almacenar_particion(t_memoria segmento, char id, int tamanio, char* contenido) {
	/* Crea una particion dentro del segmento de memoria de tamaño,
	 identificador y contenido especificado. Devuelve el valor numerico -1
	 en caso de error (ej: tamaño de la particion mayor que el tamaño total
	 del segmento, id duplicado, etc.), 1 en caso de exito y 0 en caso de
	 no encontrar una particion libre lo suficientemente grande para
	 almacenar la solicitud. */

	int i, indexParticionMayor, total;
	t_particion* particionAux;
	t_particion particionMayor;
	t_particion* particion;
	t_particion* particionRestante;
	t_particion* ptrAEliminar;

	//particionAux = malloc(sizeof(t_particion)); //no hace falta recive un valor ya allocado en la lista
	particion = malloc(sizeof(t_particion));
	particionRestante = malloc(sizeof(t_particion));

	//Inicializo particionMayor con un tamaño de 0 para después saber si encontré otra mayor, o ninguna disponible
	particionMayor.tamanio = 0;

	if (tamanio > tamanioTotal) {
		//printf("El tamaño de la partición supera el tamaño del segmento. Abortando...\n");
		return 0;
	}

	total = list_size(list_particiones);

	for (i = 0; i < total; i++) {
		particionAux = list_get(list_particiones, i);
		if (particionAux->id == id) {
			//printf("Ya existe una partición con ID = %c. Abortando...\n", id);
			return -1;
		}
	}

	for (i = 0; i < total; i++) {
		particionAux = list_get(list_particiones, i);
		if (particionAux->libre == false) {
			//printf("La partición %c está ocupada\n", particionAux->id);
		} else {
			if (tamanio > particionAux->tamanio) {
				//printf("La partición %c no es lo suficientemente grande (%d a almacenar vs. %d disponible)\n", particionAux->id, tamanio, particionAux->tamanio);
			} else {
				//printf("El tamaño de la partición actual es %d\n", particionAux->tamanio);
				//printf("El tamaño de la mayor partición guardada es %d\n", particionMayor.tamanio);
				if (particionAux->tamanio > particionMayor.tamanio) {
					particionMayor = *particionAux;
					indexParticionMayor = i;
				}
			}
		}
	}

	if (particionMayor.tamanio == 0) {
		//printf("O no había ninguna partición libre, o niguna tenía suficiente espacio para almacenar la nueva partición. Abortando...\n");
		return 0;
	}

	//Saco la partición anterior
	ptrAEliminar = list_remove(list_particiones, indexParticionMayor);
	free(ptrAEliminar);

	//Inicializo la particion
	particion->id = id;
	particion->inicio = particionMayor.inicio;
	particion->tamanio = tamanio;
	particion->dato = &segmento[particion->inicio];
	particion->libre = false;

	//Agrego la partición a la lista
	list_add_in_index(list_particiones, indexParticionMayor, particion);

	//Grabo el dato en memoria la particion
	memcpy(particion->dato, contenido, particion->tamanio);

	//Inicializo la particion restante
	particionRestante->id = '\0';
	particionRestante->inicio = particion->inicio + particion->tamanio;
	particionRestante->tamanio = particionMayor.tamanio - particion->tamanio;
	particionRestante->dato = &segmento[particion->inicio + particion->tamanio];
	particionRestante->libre = true;

	//Agrego la partición restante a la lista si tengo lugar
	if(particionRestante->inicio == tamanioTotal){
		//printf("No tengo más lugar en mi segmento, así que no agregué partición restante a la lista\n");
	} else {
		list_add_in_index(list_particiones, indexParticionMayor, particionRestante);
	}

	//Grabo el dato en memoria la particion restante
	//printf("Grabo el dato en memoria la particion restante\n");
	//memcpy(particionRestante->dato, contenido, particionRestante->tamanio);

	return 1;
}
예제 #11
0
int leerPersistencia()
{
	pthread_mutex_init(&mPersistFile, NULL);
	sem_init(&sPersistencia, 0, 0);

	persistFile = fopen("./FileSystem.persist", "r");
	if (persistFile == NULL) return EXIT_SUCCESS;

	char* linea = malloc(MAX_BUFF_SIZE);
	int ret = 0;
	int index = 1; //El 0 es el directorio raiz que esta por default

	if (buscarSeccion(SECCION_LISTA_DIRS) == EXIT_SUCCESS)
	{
		ret = fgets(linea,MAX_BUFF_SIZE,persistFile);
		while((ret != NULL) && (strstr(linea,"#") == NULL))
		{
			char** lDir = string_split(linea,";");

			t_reg_directorio* dir = malloc(sizeof(t_reg_directorio));
			strcpy(dir->directorio,lDir[0]);
			dir->padre = atoi(lDir[1]);
			list_add_in_index(listaDirs,index,dir);

			ret = fgets(linea,MAX_BUFF_SIZE,persistFile);
			index++;
		}
	}

	if (buscarSeccion(SECCION_LISTA_CONEXIONES) == EXIT_SUCCESS)
	{
		ret = fgets(linea,MAX_BUFF_SIZE,persistFile);
		while((ret != NULL) && (strstr(linea,"#") == NULL))
		{
			char** lConexion = string_n_split(linea, 4, ";");
			Conexion_t* conexion = malloc(sizeof(Conexion_t));

			strcpy(conexion->nombre, lConexion[0]);
			conexion->estado = NO_DISPONIBLE;
			conexion->sockfd = -1;
			conexion->totalBloques = atoi(lConexion[2]);
			conexion->estadoBloques = calloc(conexion->totalBloques,sizeof(bool));
			sem_init(&(conexion->respuestasR),0,1);
			sem_init(&(conexion->respuestasP),0,0);
			pthread_mutex_init(&(conexion->mSocket), NULL);
			pthread_mutex_init(&(conexion->mEstadoBloques), NULL);

			for (int i=0;i<conexion->totalBloques;i++)
			{
				if (lConexion[3][i] == '1')
				{
					conexion->estadoBloques[i] = true;
				}else
				{
					conexion->estadoBloques[i] = false;
				}
			}
			list_add(conexiones,conexion);

			ret = fgets(linea,MAX_BUFF_SIZE,persistFile);
		}
	}


	if (buscarSeccion(SECCION_LISTA_ARCHIVOS) == EXIT_SUCCESS)
	{
		ret = fgets(linea,MAX_BUFF_SIZE,persistFile);
		while((ret != NULL) && (strstr(linea,"#") == NULL))
		{
			char** lArchivo = string_n_split(linea,5,";");
			char** lBloques = string_split(lArchivo[4],"//");
			t_reg_archivo* archivo = malloc(sizeof(t_reg_archivo));
			list_add(listaArchivos,archivo);

			strcpy(archivo->nombre,lArchivo[0]);
			archivo->dirPadre = atoi(lArchivo[1]);
			archivo->estado = NO_DISPONIBLE;
			archivo->tamanio = atoll(lArchivo[3]);
			pthread_mutex_init(&(archivo->mBloques),NULL);
			archivo->bloques = list_create();

			int i = 0;
			char** lUbicaciones;
			while(lBloques[i] != NULL)
			{
				t_list* ubicaciones = list_create();
				list_add_in_index(archivo->bloques, i, ubicaciones);
				lUbicaciones = string_n_split(lBloques[i],3,";");
				while (lUbicaciones[0] != NULL)
				{
					t_ubicacion_bloque* ubicacion = malloc(sizeof(t_ubicacion_bloque));
					ubicacion->nodo = getConexionByNombre(lUbicaciones[0]);
					ubicacion->bloque = atoi(lUbicaciones[1]);
					list_add(ubicaciones,ubicacion);

					if ((lUbicaciones[2] != NULL) && (strcmp(lUbicaciones[2],"\n") != 0))
					{
						lUbicaciones = string_n_split(lUbicaciones[2],3,";");
					}else
					{
						lUbicaciones[0] = NULL;
					}

				}
				i++;
			}
			ret = fgets(linea,MAX_BUFF_SIZE,persistFile);
		}
	}
	return EXIT_SUCCESS;
}
예제 #12
0
pcb_t* recibirPCBdeCPU(int socket,int pidLocal){
	pcb_t* pcb_Recibido = malloc(sizeof(pcb_t));
	pcb_Recibido->PID = recibirCpu(socket,sizeof(int),pidLocal);
	pidLocal = *(pcb_Recibido->PID);
	pcb_Recibido->PC = recibirCpu(socket,sizeof(int),pidLocal);
	pcb_Recibido->PCI = recibirCpu(socket,sizeof(int),pidLocal);
	pcb_Recibido->SP = recibirCpu(socket,sizeof(int),pidLocal);
	pcb_Recibido->paginasDisponible = recibirCpu(socket,sizeof(int),pidLocal);

	pcb_Recibido->indice_codigo = dictionary_create();
	pcb_Recibido->indice_funciones = list_create();
	pcb_Recibido->indice_stack = dictionary_create();

	int* tamanioIC = recibirCpu(socket, sizeof(int),pidLocal);
	int* tamanioStack = recibirCpu(socket, sizeof(int),pidLocal);
	int* tamanioIF = recibirCpu(socket, sizeof(int),pidLocal);

	int i;

	//RECIBO INDICE DE CODIGO
	for(i=0;i<*tamanioIC && *tamanioIC != 0;i++){
		int* nuevaPagina = malloc(sizeof(int));
		*nuevaPagina = i;
		direccionMemoria* nuevaDireccionMemoria = recibirCpu(socket,sizeof(direccionMemoria),pidLocal);
		dictionary_put(pcb_Recibido->indice_codigo,nuevaPagina,nuevaDireccionMemoria);
	}
	free(tamanioIC);


	//RECIBO INDICE FUNCIONES
	for(i=0;i<*tamanioIF && *tamanioIF!=0;i++){
		funcionTemp* funcion = recibirCpu(socket,sizeof(funcionTemp),pidLocal);
		char* funcionNombre = recibirCpu(socket,funcion->tamanioNombreFuncion,pidLocal);
		funcion_sisop* new_funcion = malloc(sizeof(new_funcion));
		new_funcion->funcion = funcionNombre;
		new_funcion->posicion_codigo = malloc(sizeof(int));
		*(new_funcion->posicion_codigo) = funcion->posicionPID;
		list_add_in_index(pcb_Recibido->indice_funciones,i,new_funcion);
	}
	free(tamanioIF);


	//RECIBO STACK
	for(i=0;i<*tamanioStack && *tamanioStack!=0;i++){
		stack* stackNuevo = malloc(sizeof(stack));
		//Argumentos
		int* tamArgs = recibirCpu(socket, sizeof(int),pidLocal);
		if(*tamArgs==-1)
			stackNuevo->args = NULL;
		else
			stackNuevo->args = list_create();
		//Variables
		int* tamVars = recibirCpu(socket, sizeof(int),pidLocal);
		if(*tamVars==-1)
			stackNuevo->vars = NULL;
		else
			stackNuevo->vars = list_create();
		//Retorno PID del renglon stack
		int* RetornoPID = recibirCpu(socket, sizeof(int),pidLocal);
		if(*RetornoPID == -1)
			stackNuevo->pos_ret = NULL;
		else
			stackNuevo->pos_ret = RetornoPID;
		//Retorno
		direccionMemoria* memoriaRetorno = recibirCpu(socket, sizeof(direccionMemoria),pidLocal);
		if(memoriaRetorno->offset == -1)
			memoriaRetorno = NULL;

		stackNuevo->memoriaRetorno = memoriaRetorno;
		int j;
		for(j=0;j<*tamArgs;j++){
			direccionMemoria* new_direc = recibirCpu(socket, sizeof(direccionMemoria),pidLocal);
			list_add_in_index(stackNuevo->args,j,new_direc);
		}
		free(tamArgs);
		for(j=0;j<*tamVars;j++){
			direccionStack* new_direc = recibirCpu(socket, sizeof(direccionStack),pidLocal);
			list_add_in_index(stackNuevo->vars,j,new_direc);
		}
		free(tamVars);
		int* key = malloc(sizeof(int));
		*key = i;
		dictionary_put(pcb_Recibido->indice_stack,key,stackNuevo);
	}
	//recibo quantum y quantumSleep
	 return pcb_Recibido;
}
예제 #13
0
//------------------------------------------------------------------------------------------
// ---------------------------------- atender_CPU  -----------------------------------------
//Esta funcion representa un thread que trabaja con un CPU conectado por socket
//------------------------------------------------------------------------------------------
void *atender_CPU(int* socket_desc) {
	//void perdioLaConexion();
	//signal(SIGPIPE,perdioLaConexion);

	int socket_local = *socket_desc;

	//Empieza handshake
	int* recibido = recibirCpu(socket_local, sizeof(int),-1);
	if (*recibido == CPU) {
		log_debug(logger, "Se ha conectado correctamente CPU: %d",socket_local);
	}

	//Confirmo conexio a cpu
	int ok = OK;
	enviarCPU(socket_local,sizeof(int),&ok,-1);

	//Lo libero ya q era un malloc de atender_conexion_CPU
	free(socket_desc);
	int CpuActivo = 1; // 0 desactivado - 1 activado
	int cambioPcb = 0; // 0 desactivado - 1 activado
	pcb_t* pcb_elegido;
	int pid_local = 0;
	int* estado_proceso;
	t_sock_mje* socketConsola;
	int esEl_Pid(pcb_t* pcb_compara) {
			return (*pcb_compara->PID==pid_local);
	}

	while (CpuActivo) {
		//////////////////////////////////////////////
		//Le otorgo un pcb para tarabajar/////////////
		//////////////////////////////////////////////
		pid_local = -1;
		sem_wait(&sem_READY_dispo); // espero que haya un proceso en READY disponible


		pthread_mutex_lock(&sem_l_Ready);
			pcb_elegido = list_remove(proc_Ready, 0); //Agarro el pcb
			pid_local = *(pcb_elegido->PID);
			log_debug(logger, "PCB con PID %d sacado de READY", pid_local);
		pthread_mutex_unlock(&sem_l_Ready);

		pthread_mutex_lock(&sem_temp);
			list_add(temp,pcb_elegido); //Agarro el pcb
		pthread_mutex_unlock(&sem_temp);

		pthread_mutex_lock(&sem_pid_consola);
				socketConsola = dictionary_get(dict_pid_consola,&pid_local);
		pthread_mutex_unlock(&sem_pid_consola);

		cambioPcb = 0;
		if (socketConsola->proc_status!=0){ //verifico si se cerro la consola del proceso

			pthread_mutex_lock(&sem_l_Reject);
				list_add(proc_Reject, pcb_elegido);
				log_debug(logger, "PCB con PID %d pasado a REJECT xfin de consola",pid_local);
			pthread_mutex_unlock(&sem_l_Reject);
			sem_post(&sem_REJECT_dispo);
			cambioPcb = 1;
		}

		if(!cambioPcb){


			enviarPCB(pcb_elegido, socket_local, reg_config.quantum, reg_config.quantum_sleep);
			//Guardo pcb en la lista de ejecutandose
			pthread_mutex_lock(&sem_temp);
				list_remove_by_condition(temp, (void*) esEl_Pid);
			pthread_mutex_unlock(&sem_temp);

			pthread_mutex_lock(&sem_l_Exec);
				list_add(proc_Exec, pcb_elegido);
				log_debug(logger, "PCB con PID %d pasado a EXEC", pid_local);
			pthread_mutex_unlock(&sem_l_Exec);
		}
		while (!cambioPcb && CpuActivo){
			estado_proceso = recibirCpu(socket_local,sizeof(int),pid_local);
			switch (*estado_proceso) {
			case FIN_QUANTUM:
			{
				pcb_elegido = recibirPCBdeCPU(socket_local,pid_local);
				pthread_mutex_lock(&sem_l_Exec);
					list_remove_by_condition(proc_Exec, (void*) esEl_Pid);
					log_debug(logger, "PCB con PID %d sacado de EXEC x fin Quantum",pid_local);
				pthread_mutex_unlock(&sem_l_Exec);
				//
				pthread_mutex_lock(&sem_l_Ready);
					list_add(proc_Ready, pcb_elegido);
					log_debug(logger, "PCB con PID %d pasado a READY x fin Quantum",pid_local);
				pthread_mutex_unlock(&sem_l_Ready);
				sem_post(&sem_READY_dispo);
				cambioPcb = 1;//activo el cambio del pcb ya q termino el quantum
			}
				break;
			case FIN_PROC:
			{
				pcb_elegido = recibirPCBdeCPU(socket_local,pid_local);
				pthread_mutex_lock(&sem_l_Exec);
					list_remove_by_condition(proc_Exec, (void*) esEl_Pid);
					log_debug(logger, "PCB con PID %d sacado de EXEC xfin Proceso",	pid_local);
				pthread_mutex_unlock(&sem_l_Exec);
				//
				pthread_mutex_lock(&sem_l_Exit);
					list_add(proc_Exit, pcb_elegido);
					log_debug(logger, "PCB con PID %d pasado a EXIT xfin Proceso",pid_local);
				pthread_mutex_unlock(&sem_l_Exit);
				cambioPcb = 1;//activo el cambio del pcb ya q termino el proceso
				pthread_mutex_lock(&sem_pid_consola);
				socketConsola = dictionary_get(dict_pid_consola,&pid_local);
				pthread_mutex_unlock(&sem_pid_consola);
				free(socketConsola->mensaje);
				socketConsola->mensaje = strdup("Proceso_Finalizado_Correctamente");
				sem_post(&sem_EXIT_dispo);
			}
				break;
			case FIN_CPU:
			{
				pcb_elegido = recibirPCBdeCPU(socket_local,pid_local);
				pthread_mutex_lock(&sem_l_Exec);
					list_remove_by_condition(proc_Exec, (void*) esEl_Pid);
					log_debug(logger, "PCB con PID %d sacado de EXEC xfin CPU",	pid_local);
				pthread_mutex_unlock(&sem_l_Exec);
				//
				pthread_mutex_lock(&sem_l_Ready);
					list_add_in_index(proc_Ready, 0, pcb_elegido);
					log_debug(logger,"PCB con PID %d pasado al principio de READY xfin CPU",pid_local);
				pthread_mutex_unlock(&sem_l_Ready);
				sem_post(&sem_READY_dispo);
				CpuActivo = 0;
			}
				//LIBERAR PCB
				//BORAR CONSOLA DEL DICCIONARIO
				break;
			case SOLIC_IO:	//es la primitiva entradaSalida
			{
                ansisop_entradaSalida(socket_local, pid_local);
                cambioPcb = 1;//activo el cambio del pcb ya q se bloqueo el proceso
			}
				break;
			case OBT_VALOR:  //es la primitiva obtenerValorCompartida
				ansisop_obtenerValorCompartida (socket_local,pid_local);
				break;
			case GRABA_VALOR: //es la primitiva asignarValorCompartida
				ansisop_asignarValorCompartida (socket_local,pid_local);
				break;
			case WAIT_SEM:	 // es la primitiva wait
			{
				cambioPcb = ansisop_wait (socket_local, pid_local);
				enviarCPU(socket_local,sizeof(int),&cambioPcb,pid_local);
				// si cambioPcb es 0 significa que el wait no bloqueo y el cpu puede seguir procesando,
				// si es 1 entonces el proceso se bloqueo y el CPU debe tomar otro PCB
				break;
			}

			case SIGNAL_SEM: // es la primitiva signal
				ansisop_signal(socket_local,pid_local);
				break;
			case IMPRIMIR: // es la primitiva imprimir
			{
				int* valoraImprimir = recibirCpu(socket_local,sizeof(int),pid_local);
			/*	t_sock_mje* */ socketConsola = dictionary_get(dict_pid_consola,&pid_local);
				int envVar = 100;
				if(socketConsola->proc_status == 0){
					enviarCPUConHeader(socketConsola->socket_dest,envVar,sizeof(int),valoraImprimir,pid_local);
				}
				free(valoraImprimir);
				break;
			}
			case IMPRIMIR_TXT: // es la primitiva imprimirTexto
			{
			/*	t_sock_mje* */ socketConsola = dictionary_get(dict_pid_consola,&pid_local);
				int* tamanioAImprimir = recibirCpu(socket_local,sizeof(int),pid_local);
				void* mensaje = recibirCpu(socket_local,*tamanioAImprimir,pid_local);
				int envTexto = 101;
				if(socketConsola->proc_status == 0){
					enviarCPUConHeader(socketConsola->socket_dest,envTexto,sizeof(int),tamanioAImprimir,pid_local);
					enviarCPU(socketConsola->socket_dest,*tamanioAImprimir,mensaje,pid_local);
				}
				free(tamanioAImprimir);
				free(mensaje);
				break;
			}
			case SEG_FAULT:
			{
				pcb_elegido = recibirPCBdeCPU(socket_local,pid_local);
				pthread_mutex_lock(&sem_l_Exec);
					list_remove_by_condition(proc_Exec, (void*) esEl_Pid);
					log_debug(logger, "PCB con PID %d sacado de EXEC xfin Proceso",	pid_local);
				pthread_mutex_unlock(&sem_l_Exec);
				pthread_mutex_lock(&sem_l_Reject);
					list_add(proc_Reject, pcb_elegido);
					log_debug(logger, "PCB con PID %d pasado a EXIT xfin Proceso",pid_local);
				pthread_mutex_unlock(&sem_l_Reject);
				cambioPcb = 1;//activo el cambio del pcb ya q termino el proceso
				pthread_mutex_lock(&sem_pid_consola);
					socketConsola = dictionary_get(dict_pid_consola,&pid_local);
				pthread_mutex_unlock(&sem_pid_consola);
				free(socketConsola->mensaje);
				socketConsola->mensaje = strdup("Proceso_Produjo_SEG_FAULT");
				sem_post(&sem_REJECT_dispo);
				break;
			}
			default:
				break;
			}
			free(estado_proceso);
		}
	}
}