CPU Física, lógica, core, thread

Cuando tratamos de conocer la arquitectura y prestaciones a nivel de CPU de una computadora mediante comandos Linux como nproc o lscpu, muchas veces nos encontramos con que no somos capaces de interpretar sus resultados porque confundimos términos como CPU física, CPU lógica, CPU virtual, núcleos o cores, threads, sockets, etc.

Si a esto le añadimos conceptos como HyperThreading (no confundir con multithreading), llega un momento en que ya no podemos estar seguros de cuántos cores tiene nuestra computadora, no entendemos por qué comandos como htop nos indican que tenemos 8 cpus cuando creíamos que habíamos comprado un único procesador quad-core, etc. En fin, un lío.

Para aclararlo vamos a explicar de forma gráfica mediante un par de diagramas todos estos conceptos. Espero que de solo un vistazo les quede todo esto mucho más claro y no vuelvan a tener nunca más este tipo de dudas.

Los orígenes: CPU’s de un sólo núcleo y aparición del hyperthreading

Antes de que aparecieran conceptos como multicore, cpu virtual o lógica, etc., allá por la época de los procesadores Pentium, la mayoría de las computadoras tenian en su motheboard un único chip de considerable tamaño que llamábamos simplemente CPU, microprocesador o sencillamente procesador.

Sólo algunas computadoras servers más grandes que requerían una mayor capacidad de procesamiento se podían permitir montar 2 ó más de estos chips en la mismo motherboard: eran los sistemas multiprocesador. Estos chips se comunicaban con el resto de elementos de la placa base a través de un conector o socket. Y la matemática era de lo más sencilla: tantos conectores o sockets tenía una placa, tantas CPU podía tener como máximo una máquina. Si se quería mayor capacidad de procesamiento, tan sólo había que buscar una máquina con un mayor número de estos procesadores o esperar a que éstos evolucionaran para ofrecer mayores prestaciones.

Pero entonces Intel se percató de que la comunicación entre los distintos procesadores de un sistema multiprocesador era muy ineficiente, pues ésta se tenía que realizar a través del bus del sistema, que trabajaba a una velocidad normalmente bastante inferior a la de los propios procesadores, por lo que se formaban cuellos de botella que impedían sacar todo el jugo a la capacidad de cómputo que ofrecía cada CPU.

Para tratar de mejorar esta situación se inventó la tecnología HyperThreading, que duplicó dentro del chip del procesador varios de sus elementos internos como registros o memorias caché de primer nivel de modo que se pudiera compartir información entre dos hilos de ejecución distintos sin tener que pasar por el bus del sistema con los correspondientes problemas de cuellos de botella y pérdidas de velocidad. Esto también permitía que si un proceso debía quedar a la espera de una interrupción, por ejemplo, otro proceso pudiera seguir haciendo uso de la CPU sin que ésta se quedara parada.

De este modo se conseguía acelerar diversos procesos y comenzaron a ofrecerse procesadores con un mayor rendimiento global que los tradicionales, y al sistema operativo lo engañabamos porque se le ofrecían 2 cpus virtuales o lógicas (LCPU) en lugar de una sola, dado que se le permitía ejecutar 2 procesos “al mismo tiempo”. Pero es importante tener claro que en realidad no se alcanzaba un rendimiento equivalente al doble respecto a un procesador tradicional, ni en realidad se podían ofrecer capacidades completas de procesamiento en paralelo.

Volver

— Mariano Vargas

()