¿Has corrido alguna vez una carrera? Si es así, ¡ya sabes que a veces se requiere un acabado fotográfico para elegir 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 entender 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 resultado una reacción del sistema operativo para iniciar un nuevo proceso informático / informático.
Un hilo es un proceso informático / informático que ejecutará / ejecutará los diversos 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 proceso). Para obtener más información sobre los PID en Linux, puede leer nuestros artículos Bash Automation and Scripting Basics (Part 3) y How Linux Signals Work: SIGINT, SIGTERM y SIGKILL.
En Windows, un hilo también se identifica de forma única mediante un ID de proceso (Ref. PID columna en el Administrador de tareas de Windows), aunque la implementación del manejo de procesos es diferente entre Linux y Windows; diferente código subyacente, diferente PID herramientas de interacción, etc. y compatibilidad limitada. Además, el ID del proceso de Windows PID no debe confundirse con el ID de producto PID (mismo término, significado diferente) o VID (ID de proveedor). Los dos últimos se refieren a la identificación de dispositivos y no están relacionados con la gestió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. Por 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 lo tanto, se convertirá en el hilo principal.
También puede pensar en hilos como corredores en una carrera. Por 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 muchos 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 (es decir, 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 sencilla de relacionar esto con los corredores que corren en una carrera es imaginar una foto de finalización en la que dos corredores realmente cruzan la línea de meta en el mismo punto en el tiempo. Es posible, aunque bastante improbable, que esto ocurra en las razas humanas. Para las computadoras que procesan miles de operaciones por milisegundo, se vuelve mucho más factible.
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 participantes 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, ya 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 está 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. Normalmente se debe a que dos subprocesos entran en conflicto de alguna manera, ya 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 (un término 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 normalmente 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. Por ejemplo, una colisión de llamadas es un término 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. Un término 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 utilizan para indicar si un fragmento de código o software en su conjunto es a salvo de amenazas, es decir, escrito de tal manera que se evite e incluso se eviten las condiciones de carrera.
Si el software se considera a salvo de amenazas, se considera libre de la posibilidad de condiciones de carrera. En muchos 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. Por ejemplo, semáforos y mutex. La complejidad de usar tales construcciones dependerá del lenguaje de programación que se use y su soporte nativo para mejorar el manejo de subprocesos. Por ejemplo, en C ++ uno puede mirar el std :: mutex clase para implementar un mutex (es decir mutuamente excluyentes) cerrar con llave. En Bash, sin embargo, uno no encuentra tal construcción de forma nativa.
Dando un paso más allá, también se puede considerar qué construcciones, funciones o incluso ejecutables y bibliotecas en particular ya son seguras para subprocesos, y luego usar dichas construcciones, funciones, ejecutables y bibliotecas como base para construir una nueva construcción, función, ejecutable, biblioteca. o paquete de software completo.
Implementar incluso construcciones básicas de manejo de seguridad de subprocesos puede ser un asunto complejo. Por ejemplo, considere la dificultad de implementar un semáforo en Bash.
Terminando
En este artículo, 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. Finalmente, 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 artículo, eche un vistazo al artículo Cómo funcionan las puertas lógicas: OR, AND, XOR, NOR, NAND, XNOR y NOT.