Comparación con Linux, Solaris y Freebsd

Planificación de Procesos
FreeBSD
Linux
Solaris
Unidad Básica de Planificación
Thread
Task_struct
Kthread_t
Prioridad
Los valores bajos de prioridad son mejores. Una prioridad próxima a 0 representa una alta prioridad
A más valor prioridad más alta.

Cola de ejecución
utilizan una cola "activa" y una cola "expirados"
utiliza una cola de envío por CPU
Determinación de la prioridad
utilizan un cálculo aritmético basado en el tiempo de ejecución versus el tiempo inactivo de la hebra
realiza una búsqueda en una tabla
Clases de Planificación
El planificador se escoge en tiempo de compilación
 el planificador depende de la versión de Linux
soporta "clases de planificación" de forma simultánea en el sistema





Gestión de Memoria
FreeBSD
Linux
Solaris
Direccionamiento de procesos
Describe el espacio de direcciones de un proceso mediante un vmspace, dividido en secciones lógicas llamadas regiones
Utiliza un descriptor de memoria para dividir el espacio de direcciones de un proceso en secciones lógicas llamadas "áreas de memoria" 
Cada proceso tiene un "espacio de direcciones" formado por secciones lógicas llamadas "segmentos"






Sistema de Archivos
FreeBSD
Linux
Solaris
Abstracción
Utilizan el método de abstracción de datos VFS
Estructura de Datos
Usan el principio vnode o “nodo virtual”
Utiliza el principio inodo





Planificando y Planificadores

La unidad básica de planificación en Solaris es kthread_t; en FreeBSD thread; y en Linux task_struct. Solaris representa cada proceso como un proc_t, y cada hebra dentro de un proceso tiene una kthread_t. Linux representa procesos (y hebras) con estructuras task_struct. Un proceso con una sola hebra en Linux tiene una sola task_struct. Un proceso con una sola hebra en Solaris tiene proc_t, una sola kthread_t, y una klwp_t. La estructura klwp_t proporciona un área de almacenamiento para el intercambio de hebras entre los modos de usuario y núcleo. Un proceso con una sola hebra en FreeBSD tiene una estructura proc, una estructura thread, y una estructura ksegrp. El ksegrp es un "grupo de entidades planificables por el núcleo" (kernel scheduling entity group). Realmente, los tres SOs planifican hebras, y una hebra es una kthread_t en Solaris, una estructura thread en FreeBSD, y una task_struct en Linux.

Las decisiones de planificación están basadas en la prioridad. En Linux y FreeBSD, los valores bajos de prioridad son mejores. Una prioridad próxima a 0 representa una alta prioridad. En Solaris, a más valor prioridad más alta. La Tabla 1 muestra los valores de prioridad en diferentes SOs.
Table 1. Scheduling Priorities in Solaris, Linux, and FreeBSD


Solaris
                Priorities             Scheduling Class
                0-59       Time Shared, Interactive, Fixed, Fair Share Scheduler
                60-99     System Class
                100-159                Real-Time (note real-time higher than system threads)
                160-169                Low level Interrupts
Linux     Priorities             Scheduling Class
                0-99       System Threads, Real time (SCHED_FIFO, SCHED_RR)
                100-139                User priorities (SCHED_NORMAL)
FreeBSD              Priorities             Scheduling Class
                0-63       Interrupt
                64-127  Top-half Kernel
                128-159                Real-time user (system threads are better priority)
                160-223                Time-share user
                224-255                Idle user

Los tres SOs favorecen los procesos/hebras interactivos. Las hebras interactivas se ejecutan con mejor prioridad que las hebras con trabajos intensivos para la CPU, pero tienden a ejecutarse durante franjas de tiempo más pequeñas. Solaris, FreeBSD, y Linux utilizan una cola de ejecución por CPU. FreeBSD y Linux utilizan una cola "activa" y una cola "expirados". 

Las hebras se planifican con prioridad desde la cola activa. Una hebra pasa de la cola activa a la cola expirados cuando consume la franja de tiempo asignada (y posiblemente en otros momento para evitar la inanición). Cuando la cola activa está vacía, el kernel intercambia la cola activa y la de procesos expirados. FreeBSD tiene una tercera cola para las hebras "idle". Las hebras se ejecutan en esta cola sólo cuando las otras dos colas están vacias. Solaris utiliza una cola de envío por CPU. 

Si una hebra consume su franja de tiempo, el núcleo le asigna una nueva prioridad y la devuelve a la cola de envío. Las colas de ejecución para los tres SOs almacenan las hebras ejecutables en diferentes listas enlazadas, una por prioridad. (Aunque FreeBSD utiliza una lista para cuatro prioridades, tanto Solaris como Linux utilizan una lista separada por cada prioridad.)

Linux y FreeBSD utilizan un cálculo artimético basado en el tiempo de ejecución versus el tiempo inactivo de la hebra (como una medida de la "interactividad") para obtener la prioridad de la hebra. Solaris realiza una búsqueda en una tabla. Ninguno de los tres SOs soporta "gang scheduling"2. En lugar de planificar n hebras, cada SO planifica, la próxima hebra a ejecutar. 

Los tres SOs tienen mecanismos para sacar partido de la cache (afinidad) y balanceo de carga. En las CPUs con hyperthreading3 FreeBSD incorpora un mecanismo que ayuda a mantener hebras en la misma CPU. Solaris tiene un mecanismo similar, pero está bajo control del usuario y la aplicación, y no está restringido a hyperthreads (llamados "conjuntos de procesadores" en Solaris y "grupos de procesadores" en FreeBSD).

Una gran diferencia entre Solaris y los otros dos SOs es la capacidad para soportar "clases de planificación" de forma simultánea en el sistema. Los tres SOs soportan Posix SCHED_FIFO, SCHED_RR, y SCHED_OTHER (o SCHED_NORMAL). SCHED_FIFO y SCHED_RR normalmente se utilizan en las hebras "tiempo real". (Tanto Solaris como Linux soportan apropiación en el núcleo3 para asistir a las hebras de tiempo real.) Solaris tiene soporte para una clase "prioridad fija", "clase de sistema" para las hebras de sistema (como las hebras de paginación), una clase "interactiva" utilizada por hebras que se ejecutan en un entorno de ventanas bajo el control del servidor X, y el planificador de reparto limpio (Fair Share Scheduler) para asistir en la gestión de recursos. Consulte priocntl(1) para obtener información sobre el uso de estas clases y una visión general de las características de cada clase. Consulte FSS(7) para obtener información específica del Fair Share Scheduler. El planificador de FreeBSD se escoge en tiempo de compilación, y en Linux el planificador depende de la versión de Linux.

La habilidad de añadir nuevas clases de planificación al sistema tiene un precio. En todos los lugares del núcleo en los que se puede tomar una decisión de planificación (excepto para escoger la hebra a ejecutar) se realiza una llamada indirecta a código específico de la clase de planificador. Por ejemplo, cuando una hebra se va a dormir, llama a código dependiente de la clase de planificador que realiza la acción necesaria para dormir en la clase. En Linux y FreeBSD, el código de planificación símplemente realiza la acción necesaria. No hay necesidad de una llamada indirecta. La capa extra significa un pequeño aumento de la sobrecarga de planificación en Solaris (pero se obtienen más características).
 
Gestión de la memoria y Paginación

En Solaris cada proceso tiene un "espacio de direcciones" formado por secciones lógicas llamadas "segmentos". Los segmentos del espacio de direcciones de un proceso se pueden ver a través de  pmap(1). Solaris divide el código de gestión de memoria y las estructuras de datos en la parte independiente y dependiente de la plataforma. 

La porción específica de la plataforma de la gestión de memoria se encuentra en la capa HAT (hardware address translation) o traducción de direcciones físicas. FreeBSD describe el espacio de direcciones de un proceso mediante un vmspace, dividido en secciones lógicas llamadas regiones. Las porciones dependientes del hardware están en el módulo "pmap" (physical map) mapa físico y las rutinas "vmap" manejan las porciones y estructuras de datos independientes del hardware. Linux utiliza un descriptor de memoria para dividir el espacio de direcciones de un proceso en secciones lógicas llamadas "áreas de memoria" que describen el espacio de direcciones del proceso. Linux también tiene un comando pmap para examinar el espacio de direcciones de un proceso.

Los segmentos, regiones y áreas de memoria están delimitados por:
• Dirección Virtual del inicio de la zona.
• Su ubicación dentro de un archivo / objeto de que el sector / región / mapas de la zona de memoria.
• Permisos.
• Tamaño de la asignación.

Por ejemplo, el texto de un programa se encuentra en una zona de segmento / región / memoria. Los mecanismos en los tres sistemas operativos para la gestión de los espacios de direcciones son muy similares, pero los nombres de las estructuras de datos son completamente diferentes. Una vez más, más el código de Linux es dependiente de la máquina que en el caso de los otros dos sistemas operativos.

Sistemas de archivos

Los tres sistemas operativos utilizan una capa de abstracción de datos para ocultar los detalles de implementación del sistema de archivos de aplicaciones. Solaris y FreeBSD llaman VFS este mecanismo ("sistema de ficheros virtual") y la estructura de datos es el principio vnode, o "nodo virtual." Cada archivo que se accede en Solaris o FreeBSD tiene un vnode asignado. Además de la información de archivo genérico, el vnode contiene enlaces a archivos específicos del sistema de información. Linux también utiliza un mecanismo similar, también llamado VFS (para el "interruptor de archivos virtual"). En Linux, la estructura de datos del sistema de archivos independiente es un inodo. Esta estructura es similar a la vnode en Solaris / FreeBSD. (Tenga en cuenta que hay un inodestructure en Solaris / FreeBSD, pero estos son los datos del sistema de archivos que dependen de los sistemas de archivos UFS).Linux tiene dos estructuras diferentes, una para operaciones de archivo y otra para operaciones de inodos. Solaris y FreeBSD se combinan estos como "operaciones vnode."

VFS permite la implementación de muchos tipos de sistemas de archivos en el sistema. Esto significa que no hay razón por la que uno de estos sistemas operativos no podría acceder a los sistemas de archivos de los otros sistemas operativos. Por supuesto, esto requiere que las rutinas del sistema de archivos y estructuras de datos relevantes puedan ser soportados por  la VFS del sistema operativo en cuestión. Los tres sistemas operativos permiten el apilamiento de los sistemas de archivos.

Bibliografía:
http://elpuig.xeill.net/Members/vcarceler/articulos/una-comparativa-de-los-nucleos-solaris-linux-y-freebsd