lunes, 7 de julio de 2008

Terminator (Kill 'Em All) (Parte 2)

JKS [jksware@gmail.com]

LINUX IS NOT UNIX

En sistemas operativos modernos se cuenta, de hecho, con abstracciones un poco más complicadas. Apuntadores, llamadas a DLL, semáforos, memoria virtual, memoria compartida e hilos de ejecución son algunos de los términos empleados por diseñadores de sistemas y programadores de aplicaciones de usuario para hacer más fluida la utilización de los recursos, cada vez mayores, que poseen las computadoras.


Un proceso se crea de la siguiente manera: El sistema operativo es cargado en memoria y se le entrega el control total de la máquina. Es también encargado de decir el cuándo y el cómo de absolutamente todo lo que sucede. A su vez, provee una plataforma para que los desarrolladores de aplicaciones de usuarios no tengan que preocuparse por que se les acaba la memoria virtual ni como o qué tipo de monitor está usando el usuario. El kernel empieza entonces a crear procesos a los que nombra hijos. Estos procesos hijos serán los encargados de interactuar en la plataforma brindada por el sistema a los usuarios. A la vez, cada proceso puede llamar a otro proceso, como cuando usted hace doble clic en el escritorio y “llama” a una aplicación como la calculadora. En ese momento, si está utilizando Windows como SO, todo lo que hace el Explorer escondido en background, es decirle al kernel que empiece a correr determinado programa. Este programa será un nuevo hijo del kernel. Dependiendo del caso – se ve mucho en programas instaladores – el propio programa será el que creará el nuevo proceso, y una vez que el padre se haya terminado, el hijo automáticamente también finalizará. De esa forma se crea un árbol de procesos, que puede ser observado gráficamente si contamos con un manejador de procesos avanzados, como los que se incluyen en cualquier distribución de Linux o los que se adquieren de terceros en Windows.

Process Explorer – una herramienta manejadora de procesos que no embarca con el
sistema operativo de Microsoft – muestra un árbol de procesos en ejecución en Windows XP con
sus respectivos Process Identifier (PID).

En realidad, un hilo de ejecución difiere en términos generales de un proceso. Mientras que un proceso – esto siempre dependiendo del SO a analizar – comprende una independencia bastante amplia del resto del sistema, un hilo no; para acceder al espacio reservado de memoria de un proceso hay que lidiar con el kernel del sistema – o con el antivirus en caso de que el primero no sea lo suficientemente cuidadoso – para que este sea el “mediador” y se encargue de tramitar cualquier solicitud a realizar. En la otra mano, el hilo de ejecución no es más que un hijo de un proceso que no tiene mucha identidad propia, los hilos comparten casi todo excepto tiempo y los registros de procesador: espacio de memoria (por tanto constantes y variables globales declaradas y demás), y lo que es más importante, no necesitan de la aprobación del kernel para realizar llamadas a procedimientos que queden dentro de las fronteras del proceso que les dio lugar.

En términos generales, un proceso contendrá cuantos hilos requiera, siempre y cuando la cantidad de memoria virtual y la prioridad asignada se lo permitan. Un proceso es, a grandes rasgos, un hilo con su propio espacio de memoria y un tratamiento diferenciado con respecto al resto de las “tareas” del sistema.

HYPER-THREADING Y MULTITHREADING

Hasta hace sólo unos años atrás, las únicas computadoras que tenían más de una “cabeza pensante” (CPU) eran las súper-computadoras gigantescas como las de laboratorios de experimentación de IBM y los gigantescos clústeres de PCs de los datacenters de web del mundo, mientras que el resto de los usuarios normales de debían conformarse con una sola CPU, al punto que Microsoft decidió cobrar una licencia adicional si el sistema Windows NT era instalado en computadoras con más de un procesador.

La tecnología de computadoras para usuarios personales hasta entonces no abarcaba universalmente varios micros, al menos hasta la llegada de la tecnología Intel que permitía dos microprocesadores Pentium III bajo la misma carcasa. Se trataba de dos CPU encapsulados totalmente aparte y funcionando a la vez en una sola placa madre con características especiales. De ahí que el Windows 2000 ya soportara más de un micro, tanto por su edición Server como Workstation, aunque por aquel tiempo dichos PIII no abundaran en el mercado, excepto para usuarios avanzados y que tuvieran, definitivamente, prosperidad económica.

Algún tiempo después Intel, siempre a la vanguardia en cuanto a tecnología de silicio, liberó una versión de Pentium IV con una tecnología bastante peculiar. Se trataba de la era del P4 Hyperthreading que permitía, según los comerciales de la época, casi duplicar la velocidad de cálculo y ejecución de muchos programas, mediante la fabricación doble de muchos – y no todos ni los más caros – componentes internos de la micro-arquitectura del procesador.

Administrador de Tareas de Windows XP, en el que se aprecia dos núcleos de procesador
ejecutando un juego bastante consumidor de recursos, en la que la carga de instrucciones no
está bien balanceada entre el primero y segundo núcleo.

IMPLEMENTANDO UN HILO

A pesar de que los sistemas operativos facilitan, por no decir que proveen, todo lo necesario para implementar un hilo, muchos lenguajes multiplataforma necesitan de una buena estructura de código y de varias lecturas del API para poder crear hilos dentro de la aplicación. Es algo natural que, a pesar de que sea bastante parecido el manejo de hilos en distintos sistemas como el Linux o el Windows – que a su vez copian bastante de sus antecesores, UNIX y DOS respectivamente – se necesite de una especialización en cuanto a la programación de hilos para cada sistema para el que se quiera programar. Esta es, sin duda, una de las principales limitantes a la hora de diseñar una aplicación multiplataforma totalmente funcional.

Existen, sin embargo, algunos compiladores que facilitan la tarea de la implementación de hilos de ejecución en nuestros programas. Entre ellas se encuentra, por suerte – y pesar de ser tan fuertemente criticado en muchas otras áreas – los compiladores de Borland, para uno de los cuáles tengo la dicha de ser debugger.

2 ^ 2 != 4

El caso es que el mercado de software no estaba preparado – y no podemos decir con convicción de que aún está en 2008, al menos el mercado de usuarios residenciales – para utilizar a plena capacidad dos o más procesadores. Ni siquiera los sistemas operativos como Windows se encuentran totalmente dispuestos a correr programas comunes como hojas de datos con más de un procesador con el objetivo de aumentar la capacidad de manejo de datos. Los programas corren, eso sí, pero no todos al doble de velocidad, incluso algunos lo hacen a menor velocidad. La explicación, bastante sencilla: los programas y la plataforma operativa no distribuyen uniformemente la carga de instrucciones entre ambos procesadores, de manera que uno trabajaba a plena capacidad, mientras que el otro toma – muchas veces – una siesta. Se demostró, incluso, que no existe mucha diferencia de rendimiento en la ejecución de una suite ofimática entre una PC mono-procesador y otro multiprocesador – como lo demuestran los diversos videos del estilo P4 No-Hyperthreading 3.6 GHz vs P4 Hyperthreading 3.0 GHz de Tom´s Hardware que aun conservo.

Todo lo que ha hecho Intel – junto con AMD, IBM y Apple – desde que se llegó a la barrera de 45 nm de encapsulado ha sido aumentar el número de núcleos por procesador – de 1 a 2, de 2 a 4, en saltos de potencias de 2 – y ya está pensando, en un futuro cercano, “sacar” al mercado el micro de 8 núcleos y no mucho más allá el de 32.

Y es que – y aquí es donde quizá me trague estas palabras en un par de años – ya han llegado al límite de transistores, y por ende frecuencia y velocidad permisibles por las leyes físicas intrínsecas que rigen la tecnología de fabricación. Moore, ex-presidente de Intel – ¡qué coincidencia! – va a tener que violar su fórmula sagrada de la duplicación del número de transistores por microprocesador cada 18 meses.


Artículos relacionados


No hay comentarios: