Proceso vs. Threads, Hardware vs. Software Threads, Hyperthreading En el mundo de hoy de software de alto rendimiento y responsivo, Ya no es un lujo, es una necesidad. ya sea que esté construyendo un motor de comercio en tiempo real, un motor de juegos o un servidor web simple, comprender cómo ejecutar tareas en paralelo puede mejorar dramáticamente el rendimiento y la experiencia del usuario. entra en juego. concurrency threading En nuestros blogs anteriores, hemos explorado y diversos — los elementos fundamentales de la multiplicación y el paralelismo avanzado.Ahora que hemos puesto las bases, es hora de ir más allá de la teoría y sumergirnos en la cuestión central: Si aún no has leído esas historias anteriores, recomiendo encarecidamente que las revises primero para obtener un mejor contexto. Taxonomía de Flynn Modelos de programación paralela ¿Qué es exactamente un thread, y qué hace? Taxonomía de Flynn Taxonomía de Flynn Modelos de programación paralela Modelos de programación paralela ¿Qué es exactamente un thread, y qué hace? descargar archivos mientras actualiza la interfaz de usuario, calcular los resultados mientras responde a la entrada del usuario, o procesar las solicitudes de red entrantes en paralelo. , y lenguajes de programación como C++ proporcionan herramientas poderosas para aprovecharlos. Threading permite que los programas hagan más de una cosa a la vez: hardware threads Threading permite que los programas hagan más de una cosa a la vez: Ya sea que sea nuevo en multithreading o que busque reforzar sus fundaciones, esta historia le dará un comienzo sólido. Destacados: Threads vs. procesos What Is a Thread? ¿Qué es una amenaza? Uno de los primeros obstáculos para que los principiantes aprendan sobre la concurrencia es comprender el . difference between a thread and a process a es un programa independiente en ejecución. tiene su propio espacio de memoria, descriptores de archivos y recursos del sistema, aislados de otros procesos.Por ejemplo, cuando abre un navegador o un terminal, está lanzando un nuevo proceso.El sistema operativo gestiona los procesos y no comparte espacio de memoria a menos que esté explicitamente configurado para hacerlo. process a , por otro lado, es la unidad más pequeña de ejecución dentro de un proceso.Múltiples hilos pueden existir dentro del mismo proceso, ejecutando simultáneamente y compartiendo el mismo espacio de memoria.Este entorno compartido permite una comunicación más rápida entre los hilos, pero también abre la puerta a y Si no se gestiona correctamente. thread race conditions synchronization issues Conceptualmente, se puede pensar en un hilo como un - Un flujo independiente de ejecución con su propia , de , y Pero compartiendo con otros tramos en el mismo proceso. lightweight process program counter registers stack heap and global memory Cuando se habla de las diferencias, es importante distinguir entre y Aunque ambos se refieren a "unidades de ejecución", operan en niveles muy diferentes en la pila de computación. hardware threads software threads What is a Hardware Thread? ¿Qué es un Hardware Thread? a Es un flujo de ejecución De hecho, es una dentro de un núcleo que puede recoger, decodificar y ejecutar un flujo de instrucciones de forma independiente. hardware thread directly supported by the processor dedicated control unit de manera tradicional, — en otras palabras, una unidad de control por CPU física. En sistemas con múltiples sockets (por ejemplo, placas madre de servidor), habría Pero este modelo evolucionó rápidamente con la introducción y las arquitecturas. one processor equaled one hardware thread one hardware thread per socket multi-core multi-threaded En las CPU modernas: Cada núcleo contiene al menos un thread de hardware. Con Simultaneous Multithreading (SMT) – la versión de Intel llamada Hyper-Threading – un núcleo único puede soportar varios hilos de hardware. Ahora, un procesador (socket) puede tener múltiples núcleos, y cada núcleo puede tener múltiples hilos de hardware. Para añadir la confusión, muchos Por lo tanto, cuando se verifica la información de la CPU usando herramientas del sistema, el número de "procesadores" que se muestran puede referirse a hilos lógicos, no a núcleos físicos o sockets. operating systems report hardware threads or logical cores as “processors.” ¿Cómo puedo comprobar el número de hilos de hardware que tengo? Windows Windows Hay varias maneras de comprobar el número de hilos de hardware en Windows, pero no te preocupes, este no es uno de esos “10 maneras de hacerlo” publicaciones de blog. Uso La cabeza a la Tab y Seleccione . Task Manager Ctrl + Shift + Esc Performance CPU Verás un resumen que incluye el número de y (es decir, los hilos de hardware). Parece algo así: cores logical processors Otras opciones, si desea explorar por su cuenta: PowerShell: Alternative 1: Alternativa 1 : (Get-WmiObject -Class Win32_Processor).NumberOfLogicalProcessors Command Prompt (requires wmic): Alternative 2: La alternativa 2: wmic cpu get NumberOfLogicalProcessors,NumberOfCores 2 Linux 2 Linux Si está utilizando cualquier sabor de Linux, la configuración de su sistema y el número de hilos de hardware se pueden comprobar leyendo el La salida da una entrada para cada hilo de hardware. Una entrada de este archivo se ve así: /proc/cpuinfo ~$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 183 model name : 13th Gen Intel(R) Core(TM) i5-13450HX stepping : 1 microcode : 0xffffffff cpu MHz : 2611.201 cache size : 20480 KB physical id : 0 siblings : 16 core id : 0 cpu cores : 8 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 28 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves avx_vnni vnmi umip waitpkg gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize flush_l1d arch_capabilities vmx flags : vnmi invvpid ept_x_only ept_ad ept_1gb tsc_offset vtpr ept vpid unrestricted_guest ept_mode_based_exec tsc_scaling usr_wait_pause bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs retbleed eibrs_pbrsb rfds bhi bogomips : 5222.40 clflush size : 64 cache_alignment : 64 address sizes : 39 bits physical, 48 bits virtual power management: ... Algunas cosas que destacar de esto: CPU: Esto puede ser engañoso para las arquitecturas híbridas, ya que este número puede no reflejar el número real de núcleos (por ejemplo, mi Intel i5-13 Gen tiene 10 núcleos: 6 núcleos P + 4 núcleos E, pero muestra 8 núcleos). hermanos: se refiere al número total de hilos lógicos. La presencia de la bandera ht (abreviado Hyper-Threading) confirma que SMT es compatible. Hay un par de alternativas a este comando, que también dan una salida más clara: Alternativa 1: Lscpu Alternativa 1: Lscpu Obtengo el siguiente resultado para : lscpu ~$ lscpu | grep -E 'Core|Socket|Thread' Model name: 13th Gen Intel(R) Core(TM) i5-13450HX Thread(s) per core: 2 Core(s) per socket: 8 Socket(s): 1 Alternativa 2: hwloc (lstopo) Alternativa 2: hwloc (lstopo) Otra herramienta útil para inspeccionar la topología de la CPU de su sistema es la popular utilidad Linux , que proporciona tanto líneas de comandos como representaciones gráficas de su diseño de hardware. Es especialmente útil para visualizar núcleos, hilos de hardware, niveles de caché y nodos NUMA. hwloc Si hwloc ya está instalado, puede generar un mapa visual de la arquitectura de su sistema utilizando el El mando: lstopo ¿Qué es el Hyper-Threading? Hyper-Threading (HT) es la implementación de Intel de Multithreading simultáneo (SMT), permitiendo que cada núcleo físico ejecute dos flujos de instrucciones simultáneamente.Cuando uno de los hilos se detiene (por ejemplo, esperando en la memoria), el otro puede hacer uso de las unidades de ejecución. Mejor uso de la CPU Mejor rendimiento en cargas de trabajo I/O-bound o multitasking Pero: No duplica el rendimiento - los beneficios típicos son alrededor del 15-30%. Precauciones para la programación paralela: Mientras que HT beneficia el multitarea diaria (por ejemplo, ejecutando múltiples programas en un portátil), puede afectar negativamente el rendimiento en HPC o cargas de trabajo paralelas. ejecutar múltiples hilos pesados en el mismo núcleo puede conducir a contención de recursos y reducir la aceleración. Ejemplo — i5–13450HX: 6 núcleos P con HT → 12 hilos 4 E-Cores sin HT → 4 threads ➡️ Total = 16 líneas lógicas What is Hyper-Threading? Hyper-Threading (HT) es la implementación de Intel de Multithreading simultáneo (SMT), permitiendo que cada núcleo físico se ejecute. simultáneamente.Cuando un hilo se detiene (por ejemplo, esperando en la memoria), el otro puede hacer uso de las unidades de ejecución. two instruction streams Mejor uso de la CPU Mejor rendimiento en cargas de trabajo I/O-bound o multitasking Pero: No duplica el rendimiento - los beneficios típicos son alrededor del 15-30%. Caution for parallel programming: Mientras que HT beneficia al multitarea diaria (por ejemplo, ejecutando múltiples programas en un portátil), puede La ejecución de varios hilos pesados en el mismo núcleo puede conducir a y reducir la velocidad. por eso La planificación cuidadosa de los hilos es crítica en los sistemas SMT. negatively affect performance in HPC or parallel workloads resource contention many HPC centers disable HT by default Example — i5–13450HX: 6 núcleos P con HT → 12 hilos 4 E-Cores sin HT → 4 threads ➡️ Total = 16 líneas lógicas Understanding Software Threads: The Foundation Comprender los conceptos de software: la fundación A diferencia de los hilos de hardware, que existen a nivel de procesador, los hilos de software son son flujos independientes de ejecución dentro de un proceso. . programming abstractions Un hilo de software es esencialmente una unidad de ejecución ligera que existe dentro de un proceso, compartiendo el mismo espacio de direcciones manteniendo su propio contexto de ejecución. Un hilo de software es esencialmente una unidad de ejecución ligera que existe dentro de un proceso, compartiendo el mismo espacio de direcciones manteniendo su propio contexto de ejecución. Cuando crea un hilo de software en su código, el sistema operativo y el entorno de ejecución trabajan juntos para mapearlo en disponible. Este mapeo es dinámico y depende del programador de thread, que determina cuándo y dónde se ejecuta cada thread. Términos Hardware Términos Hardware Las cadenas de hardware representan las unidades de ejecución físicas disponibles en su procesador, mientras que las cadenas de software son la abstracción con la que trabajan los programadores.Un solo hilo de hardware puede ejecutar múltiples cadenas de software a lo largo del tiempo a través del cambio de contexto, y los sistemas modernos a menudo soportan miles de cadenas de software que funcionan simultáneamente. Los hilos de hardware representan las unidades de ejecución físicas disponibles en su procesador, mientras que los hilos de software son la abstracción con la que trabajan los programadores. A single hardware thread can execute multiple software threads over time through context switching, and modern systems often support thousands of software threads running concurrently. The Evolution From Processes to Threads La evolución de los procesos a las cadenas Para entender por qué se introdujo el filamento, primero debemos examinar el modelo de proceso tradicional.Los sistemas operativos han gestionado históricamente los procesos como la unidad primaria de ejecución, donde cada proceso tenía: Un flujo de ejecución que se ejecuta secuencialmente Aislamiento completo con espacios de direcciones separados, descriptores de archivos y identificadores de usuario Comunicación únicamente a través de los mecanismos de comunicación interprocesal (IPC) Sobrecarga de recursos pesados debido a la duplicación completa de procesos Threading se introdujo para abordar las limitaciones de este modelo centrado en el proceso al permitir la concurrencia de granos finos. Los Threads ofrecen varias ventajas clave: Simplified Data Sharing Unlike processes, threads within the same process . This eliminates the need for complex IPC mechanisms and allows for more efficient communication between concurrent execution units. share the same address space, heap, and global variables Compartir datos simplificados Resource Efficiency Creating a thread requires significantly fewer resources than creating a process. , while process creation involves duplicating the entire parent process address space. Thread creation typically requires only 64KB for the thread’s private data area and two system calls Eficiencia de los recursos Enhanced Responsiveness Threads enable patterns that are essential for modern applications. Consider a web browser: one thread handles the user interface, another manages network requests, while others handle rendering and background tasks. This separation ensures that the interface remains responsive even when heavy operations are running. asynchronous behavior Reacciones mejoradas Operating System Level Scheduling Threads still benefit from OS-level scheduling features, including (the ability to interrupt a thread) and fair progress guarantees among threads. This provides the balance between user control and system management. preemption Calendario de nivel del sistema operativo Thread Architecture and Memory Model Arquitectura de hilo y modelo de memoria Cada thread mantiene su propio contexto de ejecución privada mientras comparte ciertos recursos con otros threads en el mismo proceso. Recursos de Thread Privado Cada tramo tiene su propio: Bloque de control de hilos (TCB) que contiene la identificación de hilos, el contador de programas, el conjunto de registro y la información de programación Memoria de pila para variables locales y gestión de llamadas de funciones Controlador del programa para rastrear la instrucción actual que se ejecuta Bloqueo de control de cables (TCB) Memoria de Stack Programa de Counter Recursos compartidos Todos los threads en un proceso comparten: containing the program instructions Code section with global and static variables Data section for dynamically allocated data Heap memory and other system resources File descriptors Sección Código Sección de datos Memoria de Heap Descriptores de archivos Este modelo de memoria compartida es tanto una fortaleza como un desafío.Aunque permite una comunicación eficiente, también introduce la necesidad de una sincronización cuidadosa para prevenir las carreras de datos y garantizar la seguridad del hilo. Este modelo de memoria compartida es tanto una fortaleza como un desafío.Aunque permite una comunicación eficiente, también introduce la necesidad de una sincronización cuidadosa para prevenir las carreras de datos y garantizar la seguridad del hilo. The Fork/Join Model: Structured Parallelism El modelo Fork/Join: Paralelismo estructurado El modelo fork/join representa el patrón más común para la programación paralela estructurada. Este modelo proporciona una abstracción limpia para dividir el trabajo entre múltiples filamentos y recoger los resultados. Inicio secuencial: el hilo principal comienza a ejecutarse secuencialmente Fase de forca: Cuando se necesita trabajo paralelo, el hilo principal crea (forca) nuevos hilos, cada uno comenzando en una función especificada. Ejecución paralela: Tanto los hilos principales como los generados se ejecutan simultáneamente, potencialmente en hilos de hardware diferentes. Fase de adhesión: el hilo principal espera que todos los hilos engendrados se completen antes de continuar Continuidad secuencial: la ejecución continúa secuencialmente con resultados de trabajo paralelo Inicio Secuencia Fase de Fork ejecución paralela: Únete a la fase: Siguiente Siguiente: What’s Next? ¿Qué es lo siguiente? Hemos llegado ahora al final de la tercera parte de esta serie de multithreading. Hasta ahora, hemos cubierto los conceptos fundamentales de los hilos y procesos, dándole una base sólida para construir. En la próxima parte, pasaremos de la teoría a la práctica e exploraremos el mundo de los hilos en acción. y , donde escribiremos código real, analizaremos las salidas y entenderemos cómo estas bibliotecas traen concurrencia a la vida. POSIX threads (pthreads) C++ std::thread Suggested Reads Sugerencias de lectura [1] El Arquitectura de computadoras multithreaded: un resumen del estado del ART [2] El Computación Distribuida: Principios, Algoritmos y Sistemas - Kshemkalyani y Singhal (uic.edu)