Midipix[1] describe un ambiente compatible con POSIX/Linux para Windows XP/Server 2003 y versiones
posteriores, facilitando de esta guisa la compilación cruzada y el uso de programas hechos a la medida del estándar POSIX/Linux sin
sufrir pérdidas apreciables de rendimiento. Al contrario de Cygwin[2], Midipix no requiere
interacción con el subsistema de ambiente Windows a fin de implementar sus llamadas al sistema (system calls), de igual forma de
Interix[3], debido a que Midipix no depende de un subsistema
ambiente por sí mismo, por lo que tampoco se vale de su propio servidor ni de los DLL de cliente. Luego, no se requiere virtualización ni
controladores tipo kernel a la hora de usar Midipix: en su lugar, basta una pequeña cantidad de “runtime components” para facilitar la
comunicación entre Musl, la libc elegida por este proyecto y la ejecutiva Windows NT (NTOSKRNL.EXE).
A comienzos del proyecto midipix_build[4] la compilación [cruzada] de la
toolchain, los “runtime components” así como un número indeterminado de software por parte de terceros, fue manejada por script de Bourne
shell escritos ad hoc, mecanismo que hasta no hace mucho demostró ser poco escalable y de fiabilidad. De ahí que, la necesidad de una
infraestructura de compilación cruzada, lo suficientemente general y amplia, quedara manifiesta. Dado que el proyecto Midipix se
encuentra en un proceso de cambio permanente, se ha creado un paradigma de desarrollo iterativo Consideraciones acerca de la arquitectura
tuvieron poca importancia. La reestructuración de código tuvo lugar sólo dos veces y el concepto actual ha demostrado ser suficiente y
adecuado cuando se trata de prestar servicio y cumplir los requisitos de Midipix. Metas y requisitos que se deducen de aquí:
Tcl (pronunciado /tí.quel/, originado del acrónimo en inglés "Tool Command Language" o "lenguaje de herramientas de comando", actualmente
se escribe como "Tcl" en lugar de "TCL"), es un lenguaje de script creado por John Ousterhout, que ha sido concebido con una sintaxis
sencilla para facilitarse su aprendizaje, sin detrimento de la funcionalidad y expresividad
[5]. Contribuciones a Tcl que alteran las interfaces publicas se ha de presentar a
y se procesan a través del “Tcl Improvement Proposal (TIP)”[6]. A inicios de noviembre de 2016, un
bounty programme “for improvements to Tcl and certain Tcl packages” fue publicado en GitHub
[7] por parte de FlightAware[8]. Yo
elegí a desarrollar el “[s]upport for epoll()/kqueue() to replace select() in socket handling,” tarea que termine a fines de diciembre 2016
[9].
Tcl implementa una arquitectura “event-based” respecto a I/O y en particular utiliza callbacks para la notificación de la finalización
I/O y el procesamiento, ambas funciones se implementan en el notificador no específico a la plataforma. Antes, el único notificador
existente utilizaba la llamadas al sistema (system call) select(2) para la multiplexación I/O, que resultó ser un gran obstáculo para
escalabilidad. Las desventajas de select (2) son bien conocidas y han quedado profundizadas en mi TIP
[10]. A causa de tales razones no se examinan aquí, a no ser por el contingente
impuesto mediante el uso de select (2) del número de file descriptors de 1024. Los nuevos notificadores para Linux, utilizando epoll (7),
y *BSD, utilizando kqueue (2), están exentos de semejantes defectos.
En atención a esto, los nuevos notificadores utilizan epoll(7)/kqueue(2) recurriendo al thread context del solicitante en vez de
introducir threads nuevos. La cuestión del IPC entre threads, después de cierto debate sobre el tema en la lista de correo e IRC, fue
solucianada con la introducción de una trigger pipe(2) en *BSD y eventfd(2) en Linux para cada thread. Con esto, añade un file descriptor
por cada thread, siempre que interactúe con el notificador y uno o dos file descriptors por IPC entre threads en *BSD/Linux,
respectivamente.Si bien conduce a una pérdida sustancial de la complejidad merced a la eliminación del thread del notificador, Lo más
importante del caso: ningún thread, por parte del notifier, comparte implícitamente con otro thread file descriptors o estado.
[1] midipix
[2] Cygwin
[3] Windows Services for UNIX Version 3.0
[4] GitHub - lalbornoz/midipix_build: Unified build Bourne shell script for midipix
[5] Tcl – Wikipedia
[6] Tcl Improvement Proposal
[7] GitHub - flightaware/Tcl-bounties: Bounty program for improvements to Tcl and certain Tcl packages
[8] FlightAware - Flug-Tracker / Flugstatus / Flugverfolgung
[9] [TIP] Intent to implement epoll()/kqueue() support for sockets on Linux/FreeBSD · Issue #14 · flightaware/Tcl-bounties · GitHub
[10] TIP #458: Add Support for epoll() and kqueue() in the Notifier