¿Has corrido alguna vez una carrera? Si es así, ¡ya sabes que a veces se necesita un acabado fotográfico para seleccionar al ganador! Pero, ¿y si dos personas llegaran al mismo tiempo a la línea de meta? Bienvenidos a las condiciones de carrera.
Cuáles son Hilos de computadora?
Para explicar una condición de carrera, primero tenemos que comprender un poco cómo funcionan las computadoras internamente. Cuando utilice un sistema operativo, realizará varias acciones como abrir una ventana de terminal de comandos, abrir un navegador, etc. Cada una de esas acciones dará como consecuencia una reacción del sistema operativo para iniciar un nuevo procedimiento informático / informático.
Un hilo es un procedimiento informático / informático que ejecutará / ejecutará los múltiples pasos (pasos de programación, originalmente escritos en formato de código fuente y compilados regularmente por un compilador) necesarios para ejecutar la tarea que le solicitó al sistema operativo o software que se ejecuta en él. .
En Linux, un hilo de este tipo se identifica unívocamente por un PID (Identificador de procedimiento). Para obtener más información sobre los PID en Linux, puede leer nuestros posts Bash Automation and Scripting Basics (Part 3) y How Linux Signals Work: SIGINT, SIGTERM y SIGKILL.
En Windows, un hilo además se identifica de forma única a través de un ID de procedimiento (Ref. PID columna en el Administrador de tareas de Windows), aún cuando la implementación del manejo de procesos es distinto entre Linux y Windows; distinto código subyacente, distinto PID herramientas de interacción, etc. y compatibilidad limitada. Al mismo tiempo, el ID del procedimiento de Windows PID no debe confundirse con el ID de producto PID (mismo término, significado distinto) o VID (ID de proveedor). Los dos últimos se refieren a la identificación de dispositivos y no están relacionados con la administración de procesos.
Cuando un hilo comienza, puede por sí mismo iniciar otros hilos. El hilo original a menudo se denomina hilo principal o padre. A modo de ejemplo, cuando hace clic en el icono de su navegador web favorito, se iniciará inmediatamente un hilo (el hilo principal), y ese hilo iniciará muy rápidamente varios subprocesos o hilos secundarios y, por eso, se convertirá en el hilo principal.
Además puede pensar en hilos como corredores en una carrera. A modo de ejemplo, piense en un servidor de base de datos ocupado que atiende a muchos clientes conectados diferentes. Cada uno de esos subprocesos del cliente (tenga en cuenta el uso del subproceso de palabras) tendrá (en varios casos) en y por sí mismo al menos un subproceso en el servidor host de la base de datos y / o dentro del propio software de la base de datos (dicho de otra forma, dos subprocesos, uno registrado en el sistema operativo y uno dentro del software de la base de datos).
El servidor de la base de datos está tratando de servir todos esos subprocesos al mismo tiempo, de ahí el término procesos concurrentes o hilos concurrentes y si hay errores en el software de la base de datos (o en el sistema operativo, etc.), tarde o temprano puede encontrarse en una condición de carrera.
Que es un Condición de carrera?
Una forma simple de relacionar esto con los corredores que corren en una carrera es imaginar una foto de finalización en la que dos corredores verdaderamente cruzan la línea de meta en el mismo punto en el tiempo. Es factible, aún cuando bastante improbable, que esto ocurra en las razas humanas. Para las computadoras que procesan cientos de operaciones por milisegundo, se torna mucho más viable.
Como otro ejemplo, imagine una carrera de relevos en la que los corredores pasan una batuta (el palo de colores llamativos) de una persona a otra. Imagínese ahora que uno de los integrantes de la carrera comete un error, y ahora hay dos corredores que piensan que deberían hacerse con el testigo de color rojo.
Un acontecimiento importante en una carrera de relevos es el traspaso del testigo, dado que esto puede significar que el titular anterior del testigo puede dejar de correr, y ahora depende del nuevo propietario del testigo dar lo mejor de sí mismo. Ahora hay dos corredores agarrando el testigo. Va a ser una situación interesante de ver en televisión (si te gusta ese tipo de cosas), pero es claro que habrá algunas consecuencias.
En esencia, una condición de carrera es un error, error o falla en el código del sistema informático que produce resultados impredecibles: una secuencia inesperada de eventos. Regularmente se debe a que dos subprocesos entran en conflicto de alguna manera, dado que más de dos subprocesos pueden estar involucrados en el conflicto real y, a menudo, más de dos subprocesos se ejecutan en el software con fallas.
En nuestro ejemplo de la raza humana, teníamos dos personas accediendo a un objeto aproximadamente al mismo tiempo, y el corrupción (una definición informático para indicar que algunos datos estaban corruptos, donde dichos datos podrían residir en la memoria o en el disco o en la CPU, etc.) sucedió en el momento en que dos personas (o dos subprocesos en analogía con la computadora) intentaron agarrar el testigo y se produjo el conflicto. En términos informáticos, dos subprocesos intentaron escribir un espacio de memoria que regularmente solo debería estar escrito por un subproceso (un corredor).
Las condiciones de carrera pueden ocurrir en diversas áreas, como la electrónica interna, el software de computadora y la vida en general. A modo de ejemplo, una colisión de llamadas es una definición de telecomunicaciones para describir la situación en la que un canal de comunicaciones se toma en ambos extremos simultáneamente. Dentro del software de computadora, una de las áreas más destacadas de las condiciones de carrera, hay una amplia variedad de condiciones de carrera posibles.
Como otro ejemplo de una condición de carrera dentro del software de computadora, imagine dos subprocesos de computación trabajando con un espacio de memoria dado. Un usuario acaba de enviar un formulario y el software de backend está escribiendo este formulario en la memoria. Al mismo tiempo, otro usuario está leyendo los campos de este formulario desde el mismo espacio de memoria. Dependiendo de lo que suceda, el usuario lector puede recibir un formulario parcialmente incorrecto con información parcialmente actualizada.
Prevención de condiciones de carrera: Seguridad del hilo
Ha habido mucha discusión sobre las condiciones de carrera en la industria de TI. Dependiendo del lenguaje de codificación que use, puede haber muchas o pocas disposiciones para manejar las condiciones de carrera. Una definición de uso frecuente es seguridad del hilo o un a salvo de amenazas aplicación o lenguaje de programación [construct]. Dichos términos se usan para indicar si un fragmento de código o software en su conjunto es a salvo de amenazas, dicho de otra forma, escrito de tal manera que se evite e inclusive se eviten las condiciones de carrera.
Si el software se considera a salvo de amenazas, se considera libre de la oportunidad de condiciones de carrera. En varios casos, ‘considerado‘thread-safe es lo mejor que pueden ofrecer los desarrolladores, y más aún cuando son posibles muchos hilos e interacciones. La complejidad de muchos subprocesos que trabajan con muchos recursos puede convertirse fácilmente en una miríada de manejo de código y una miríada aún mayor de posibles condiciones de carrera.
Pueden usarse varias construcciones de programación para evitar condiciones de carrera. A modo de ejemplo, semáforos y mutex. La complejidad de utilizar tales construcciones dependerá del lenguaje de programación que se use y su soporte nativo para impulsar el manejo de subprocesos. A modo de ejemplo, en C ++ uno puede mirar el std :: mutex clase para poner en práctica un mutex (dicho de otra forma mutuamente excluyentes) cerrar con llave. En Bash, a pesar de esto, uno no encuentra tal construcción de forma nativa.
Dando un paso más allá, además se puede considerar qué construcciones, funciones o inclusive ejecutables y bibliotecas en particular ya son seguras para subprocesos, y posteriormente utilizar dichas construcciones, funciones, ejecutables y bibliotecas como base para construir una nueva construcción, función, ejecutable, biblioteca. o paquete de software completo.
Poner en práctica inclusive construcciones básicas de manejo de seguridad de subprocesos puede ser un asunto complejo. A modo de ejemplo, considere la dificultad de poner en práctica un semáforo en Bash.
Terminando
En este post, exploramos los subprocesos informáticos y las condiciones de carrera. Analizamos analogías con las carreras de carreras y las carreras de relevos en la vida humana para explorar algunas condiciones básicas de la carrera que pueden ocurrir dentro de las computadoras. Para terminar, exploramos la seguridad de los subprocesos, las diferentes implementaciones del manejo de condiciones de carrera en lenguajes de codificación de computadora y cómo podemos prevenir las condiciones de carrera.
Si le gustó este post, eche un vistazo al post Cómo funcionan las puertas lógicas: OR, AND, XOR, NOR, NAND, XNOR y NOT.