1. Transacciones
1.1. Características
1.1.1. -Conjunto de operaciones que se ejecutan de manera atómica (completas o no suceden). -Se usa comúnmente en bases de datos.
1.2. Funcionamiento
1.2.1. Si una transacción se ejecuta exitosamente, todos sus cambios se confirman; de lo contrario, se revierten.
1.3. Implementación
1.3.1. Transacciones en bases de datos con SQL (BEGIN TRANSACTION, COMMIT, ROLLBACK).
1.4. Algoritmos Ejemplo
1.4.1. Control de concurrencia en bases de datos. Ejemplo en SQL: BEGIN TRANSACTION; -- operaciones COMMIT;
2. Comunicación entre Procesos
2.1. Características
2.1.1. -Permiten que los procesos se comuniquen entre sí, ya sea en un sistema distribuido o en procesos concurrentes en un solo sistema. -Utilizan técnicas como paso de mensajes o memoria compartida.
2.2. Funcionamiento
2.2.1. -Paso de mensajes: Un proceso envía datos a otro. -Memoria compartida: Varios procesos acceden a la misma región de memoria.
2.3. Implementación
2.3.1. -Paso de mensajes: PVM (Parallel Virtual Machine). -Memoria compartida: Usando semáforos o variables de condición.
2.4. Algoritmos Ejemplo
2.4.1. Comunicación Cliente-Servidor. Ejemplo de paso de mensajes: pvm_send(tid, msgtag);
3. Deadlocks y Soluciones
3.1. Características
3.1.1. Ocurre cuando varios procesos se bloquean mutuamente esperando recursos, formando un ciclo de dependencia. Las cuatro condiciones son: exclusión mutua, espera bloqueada, no prelación y espera circular.
3.2. Funcionamiento
3.2.1. Los procesos solicitan recursos y, si no están disponibles, esperan indefinidamente, creando un ciclo de dependencia. Esto bloquea el progreso de todos los procesos implicados.
3.3. Implementación
3.3.1. -Prevención: Evitar una o más de las condiciones del deadlock. -Evitación: Algoritmo del Banquero para garantizar que el sistema esté en un estado seguro. -Detección y recuperación: Identificar el ciclo de espera y abortar procesos para liberar recursos. -Ignorar: En algunos sistemas se reinician procesos para resolver deadlocks.
3.4. Algoritmos Ejemplo
3.4.1. Algoritmo del Banquero de Dijkstra: Verifica si es seguro asignar recursos a un proceso, evitando el deadlock. Si el estado resultante es seguro, los recursos se asignan; si no, la solicitud es rechazada: Pseudocódigo básico del Algoritmo del Banquero Si la solicitud de recursos no supera las necesidades máximas del proceso y el estado resultante del sistema es seguro: Asignar los recursos. Si el estado resultante no es seguro: Rechazar la solicitud.
4. Candados (Locks)
4.1. Características
4.1.1. -Proveen exclusión mutua para evitar acceso simultáneo a recursos compartidos. -Dos estados: bloqueado y desbloqueado
4.2. Funcionamiento
4.2.1. -Un hilo bloquea el recurso antes de acceder a él y lo libera cuando termina. -Otros hilos deben esperar a que el candado sea liberado.
4.3. Implementación
4.3.1. Utilizado en sistemas de bajo nivel, como en C/C++ con pthreads (pthread_mutex_lock y pthread_mutex_unlock).
4.4. Algoritmos Ejemplo
4.4.1. Algoritmo de exclusión mutua de Peterson: pthread_mutex_lock(&lock); // Sección crítica pthread_mutex_unlock(&lock);
5. Semáforos
5.1. Características
5.1.1. -Mecanismo de señalización que permite a los hilos coordinarse. -Puede ser binario (0 o 1) o contar (permite varios hilos acceder).
5.2. Funcionamiento
5.2.1. Se incrementa o decrementa un contador de permisos para gestionar el acceso a recursos
5.3. Implementación
5.3.1. En C : sem_init, sem_wait, sem_post.
5.4. Algoritmos Ejemplo
5.4.1. Productor-Consumidor. Código simple en C : sem_wait(&sem); // Sección crítica sem_post(&sem);
6. Monitores
6.1. Características:
6.1.1. -Abstracción de alto nivel que agrupa datos compartidos y las operaciones que se pueden realizar sobre ellos. -Incluyen mecanismos de sincronización implícitos.
6.2. Funcionamiento
6.2.1. -Solo un hilo puede ejecutar dentro del monitor a la vez. -Se utilizan variables de condición para manejar la sincronización.
6.3. Implementación
6.3.1. Lenguajes como Java ofrecen monitores como parte del sistema de hilos (synchronized)
6.4. Algoritmos Ejemplo
6.4.1. Lectores y escritores. Implementación en Java: synchronized(this) { // Sección crítica }