stringtranslate.com

Control de concurrencia

En tecnología de la información y la informática , especialmente en los campos de programación informática , sistemas operativos , multiprocesadores y bases de datos , el control de concurrencia garantiza que se generen resultados correctos para operaciones simultáneas , al tiempo que se obtienen esos resultados lo más rápido posible.

Los sistemas informáticos, tanto de software como de hardware , constan de módulos o componentes. Cada componente está diseñado para funcionar correctamente, es decir, para obedecer o cumplir con ciertas reglas de consistencia. Cuando los componentes que funcionan simultáneamente interactúan mediante mensajes o compartiendo datos a los que se accede (en la memoria o el almacenamiento ), la consistencia de un determinado componente puede ser violada por otro componente. El área general del control de concurrencia proporciona reglas, métodos, metodologías de diseño y teorías para mantener la consistencia de los componentes que funcionan simultáneamente mientras interactúan y, por lo tanto, la consistencia y la corrección de todo el sistema. Introducir el control de concurrencia en un sistema significa aplicar restricciones de operación que generalmente resultan en alguna reducción del rendimiento. La consistencia y la corrección de la operación deben lograrse con la mejor eficiencia posible, sin reducir el rendimiento por debajo de niveles razonables. El control de concurrencia puede requerir una complejidad y una sobrecarga adicionales significativas en un algoritmo concurrente en comparación con el algoritmo secuencial más simple .

Por ejemplo, una falla en el control de concurrencia puede resultar en corrupción de datos debido a operaciones de lectura o escritura interrumpidas.

Control de concurrencia en bases de datos

Comentarios:

  1. Esta sección es aplicable a todos los sistemas transaccionales, es decir, a todos los sistemas que utilizan transacciones de bases de datos ( transacciones atómicas ; por ejemplo, objetos transaccionales en sistemas de gestión de sistemas y en redes de teléfonos inteligentes que normalmente implementan sistemas de bases de datos privados y dedicados), no sólo a los sistemas de gestión de bases de datos de propósito general (DBMS).
  2. Los DBMS también deben abordar cuestiones de control de concurrencia que no son propias de las transacciones de bases de datos, sino de los sistemas operativos en general. Estas cuestiones (por ejemplo, consulte Control de concurrencia en sistemas operativos más adelante) quedan fuera del alcance de esta sección.

El control de concurrencia en sistemas de gestión de bases de datos (DBMS; por ejemplo, Bernstein et al. 1987, Weikum y Vossen 2001), otros objetos transaccionales y aplicaciones distribuidas relacionadas (por ejemplo, computación en red y computación en la nube ) garantiza que las transacciones de bases de datos se realicen simultáneamente sin violar la integridad de los datos de las respectivas bases de datos . Por lo tanto, el control de concurrencia es un elemento esencial para la corrección en cualquier sistema donde dos transacciones de base de datos o más, ejecutadas con superposición en el tiempo, pueden acceder a los mismos datos, por ejemplo, virtualmente en cualquier sistema de base de datos de propósito general. En consecuencia, se ha acumulado una gran cantidad de investigación relacionada desde que surgieron los sistemas de bases de datos a principios de la década de 1970. Una teoría de control de concurrencia bien establecida para sistemas de bases de datos se describe en las referencias mencionadas anteriormente: teoría de serialización , que permite diseñar y analizar de manera efectiva métodos y mecanismos de control de concurrencia. Una teoría alternativa para el control de concurrencia de transacciones atómicas sobre tipos de datos abstractos se presenta en (Lynch et al. 1993), y no se utiliza a continuación. Esta teoría es más refinada, compleja, de mayor alcance y ha sido menos utilizada en la literatura sobre bases de datos que la teoría clásica mencionada anteriormente. Cada teoría tiene sus pros y sus contras, énfasis y perspectivas . Hasta cierto punto son complementarias y su fusión puede ser útil.

Para garantizar la corrección, un DBMS generalmente garantiza que solo se generen programaciones de transacciones serializables , a menos que la serializabilidad se relaje intencionalmente para aumentar el rendimiento, pero solo en casos en los que no se dañe la corrección de la aplicación. Para mantener la corrección en casos de transacciones fallidas (abortadas) (lo que siempre puede suceder por muchas razones), las programaciones también deben tener la propiedad de recuperabilidad (de aborto). Un DBMS también garantiza que no se pierda ningún efecto de las transacciones confirmadas y que ningún efecto de las transacciones abortadas ( revertidas ) permanezca en la base de datos relacionada. La caracterización general de las transacciones generalmente se resume mediante las reglas ACID a continuación. A medida que las bases de datos se han vuelto distribuidas , o han necesitado cooperar en entornos distribuidos (por ejemplo, bases de datos federadas a principios de 1990 y computación en la nube en la actualidad), la distribución efectiva de los mecanismos de control de concurrencia ha recibido especial atención.

Transacción de base de datos y reglas ACID

El concepto de transacción de base de datos (o transacción atómica ) ha evolucionado para permitir tanto un comportamiento bien entendido del sistema de base de datos en un entorno defectuoso donde las fallas pueden ocurrir en cualquier momento, como la recuperación de una falla a un estado bien entendido de la base de datos. Una transacción de base de datos es una unidad de trabajo, que generalmente encapsula una serie de operaciones sobre una base de datos (por ejemplo, leer un objeto de base de datos , escribir, adquirir un bloqueo, etc.), una abstracción compatible con bases de datos y también con otros sistemas. Cada transacción tiene límites bien definidos en términos de qué ejecuciones de programa/código se incluyen en esa transacción (determinadas por el programador de la transacción a través de comandos de transacción especiales). Cada transacción de base de datos obedece las siguientes reglas (por soporte en el sistema de base de datos; es decir, un sistema de base de datos está diseñado para garantizarlas para las transacciones que ejecuta):

El concepto de transacción atómica se ha extendido a lo largo de los años hasta convertirse en transacciones comerciales que realmente implementan tipos de flujo de trabajo y no son atómicas. Sin embargo, estas transacciones mejoradas también suelen utilizar transacciones atómicas como componentes.

¿Por qué es necesario el control de concurrencia?

Si las transacciones se ejecutan en serie , es decir, secuencialmente sin superposición en el tiempo, no existe concurrencia de transacciones. Sin embargo, si se permiten transacciones simultáneas con operaciones intercaladas de manera no controlada, pueden producirse algunos resultados inesperados e indeseables, como:

  1. El problema de la actualización perdida : una segunda transacción escribe un segundo valor de un elemento de datos (dato) sobre un primer valor escrito por una primera transacción concurrente, y el primer valor se pierde para otras transacciones que se ejecutan simultáneamente y que necesitan, por su precedencia, leer el primer valor. Las transacciones que han leído el valor incorrecto terminan con resultados incorrectos.
  2. El problema de la lectura sucia : las transacciones leen un valor escrito por una transacción que luego se canceló. Este valor desaparece de la base de datos al cancelarse y no debería haber sido leído por ninguna transacción ("lectura sucia"). Las transacciones de lectura terminan con resultados incorrectos.
  3. El problema del resumen incorrecto: mientras una transacción realiza un resumen de los valores de todas las instancias de un elemento de datos repetido, una segunda transacción actualiza algunas instancias de ese elemento de datos. El resumen resultante no refleja un resultado correcto para ningún orden de precedencia (normalmente necesario para la corrección) entre las dos transacciones (si una se ejecuta antes que la otra), sino más bien un resultado aleatorio, que depende del momento de las actualizaciones y de si se han incluido o no determinados resultados de actualización en el resumen.

La mayoría de los sistemas transaccionales de alto rendimiento necesitan ejecutar transacciones simultáneamente para cumplir con sus requisitos de rendimiento. Por lo tanto, sin control de concurrencia, estos sistemas no pueden proporcionar resultados correctos ni mantener sus bases de datos consistentes.

Mecanismos de control de concurrencia

Categorías

Las principales categorías de mecanismos de control de concurrencia son:

Las distintas categorías ofrecen distintos rendimientos, es decir, distintas tasas promedio de finalización de transacciones ( throughput ), según la combinación de tipos de transacciones, el nivel de paralelismo computacional y otros factores. Si se dispone de la posibilidad de elegir y conocer las ventajas y desventajas, se debe elegir la categoría y el método que ofrezcan el mayor rendimiento.

El bloqueo mutuo entre dos transacciones (donde cada una bloquea a la otra) o más da como resultado un interbloqueo , donde las transacciones involucradas se estancan y no pueden llegar a completarse. La mayoría de los mecanismos no optimistas (con bloqueo) son propensos a interbloqueos que se resuelven mediante un aborto intencional de una transacción estancada (que libera las otras transacciones en ese interbloqueo), y su reinicio y re-ejecución inmediatos. La probabilidad de un interbloqueo es típicamente baja.

Los bloqueos, los puntos muertos y los abortos resultan en una reducción del rendimiento y, por lo tanto, en compensaciones entre las categorías.

Métodos

Existen muchos métodos para el control de concurrencia. La mayoría de ellos se pueden implementar dentro de cualquiera de las categorías principales mencionadas anteriormente. Los métodos principales, [1] que tienen muchas variantes y en algunos casos pueden superponerse o combinarse, son:

  1. Bloqueo (por ejemplo, bloqueo en dos fases - 2PL): control del acceso a los datos mediante bloqueos asignados a los datos. El acceso de una transacción a un elemento de datos (objeto de base de datos) bloqueado por otra transacción puede bloquearse (según el tipo de bloqueo y el tipo de operación de acceso) hasta que se libere el bloqueo.
  2. Comprobación del gráfico de serialización (también llamada comprobación de serializabilidad, conflicto o gráfico de precedencia): comprueba si hay ciclos en el gráfico de la programación y los interrumpe mediante abortos.
  3. Ordenamiento de marcas de tiempo (TO): asignación de marcas de tiempo a transacciones y control o verificación del acceso a los datos mediante orden de marca de tiempo.

Otros tipos importantes de control de concurrencia que se utilizan junto con los métodos anteriores incluyen:

El tipo de mecanismo más común en los sistemas de bases de datos desde sus inicios en la década de 1970 ha sido el bloqueo estricto fuerte de dos fases (SS2PL; también llamado programación rigurosa o 2PL riguroso ), que es un caso especial (variante) del bloqueo de dos fases (2PL). Es pesimista. A pesar de su nombre largo (por razones históricas), la idea del mecanismo SS2PL es simple: "Liberar todos los bloqueos aplicados por una transacción solo después de que la transacción haya finalizado". SS2PL (o Rigorousness) es también el nombre del conjunto de todas las programaciones que se pueden generar mediante este mecanismo, es decir, estas programaciones SS2PL (o Rigorous) tienen la propiedad SS2PL (o Rigorousness).

Principales objetivos de los mecanismos de control de concurrencia

Los mecanismos de control de concurrencia deben funcionar en primer lugar correctamente, es decir, mantener las reglas de integridad de cada transacción (en relación con la concurrencia; las reglas de integridad específicas de la aplicación quedan fuera del alcance de este documento) mientras las transacciones se ejecutan simultáneamente y, por lo tanto, la integridad de todo el sistema transaccional. La corrección debe lograrse con el mejor rendimiento posible. Además, existe cada vez más la necesidad de funcionar de manera efectiva mientras las transacciones se distribuyen entre procesos , computadoras y redes de computadoras . Otros temas que pueden afectar el control de concurrencia son la recuperación y la replicación .

Exactitud

Serializabilidad

Para la corrección, un objetivo principal común de la mayoría de los mecanismos de control de concurrencia es generar programaciones con la propiedad Serializabilidad . Sin serializabilidad pueden ocurrir fenómenos indeseables, por ejemplo, el dinero puede desaparecer de las cuentas o generarse de la nada. La serializabilidad de una programación significa equivalencia (en los valores de la base de datos resultantes) con alguna programación serial con las mismas transacciones (es decir, en la que las transacciones son secuenciales sin superposición en el tiempo y, por lo tanto, completamente aisladas entre sí: no es posible el acceso simultáneo por parte de dos transacciones cualesquiera a los mismos datos). La serializabilidad se considera el nivel más alto de aislamiento entre las transacciones de la base de datos y el principal criterio de corrección para las transacciones concurrentes. En algunos casos, se permiten formas de serialización relajadas y comprometidas para un mejor rendimiento (por ejemplo, el popular mecanismo de aislamiento Snapshot ) o para cumplir con los requisitos de disponibilidad en sistemas altamente distribuidos (consulte Consistencia eventual ), pero solo si la corrección de la aplicación no se ve violada por la relajación (por ejemplo, no se permite relajación para las transacciones de dinero , ya que por relajación el dinero puede desaparecer o aparecer de la nada).

Casi todos los mecanismos de control de concurrencia implementados logran serializabilidad al proporcionar serializabilidad de conflictos , un caso especial amplio de serializabilidad (es decir, cubre, habilita la mayoría de los programas serializables y no impone restricciones adicionales significativas que provoquen demoras) que se puede implementar de manera eficiente.

Recuperabilidad
Ver Recuperabilidad en Serializabilidad

El control de concurrencia normalmente también asegura la propiedad de recuperabilidad de las programaciones para mantener la corrección en casos de transacciones abortadas (lo que siempre puede suceder por muchas razones). La recuperabilidad (de un aborto) significa que ninguna transacción confirmada en una programación ha leído datos escritos por una transacción abortada. Dichos datos desaparecen de la base de datos (al abortar) y son partes de un estado de base de datos incorrecto. La lectura de dichos datos viola la regla de consistencia de ACID. A diferencia de la serialización, la recuperabilidad no se puede comprometer ni relajar en ningún caso, ya que cualquier relajación da como resultado una rápida violación de la integridad de la base de datos al abortar. Los principales métodos enumerados anteriormente proporcionan mecanismos de serialización. Ninguno de ellos en su forma general proporciona automáticamente recuperabilidad, y se necesitan consideraciones especiales y mejoras de mecanismos para admitir la recuperabilidad. Un caso especial de recuperabilidad utilizado comúnmente es Strictness , que permite una recuperación eficiente de la base de datos tras un fallo (pero excluye las implementaciones optimistas).

Distribución

Con el rápido desarrollo tecnológico de la informática, la diferencia entre la informática local y distribuida en redes o buses de baja latencia se está difuminando. Por lo tanto, es común la utilización bastante eficaz de técnicas locales en dichos entornos distribuidos, por ejemplo, en clústeres de computadoras y procesadores multinúcleo . Sin embargo, las técnicas locales tienen sus limitaciones y utilizan multiprocesos (o subprocesos) respaldados por multiprocesadores (o multinúcleos) para escalar. Esto a menudo convierte las transacciones en distribuidas, si es que ellas mismas necesitan abarcar multiprocesos. En estos casos, la mayoría de las técnicas de control de concurrencia local no escalan bien.

Recuperación

Todos los sistemas son propensos a fallas y es imprescindible gestionar la recuperación de fallas. Las propiedades de los cronogramas generados, que están dictadas por el mecanismo de control de concurrencia, pueden afectar la efectividad y eficiencia de la recuperación. Por ejemplo, la propiedad de Estrictez (mencionada en la sección Capacidad de recuperación anterior) suele ser deseable para una recuperación eficiente.

Replicación

Para lograr una alta disponibilidad, los objetos de la base de datos suelen replicarse . Las actualizaciones de las réplicas de un mismo objeto de la base de datos deben mantenerse sincronizadas. Esto puede afectar la forma en que se realiza el control de concurrencia (p. ej., Gray et al. 1996 [2] ).

Control de concurrencia en sistemas operativos

Los sistemas operativos multitarea , especialmente los sistemas operativos en tiempo real , necesitan mantener la ilusión de que todas las tareas que se ejecutan sobre ellos se ejecutan al mismo tiempo, aunque solo una o unas pocas tareas realmente se estén ejecutando en un momento dado debido a las limitaciones del hardware en el que se ejecuta el sistema operativo. Este tipo de multitarea es bastante simple cuando todas las tareas son independientes entre sí. Sin embargo, cuando varias tareas intentan utilizar el mismo recurso, o cuando las tareas intentan compartir información, puede generar confusión e inconsistencia. La tarea de la computación concurrente es resolver ese problema. Algunas soluciones implican "bloqueos" similares a los bloqueos utilizados en las bases de datos, pero corren el riesgo de causar problemas propios, como el bloqueo mutuo . Otras soluciones son los algoritmos sin bloqueo y los algoritmos de lectura-copia-actualización .

Véase también

Referencias

Citas

  1. ^ Philip A. Bernstein , Eric Newcomer (2009): Principles of Transaction Processing, 2nd Edition Archivado el 7 de agosto de 2010 en Wayback Machine , Morgan Kaufmann (Elsevier), junio de 2009, ISBN 978-1-55860-623-4 (página 145) 
  2. ^ Gray, J. ; Helland, P.; O'Neil, P. ; Shasha, D. (1996). Actas de la Conferencia Internacional ACM SIGMOD de 1996 sobre Gestión de Datos . Los peligros de la replicación y una solución (PDF) . págs. 173–182. doi :10.1145/233269.233330.[ enlace muerto permanente ]