Aprendizaje y comprensión de VxWorks (dos)

Gracias por compartir, y adjunte el enlace: http://www.prtos.org/vxworks-wind-kernel/

Este artículo analiza la idea de diseño del kernel de Wind. Como se mencionó anteriormente, el kernel de Wind de VxWorks adopta un diseño de micro-kernel adaptable con ejecución simultánea de múltiples tareas, programación de prioridad prioritaria, programación de intervalo de tiempo opcional, comunicación entre tareas y Mecanismo de sincronización, cambio de contexto rápido, latencia de interrupción baja, respuesta de interrupción rápida, soporte para anidación de interrupciones, soporte para 256 niveles de prioridad, herencia de prioridad de soporte y mecanismo de protección de eliminación de tareas. El kernel de viento se ejecuta en modo privilegiado y no usa instrucciones de trampa y salto tabla, todas las llamadas al sistema se implementan en forma de llamadas a funciones.

El kernel de Wind es un sólido kernel de sistema operativo en tiempo real, pero al igual que otros sistemas operativos maduros, no es un sistema operativo "duro en tiempo real". El llamado "tiempo real duro" significa que cuando ocurre un cierto evento, el sistema debe responder dentro de un tiempo predeterminado, o antes de una fecha límite, de lo contrario, causará consecuencias catastróficas. Un sistema operativo con esta característica debe hacer una promesa o rechazarla inmediatamente (para que el remitente pueda considerar otras medidas) para cada trabajo enviado y sus requisitos de tiempo, y garantizar la promesa hecha Su realización. Los trabajos que se envían al sistema en tiempo real duro también pueden ser sin requisitos de tiempo, pero, por supuesto, el compromiso con estos trabajos no incluye el factor tiempo y se tratarán como trabajos en segundo plano.

VxWorks no utiliza un algoritmo de programación basado en fechas límite, es decir, no acepta ningún requisito de tiempo para el envío de trabajos. Para mejorar el rendimiento en tiempo real, los métodos actuales son todos programación preventiva prioritaria, de modo que las tareas de alta prioridad se ejecutan primero. De esta manera, bajo la premisa de ciertos recursos informáticos, los requisitos en tiempo real se pueden cumplir mediante la división de tareas y el establecimiento de prioridades de tareas adecuados.

Nota: Algunas personas en Internet dicen que el kernel de VxWorks es un kernel duro en tiempo real, lo cual no es exacto. Para ser precisos, el sistema VxWorks es un sistema en tiempo real, pero su rendimiento en tiempo real se logra mediante la división de tareas adecuada y el establecimiento de prioridades de tareas bajo la premisa de ciertos recursos informáticos. Otros sistemas como el sistema uC / OS y FreeRTOS son todos Me gusta esto.

2.1 Estructura del núcleo del viento

Para mejorar el rendimiento en tiempo real del sistema, la mayoría de los sistemas operativos proporcionan varios mecanismos, como un kernel interrumpible y la segunda mitad del procesamiento de interrupciones. Para mejorar el rendimiento en tiempo real, VxWorks se construye en una estructura jerárquica con un micro-kernel.

En los primeros días de las computadoras, el sistema operativo era principalmente una entidad monolítica. En un sistema de este tipo, los módulos que proporcionan diferentes funciones se consideran de forma independiente, como la gestión del procesador, la gestión de la memoria, la gestión de archivos, etc., y la relación entre los módulos se considera menos. Dicho sistema operativo tiene una estructura clara y una estructura simple. Sin embargo, debido a la complejidad del sistema operativo, es difícil dividir el límite entre la parte interrumpible y la parte no interrumpible en este sistema operativo de gran granularidad, y Es difícil evitar operaciones redundantes en el sistema operativo La ejecución en la parte no prioritaria da como resultado un rendimiento deficiente en tiempo real del sistema y no es adecuada para entornos de aplicaciones en tiempo real.

Un sistema operativo con una estructura jerárquica de micro-kernel puede resolver mejor este problema. En un sistema operativo de este tipo, el núcleo se utiliza como punto de partida de la estructura jerárquica y las funciones de cada capa encapsulan las capas inferiores. El kernel solo necesita contener las instrucciones operativas más importantes, proporcionar una capa de abstracción entre el software de alto nivel y el hardware de bajo nivel, y formar el conjunto mínimo de operaciones requeridas por otras partes del sistema operativo. De esta manera, es relativamente fácil determinar con precisión el límite entre la parte prioritaria y la parte no anticipable, lo que reduce las operaciones que deben realizarse en la parte no anticipable del kernel, lo que conduce a lograr una anticipación del kernel más rápida y mejorando el rendimiento en tiempo real del sistema.

El mejor modelo de estructura interna de un sistema operativo es una estructura jerárquica, con el núcleo en la parte inferior. Estos niveles pueden verse como una pirámide invertida, con cada nivel construido sobre las funciones de los niveles inferiores. El kernel contiene solo las funciones de bajo nivel más importantes realizadas por un sistema operativo. Al igual que un sistema operativo con una estructura unificada, el kernel proporciona una capa de abstracción entre el software de alto nivel y el hardware de bajo nivel. Sin embargo, el kernel solo proporciona el conjunto mínimo de operaciones necesarias para construir el resto del sistema operativo.

El núcleo Wind de VxWorks es un micro-kernel que favorece la construcción de una estructura jerárquica. Consiste en la biblioteca kernelLib, la biblioteca taskLib, la biblioteca semLib, la biblioteca tickLib, la biblioteca wdLib, la biblioteca schedLib, la biblioteca workQLib, la biblioteca windLib, la biblioteca windAlib, biblioteca semAlib, y la biblioteca workQAlib está compuesta. Entre ellas, la biblioteca kernelLib, la biblioteca taskLib, la biblioteca semLib, la biblioteca tickLib y la biblioteca wdLib constituyen las funciones básicas del kernel VxWorks, y también son las funciones más básicas y centrales del kernel Wind. En un kernel de este tipo, es fácil lograr un rendimiento sólido en tiempo real; y la encapsulación de alto nivel del kernel permite a los usuarios llamar solo a las funciones de nivel superior cuando desarrollan aplicaciones de VxWorks, sin preocuparse por la implementación de nivel inferior, y el diseño del programa también es muy conveniente. La estructura del núcleo de VxWorks se puede dividir lógicamente en 3 capas, como se muestra en la Figura 2.1.

Interpretación-2 del kernel de VxWorks

2.1 Jerarquía del kernel de VxWorks

Las rutinas contenidas en la variable global kernelState constituyen el estado central del kernel Wind. Cuando kernelState se establece en TRUE, significa que hay código ejecutándose en el estado del kernel en este momento. La esencia del modo kernel de VxWorks es proteger la estructura de datos del kernel para evitar que múltiples códigos accedan a la estructura de datos del kernel al mismo tiempo, por lo que es diferente del concepto del modo kernel del sistema operativo general.

Para ingresar al modo kernel, simplemente establezca la variable global kernelState en TRUE. A partir de este punto, todos los datos del kernel estarán protegidos para evitar la competencia. Cuando finaliza la operación del kernel, VxWorks restablece kernelState a FALSE a través de la rutina windSalir (). Consideremos quién competirá para usar la estructura de datos del kernel cuando esté en modo kernel Obviamente, la rutina del servicio de interrupción es el único iniciador posible para solicitar trabajo adicional del kernel cuando el kernel Wind está en el kernel. Esto significa que una vez que el sistema ingresa al modo kernel, la única forma de que las aplicaciones soliciten servicios del kernel es a través de la rutina de servicio de interrupción.

El kernelState siempre se comprueba si se ha configurado antes de hacerlo. Esta es la esencia del mecanismo de exclusión mutua. El kernel de VxWorks utiliza la tecnología de retrasar el trabajo como método de implementación del mecanismo de exclusión mutua. Cuando el kernelState es TRUE, el trabajo a realizar no se ejecutará inmediatamente, sino que se retrasará como un trabajo retrasado cuando está en la cola de trabajos. La cola de trabajo de retraso del kernel solo se puede borrar con windSalir () antes de que se restaure el contexto de la tarea anterior que se va a ejecutar (o intSalir () se borra cuando el ISR de interrupción ingresa por primera vez al modo kernel). En el momento en que el modo kernel está a punto de finalizar, la interrupción se desactiva, windSalir () comprobará si la cola de trabajo está vacía y entrará en un contexto de tarea seleccionado.

Como se mencionó anteriormente, el kernel de Wind utiliza la variable global kernelState para simular un estado privilegiado del software. En el estado privilegiado, la preferencia de tareas está prohibida. Las funciones de las rutinas privilegiadas se encuentran en la biblioteca windLib. Ejecute las rutinas en la biblioteca windLib y las rutinas de llamada de nivel superior entrarán en el estado del kernel (kernelState = 1) para obtener el uso mutuamente exclusivo de todas las colas del kernel. Las rutinas de la biblioteca windLib tienen la capacidad de controlar libremente la estructura de datos del núcleo de la tarea. El estado del kernel (kernelState = 1) es una poderosa herramienta de exclusión mutua Durante el tiempo en el estado del kernel, la preferencia está prohibida. El alto retardo de preferencia destruye la rapidez del retardo de respuesta del sistema en tiempo real, por lo que este mecanismo debe usarse de manera muy conservadora (actualmente, el RTOS de código abierto que usa este mecanismo de diseño es solo RTEMS). De hecho, el concepto de diseño del microkernel es mantener el núcleo lo suficientemente pequeño sin dejar de tener la capacidad de admitir aplicaciones de nivel superior. ¿Recuerdas lo que dije en el capítulo anterior? "Un kernel hermoso no se trata de qué otras funciones se pueden agregar, sino de qué otras funciones se pueden reducir".

El kernel de Wind abre interrupciones cuando se encuentra en un estado privilegiado, lo que significa que el kernel aún puede continuar respondiendo a interrupciones externas en este momento.La innovación del kernel de Wind radica en el concepto de Work Queue . Dado que el estado del kernel solo puede tener acceso mutuamente exclusivo por aplicaciones de alto nivel, cuando ocurre una interrupción, si ningún programa accede a las rutinas de estado del kernel, el ISR de interrupción actual primero ingresará al estado del kernel (establecer kernelState en TRUE), y luego se ejecutará el ISR de interrupción correspondiente; si el estado del kernel ya está ocupado (kernelState = FALSE), el ISR interrumpido actual se colocará en la cola de trabajo del kernel y se devolverá directamente. Cuando el programa que ocupa el modo kernel sale del modo kernel (llama a la rutina windSalir ()), se ejecutará el trabajo en la cola de trabajo del kernel (es decir, Job) y se procesará la interrupción ISR (combinaré el código en una publicación de blog posterior) Análisis O (∩_∩) O).

Las rutinas de estado del kernel incluidas en el kernelState del kernel de viento se encuentran en la biblioteca windLib Las rutinas que comienzan con wind * se muestran en la Figura 2.2.

Interpretación-2 del kernel de VxWorks

Figura 2.2 Diagrama esquemático de las rutinas del modo kernel de VxWorks

entre ellos:

* Indica que la interrupción ISR no puede llamar a esta rutina y solo se puede llamar a nivel de tarea;

@ * significa que la rutina se puede llamar en la interrupción ISR;

# Indica que se utilizará dentro del núcleo de viento;

@ Significa que puede ejecutarse en modo kernel;

Los componentes del sistema VxWorks se muestran en la Figura 2.3.

Interpretación-2 del kernel de VxWorks

Figura 2.3 Diagrama de composición del sistema VxWorks

2.2 Clases y objetos de núcleos de viento

El núcleo de viento de VxWorks utiliza la idea de clase y objeto para organizar los cinco componentes del núcleo de viento: módulo de administración de tareas, módulo de administración de memoria, módulo de administración de colas de mensajes, módulo de administración de semáforos y módulo de administración de vigilancia.

En el kernel de Wind, todos los objetos son parte de una clase, y la clase define el método de operación del objeto (Método) y, al mismo tiempo, mantiene el registro de operación de todos los objetos. El núcleo de Wind adopta la semántica de C ++, pero está implementado en lenguaje C. Todo el núcleo de Wind se realiza mediante codificación explícita y su proceso de compilación no depende de un compilador específico. Esto significa que el kernel de Wind no solo se puede compilar en el compilador diab que viene con VxWorks, sino que también puede usar el compilador GNU / GCC de código abierto. VxWorks diseñó una metaclase para el núcleo Wind, y todas las clases de objetos (clase Obj) se basan en esta metaclase. Cada clase de objeto solo es responsable de mantener los métodos de operación de su respectivo objeto (Objeto) (como crear un objeto, inicializar un objeto, cancelar un objeto, etc.) y administrar registros estadísticos (como los datos de un objeto creado , el número de objetos destruidos, etc.). El modo de gestión de clases no es una característica del kernel de VxWorks, es una parte integral del sistema operativo, pero todos los objetos del kernel dependen de él. La Figura 2.4 muestra la relación entre clases de objetos, objetos y metaclases entre los diversos componentes del núcleo de Wind.

Interpretación-2 del kernel de VxWorks

Figura 2.4 Diagrama esquemático de la relación entre clase de objeto, objeto y metaclase

Observaciones: Al adoptar la idea de diseño de objetos y clases, los diversos componentes del núcleo Wind de VxWorks se pueden organizar orgánicamente. Al crear varias instancias del mismo componente, es conveniente verificar la exactitud del tipo de instancia. al mismo tiempo, todas las clases de objetos componentes se derivan de la clase base, el registro de operación de todos los objetos.

2.3 Características del núcleo de viento

Multitarea: la función básica del kernel es proporcionar un entorno multitarea. La multitarea hace que muchos programas parezcan ejecutarse al mismo tiempo, pero de hecho el kernel los ejecuta en etapas de acuerdo con el algoritmo de programación básico. Cada programa aparentemente independiente se convierte en una tarea. Cada tarea tiene su propio contexto, que contiene el entorno de la CPU y los recursos del sistema que ve cuando el kernel programa la ejecución de la tarea.

Estado de la tarea: el kernel mantiene el estado actual de cada tarea en el sistema. La transición de estado ocurre cuando la aplicación llama al servicio de función del kernel. Lo siguiente define el estado del kernel de viento:

Estado listo: una tarea actualmente no espera ningún recurso excepto la CPU

Estado bloqueado: una tarea está bloqueada porque algunos recursos no están disponibles

Estado retrasado: una tarea permanece inactiva durante un período de tiempo

Estado suspendido: un estado auxiliar utilizado principalmente para la depuración, ejecución de tareas prohibidas suspendidas

Después de que se crea la tarea, entra en estado suspendido y se requiere una operación específica para que la tarea creada entre en estado listo. Esta operación se ejecuta muy rápidamente, de modo que la aplicación puede crear la tarea con anticipación y activar la tarea en una forma rápida.

Control de programación: la multitarea requiere un algoritmo de programación para asignar la CPU a las tareas listas. El algoritmo de programación predeterminado en VxWorks es la programación preventiva basada en la prioridad, pero las aplicaciones también pueden optar por utilizar la programación por turnos por intervalos de tiempo.

  • Programación preventiva basada en prioridades : programación preventiva basada en prioridades, a cada tarea se le asigna una prioridad y el núcleo asigna la CPU a la tarea con la prioridad más alta en el estado listo. La programación adopta el método preventivo, porque cuando una tarea con una prioridad mayor que la tarea actual está lista, el kernel guardará inmediatamente la parte superior de la tarea actual y cambiará a la parte superior de la tarea de alta prioridad. VxWorks tiene 256 niveles de prioridad de 0 a 255. A la tarea se le asigna una prioridad cuando se crea, y la prioridad se puede modificar dinámicamente durante la ejecución de la tarea para rastrear la prioridad de los eventos del mundo real. A las interrupciones externas se les asigna prioridad sobre cualquier tarea, de modo que una tarea se puede adelantar en cualquier momento.
  • Rotación de la franja de tiempo : la programación preventiva basada en la prioridad puede ampliar la programación de la rotación de la franja de tiempo. La programación por turnos por intervalos de tiempo permite que las tareas en el estado listo de la misma prioridad compartan la CPU de manera justa. No hay programación por turnos de intervalos de tiempo. Cuando hay varias tareas que comparten el procesador con la misma prioridad, una tarea puede monopolizar la CPU y no se bloqueará hasta que sea reemplazada por una tarea de mayor prioridad sin dar otras tareas de la misma Prioridad Oportunidad de correr. Si la rotación de la franja de tiempo está habilitada, el contador de tiempo para ejecutar la tarea se incrementa cada tic del reloj. Cuando se agota el intervalo de tiempo especificado, el contador se borrará y la tarea se colocará al final de la cola de tareas con la misma prioridad. Las nuevas tareas que se unen a un grupo de prioridad específico se colocan al final del grupo de tareas y el contador en ejecución se inicializa a cero.

Funciones de tareas básicas: Las funciones de tareas básicas que se utilizan para el control del estado incluyen la creación, eliminación, suspensión y activación de una tarea. Una tarea también puede ponerse en reposo durante un intervalo de tiempo específico sin ejecutarse. Muchas otras rutinas de tareas proporcionan información de estado obtenida por el contexto de la tarea. Estas rutinas incluyen el acceso al control de registro del procesador actual de una tarea.

Problema de eliminación de tareas: el  núcleo de viento proporciona un mecanismo para evitar que las tareas se eliminen accidentalmente. Por lo general, una tarea que se ejecuta en un área crítica o accede a un recurso crítico debe estar especialmente protegida. Imaginamos la siguiente situación: una tarea obtiene acceso exclusivo a alguna estructura de datos y es eliminada por otra tarea mientras se ejecuta en la sección crítica. Debido a que la tarea no puede completar la operación en la sección crítica, la estructura de datos aún puede estar en un estado dañado o inconsistente. Además, asumiendo que la tarea no tiene posibilidad de liberar el recurso, cualquier otra tarea ahora no puede obtener el recurso y el recurso está congelado.

Se bloqueará cualquier tarea que desee eliminar o finalizar una tarea con protección contra eliminación. Cuando la tarea protegida completa la operación de la sección crítica, cancelará la protección de eliminación para que pueda ser eliminada, desbloqueando así la tarea de eliminación.

Como se muestra arriba, la protección contra la eliminación de tareas suele ir acompañada de operaciones mutuamente excluyentes. De esta manera, por conveniencia y eficiencia, el semáforo mutex incluye una opción de protección de eliminación (lo presentaré en detalle en una publicación de blog de seguimiento)

Comunicación entre tareas:  para proporcionar un sistema multitarea completo, el núcleo de Wind proporciona un amplio conjunto de mecanismos de sincronización y comunicación entre tareas. Estas funciones de comunicación permiten tareas independientes en una aplicación para coordinar sus actividades.

Espacio de direcciones compartido:  la base del mecanismo de comunicación entre tareas del kernel de Wind es el espacio de direcciones compartido donde se encuentran todas las tareas. Al compartir el espacio de direcciones, las tareas pueden comunicarse libremente utilizando punteros a estructuras de datos compartidas. La canalización no necesita mapear un área de memoria al espacio de direcciones de dos tareas que se comunican mutuamente.

Nota: Desafortunadamente, aunque el espacio de direcciones compartido tiene las ventajas anteriores, también conlleva el peligro de un acceso reentrante a la memoria desprotegida. Los sistemas operativos UNIX y Linux brindan dicha protección al aislar los procesos, pero al mismo tiempo conlleva una gran pérdida de rendimiento para los sistemas operativos en tiempo real.

Operación mutuamente excluyente:  cuando un espacio de direcciones compartido simplifica el intercambio de datos, es necesario evitar la competencia de recursos a través del acceso mutuamente excluyente. Muchos mecanismos utilizados para obtener acceso mutuamente exclusivo a un recurso difieren solo en el alcance de estos mutex. Los métodos para lograr la exclusión mutua incluyen la prohibición de interrupciones, la prohibición de la apropiación de tareas y el bloqueo de recursos mediante semáforos.

  • Prohibición de interrupciones: el método de exclusión mutua más fuerte es proteger las interrupciones. Dicho bloqueo garantiza el acceso exclusivo a la CPU. Este método ciertamente puede resolver el problema de la exclusión mutua, pero no es apropiado para tiempo real porque evita que el sistema responda a eventos externos durante el período de bloqueo. Los retrasos de interrupción prolongados son inaceptables para aplicaciones que requieren un tiempo de respuesta definido.
  • Prohibición de la apropiación: la prohibición de la apropiación proporciona una forma de exclusión mutua coercitiva y débil. Mientras se ejecuta la tarea actual, no se permite que otras tareas se apropien, pero se puede ejecutar la rutina del servicio de interrupción. Esto también puede causar una respuesta deficiente en tiempo real. Al igual que las interrupciones deshabilitadas, las tareas bloqueadas tendrán un retraso de preferencia prolongado, y las tareas de alta prioridad en el estado listo pueden verse obligadas a esperar un tiempo antes de que se puedan ejecutar. Tiempo aceptado. Para evitar esta situación, intente utilizar semáforos para lograr la exclusión mutua cuando sea posible.
  • Semáforo mutuamente excluyente: el semáforo es la forma básica de bloquear el acceso a los recursos compartidos. A diferencia de la prohibición de la interrupción o la apropiación, los semáforos restringen las operaciones de exclusión mutua solo a los recursos relacionados. Se crea un semáforo para proteger los recursos. El semáforo de VxWorks sigue los modos de operación P () y V () de Dijkstra.

Cuando una tarea solicita un semáforo, la operación P () depende del estado del semáforo que se establece o borra cuando se realiza la llamada.Ocurrirán dos situaciones. Si el semáforo está en el estado establecido, el semáforo se borrará y la tarea continuará ejecutándose inmediatamente. Si el semáforo está en el estado despejado, la tarea se bloqueará para esperar el semáforo.

Cuando una tarea libera el semáforo, suceden varias cosas en la operación V (). Si el semáforo ya está en el estado establecido, soltar el semáforo no tendrá ningún efecto. Si el semáforo está en el estado despejado y ninguna tarea está esperando al semáforo, simplemente se establece el semáforo. Si el semáforo está en el estado despejado y una o más tareas están esperando el semáforo, la tarea de mayor prioridad se desbloquea y el semáforo todavía está en el estado despejado.

Al asociar algunos recursos con el semáforo, se pueden lograr operaciones mutuamente excluyentes. Cuando una tarea quiere manipular recursos, primero debe obtener el semáforo. Siempre que la tarea tenga el semáforo, todas las demás tareas se bloquean solicitando el semáforo. Cuando una tarea termina de usar el recurso, libera el semáforo, lo que permite que otra tarea espere a que el semáforo acceda al recurso.

El núcleo de Wind proporciona semáforos binarios para resolver los problemas causados ​​por las operaciones de exclusión mutua. Estos problemas incluyen la protección contra la eliminación de los propietarios de recursos, la inversión de prioridades causada por la competencia de recursos:

  • Protección contra eliminación: un problema causado por la exclusión mutua implica la eliminación de tareas. En la sección crítica protegida por el semáforo, es necesario evitar que la tarea de ejecución sea eliminada accidentalmente. Eliminar una tarea realizada en una sección crítica es desastroso. El recurso se destruirá y el semáforo que protege el recurso dejará de estar disponible, por lo que no se podrá acceder al recurso. Por lo general, la protección contra eliminación se proporciona junto con operaciones mutuamente excluyentes. Por esta razón, los semáforos mutuamente excluyentes generalmente brindan opciones para proporcionar implícitamente el mecanismo de protección de eliminación de tareas mencionado anteriormente.
  • Inversión de prioridad / herencia de prioridad: la inversión de prioridad se produce cuando una tarea de alta prioridad se ve obligada a esperar un período de tiempo indeterminado para que una tarea de menor prioridad complete la ejecución. Considere las siguientes suposiciones (ya las he presentado en la publicación anterior del blog, aquí está O (∩_∩) O):

T1, T2 y T3 son tareas de prioridad alta, media y baja respectivamente. T3 obtiene los recursos relacionados al poseer el semáforo. Cuando T1 se adelanta a T3 y solicita el mismo semáforo para competir por el recurso, se bloquea. Si asumimos que T1 solo está bloqueado hasta que T3 haya agotado el recurso, la situación no es tan mala. Después de todo, los recursos no se pueden apropiar. Sin embargo, las tareas de prioridad baja no pueden evitar ser reemplazadas por tareas de prioridad media. Una tarea preventiva como T2 evitará que T3 complete operaciones en los recursos. Esta situación puede continuar bloqueando T1 y esperar un período de tiempo indeterminado. Esta situación se convierte en una inversión de prioridad, porque aunque el sistema se basa en la programación de prioridades, hace que una tarea de alta prioridad espere a que una tarea de baja prioridad se complete la ejecución. Los semáforos Mutex tienen una opción para permitir la implementación de algoritmos de herencia de prioridad. La herencia de prioridad resuelve el problema causado por la inversión de prioridad al elevar la prioridad de T3 a T1 mientras T1 está bloqueado. Esto evita que T3 e indirectamente evite que T2 se apropie de T1. En términos sencillos, el protocolo de herencia prioritaria permite que una tarea con un recurso espere la ejecución prioritaria de la tarea con la prioridad más alta entre las tareas del recurso. Cuando se completa la ejecución, la tarea libera el recurso y vuelve a su prioridad normal o estándar. Por lo tanto, las tareas que heredan la prioridad evitan ser reemplazadas por tareas de prioridad intermedia.

Sincronización: otro uso común del semáforo es para el mecanismo de sincronización entre tareas. En este caso, el semáforo representa la condición o evento que está esperando una tarea. Inicialmente, el semáforo está en estado despejado. Una tarea o interrupción indica la ocurrencia de un evento al configurar el semáforo. Las tareas que esperan el semáforo se bloquearán hasta que se produzca el evento y se establezca el semáforo. Una vez desbloqueada, la tarea ejecuta el controlador de eventos adecuado. La aplicación de semáforo en la sincronización de tareas es muy útil para liberar la rutina del servicio de interrupciones del procesamiento de eventos prolongados para acortar el tiempo de respuesta de las interrupciones.

Cola de mensajes: la cola de mensajes proporciona un mecanismo de nivel inferior para intercambiar mensajes de longitud variable entre tareas e interrumpir las rutinas de servicio u otras tareas. Este mecanismo es similar en función a las tuberías, pero tiene menos gastos generales.

Canalizaciones, sockets, llamadas a procedimientos remotos y muchos mecanismos vxWorks de alto nivel proporcionan abstracciones de comunicación de alto nivel entre tareas, incluidas canalizaciones, sockets TCP / IP, llamadas a procedimientos remotos y más. Para mantener el objetivo de diseño de reducir el kernel para incluir solo un conjunto mínimo de funciones suficiente para admitir funciones de alto nivel, estas características se basan en el método de sincronización del kernel descrito anteriormente.

2.4 Ventajas del diseño del núcleo de viento

Una característica de diseño importante del núcleo Wind es el retardo mínimo de preferencia. Otras ventajas importantes del diseño incluyen una capacidad de configuración sin precedentes, escalabilidad para requisitos de aplicación imprevistos y portabilidad en el desarrollo de diversas aplicaciones de microprocesadores.

Retraso mínimo de apropiación:  como se discutió anteriormente, prohibir la apropiación es una forma común de obtener operaciones mutuamente excluyentes para recursos de código críticos. El efecto negativo indeseable de esta técnica es el alto retardo de preferencia, que se puede lograr utilizando semáforos tanto como sea posible para lograr la exclusión mutua y mantener la sección crítica lo más compacta posible. Pero incluso el uso generalizado de semáforos no puede resolver todas las causas fundamentales que pueden causar retrasos en la preferencia. El núcleo en sí mismo es una fuente de retraso en la preferencia. Para comprender las razones, debemos comprender mejor las operaciones de exclusión mutua que requiere el kernel.

Nivel de kernel y nivel de tarea: en cualquier sistema multitarea, una gran cantidad de aplicaciones ocurren en el contexto de una o más tareas. Sin embargo, algunos intervalos de tiempo de la CPU no están en el contexto de ninguna tarea. Estos intervalos de tiempo ocurren cuando el kernel cambia las colas internas o decide la programación de tareas. En estos intervalos de tiempo, la CPU se ejecuta a nivel de kernel en lugar de a nivel de tarea.

Para que el kernel opere de forma segura sus estructuras de datos internas, debe haber operaciones de exclusión mutua. No hay un contexto de tarea relevante a nivel del kernel, y el kernel no puede usar semáforos para proteger la lista interna de enlaces. El núcleo utiliza aplazamientos de trabajo como una forma de lograr la exclusión mutua. Cuando el kernel participa, la función llamada por la rutina del servicio de interrupción no se activa directamente, sino que se coloca en la cola de trabajo del kernel. El kernel completa la ejecución de estas solicitudes y borra la cola de trabajo del kernel.

Cuando el kernel se está ejecutando y se ha solicitado el servicio, el sistema no responderá a las llamadas a funciones que lleguen al kernel. Se puede considerar simplemente que el estado del kernel es similar a prohibir la preferencia. Como se mencionó anteriormente, el retraso de preferencia no es deseable en los sistemas en tiempo real porque aumenta el tiempo de respuesta a los eventos que provocan la reprogramación de las tareas de la aplicación. Aunque es imposible que el sistema operativo evite por completo el consumo de tiempo a nivel del kernel (la preferencia está prohibida en este momento), es importante reducir este tiempo. Esta es la razón principal para reducir el número de funciones ejecutadas por el kernel, y también la razón para no adoptar una estructura unificada de diseño del sistema.

VxWorks muestra que un kernel mínimo diseñado con servicios de sistema operativo a nivel de tarea puede satisfacer la demanda. VxWorks es un sistema operativo en tiempo real con un kernel bastante pequeño y una estructura jerárquica completamente funcional que ahora está disponible, independientemente de cualquier procesador.

El sistema VxWorks proporciona una gran cantidad de funciones además del kernel Wind. Incluye administración de memoria, un paquete de red BSD4.3 completo, TCP / IP, sistema de archivos de red (NFS), llamada a procedimiento remoto (RPC), módulo de carga de enlace compatible con UNIX, interfaz de interpretación de lenguaje C, varios tipos de controladores de tiempo, monitoreo de desempeño componentes, herramientas de depuración, herramientas de comunicación adicionales como tuberías, señales y sockets, E / S y sistemas de archivos, y muchas rutinas funcionales. Estos no se ejecutan a nivel del kernel, por lo que no se prohíben las interrupciones o la apropiación de tareas.

Configurabilidad:  las aplicaciones en tiempo real tienen múltiples requisitos de kernel. Ningún núcleo tiene un buen compromiso de diseño para satisfacer todas las necesidades. Sin embargo, se puede configurar un kernel para ajustar características de rendimiento específicas y adaptar el sistema en tiempo real para que se adapte mejor a los requisitos de una aplicación. Se proporciona a la aplicación una capacidad de configuración impredecible del kernel en forma de un algoritmo de cola de kernel seleccionable por el usuario.

Estrategia de cola: la biblioteca de cola en vxWorks se ejecuta independientemente del uso de la función de cola del kernel, lo que proporciona la flexibilidad para agregar nuevos métodos de cola en el futuro.

Hay varias colas de kernel en VxWorks. La cola lista es una cola de todas las tareas que esperan ser programadas indexadas por prioridad. La cola de ticks se utiliza para funciones de temporización. La cola de semáforos es una lista vinculada de tareas bloqueadas que esperan el semáforo. La cola activa es una lista enlazada de primero en entrar, primero en salir (FIFO) de todas las tareas de un sistema. Cada una de estas colas requiere un algoritmo de cola diferente. Estos algoritmos no están integrados en el kernel, sino que se extraen en una biblioteca de colas convertible y autónoma. Esta forma de organización flexible es la base para cumplir con los requisitos de configuración especiales.

Escalabilidad:  la capacidad de admitir extensiones de kernel imprevistas es tan importante como la configurabilidad funcional. Las interfaces simples del kernel y los métodos de exclusión mutua hacen que las extensiones de funciones a nivel de kernel sean bastante fáciles; en algunos casos, las aplicaciones solo pueden usar funciones de enlace del kernel para implementar extensiones específicas.

Función de enlace interno: para agregar funciones adicionales relacionadas con la tarea al sistema sin modificar el kernel, VxWorks proporciona funciones de enlace para la creación, conmutación y eliminación de tareas. Estos permiten que se invoquen rutinas adicionales para su ejecución cuando se crean tareas, se cambian de contexto y se eliminan las tareas. Estas funciones de gancho pueden usar el área libre en el contexto de la tarea para crear las características de la tarea del kernel de Wind.

Consideraciones futuras:  muchas funciones del sistema se están volviendo cada vez más importantes y afectarán el retraso de preferencia en el diseño del kernel. Aunque una discusión completa de estos temas está más allá del alcance de esta publicación de blog, vale la pena mencionarla brevemente.

Diseñar un sistema operativo independiente de la CPU siempre ha sido un desafío. A medida que los nuevos procesadores RSIC (conjunto de instrucciones reducido) se vuelven populares, estas dificultades han aumentado. Para ejecutarse de manera efectiva en un entorno RISC, el kernel y el sistema operativo deben tener la flexibilidad para ejecutar diferentes estrategias.

Por ejemplo, considere las rutinas ejecutadas por el kernel durante el cambio de tareas. En la CPU CISC (conjunto de instrucciones complejas, como 680x0 o 80x86), el núcleo almacena un conjunto completo de registros para cada tarea, y estos registros se intercambian dentro y fuera cuando la tarea se está ejecutando. En una máquina RISC, esto no es razonable porque hay demasiados registros involucrados. Por lo tanto, el kernel necesita una estrategia más sofisticada, como registros de caché para tareas, lo que permite que las aplicaciones especifiquen algunos registros para tareas especiales.

Portabilidad: para que el kernel de Wind se ejecute en la estructura donde aparece, se requiere una versión de kernel portátil. Esto hace que la migración sea factible, pero no óptima.

Multiprocesamiento: el soporte de requisitos de multiprocesamiento estrechamente acoplados requiere que las funciones internas del kernel en tiempo real incluyan, idealmente, solicitar llamadas al kernel desde un extremo remoto, como de un procesador a otro. Esto implica llamadas de semáforo (para sincronizar entre procesadores) y llamadas de tareas (para controlar tareas en otra CPU). Sin duda, esta complejidad aumentará la sobrecarga de las llamadas a funciones a nivel de kernel, pero muchos servicios, como la identificación de objetos, se pueden realizar a nivel de tarea. La ventaja de mantener un núcleo mínimo en un sistema de multiprocesamiento es que el enclavamiento entre procesadores puede tener una mejor granularidad de tiempo. Los núcleos grandes consumirán tiempo extra a nivel de núcleo y solo se puede obtener una granularidad de tiempo de enclavamiento grueso.

Dimensiones importantes de los kernels en tiempo real: se utilizan muchas características de rendimiento para comparar los kernels existentes en tiempo real. Estas incluyen:

  • Cambio rápido de contexto de tareas: debido a la naturaleza multitarea de los sistemas en tiempo real, es importante que el sistema cambie rápidamente de una tarea a otra. En un sistema de tiempo compartido, como UNIX, el cambio de contexto se realiza en el nivel de ms. El cambio de contexto original realizado por el núcleo de Wind se mide a nivel de EE. UU.
  • Sobrecarga mínima de sincronización: debido a que la sincronización es el método básico para lograr acceso mutuamente exclusivo a los recursos, es importante minimizar la sobrecarga causada por estas operaciones. En vxWorks, la solicitud y la liberación de semáforos binarios también se miden a nivel estadounidense.
  • Latencia de interrupción mínima: debido a que los eventos del mundo exterior generalmente se presentan en forma de interrupciones, es importante que el sistema operativo procese estas interrupciones rápidamente. El kernel debe deshabilitar las interrupciones al operar algunas estructuras de datos críticas. Para reducir la latencia de interrupción, estos tiempos deben minimizarse. El retardo de interrupción del núcleo del viento también está al nivel de nosotros.

Nota: Los indicadores numéricos de rendimiento específicos solo se pueden obtener después de una medición directa en el tablero objetivo específico.

El impacto del retraso de preferencia en los indicadores de rendimiento:   cuando se envían muchas soluciones en tiempo real a los ingenieros de aplicaciones, los indicadores de rendimiento se vuelven cada vez más importantes para evaluar los productos de los proveedores. A diferencia del cambio de contexto y la latencia de interrupción, la latencia de preferencia es difícil de medir. Por lo tanto, rara vez se menciona en la descripción. Pero teniendo en cuenta que cuando el kernel normalmente prohíbe el cambio de contexto, puede durar hasta cientos de microsegundos, y no tiene sentido reclamar un tiempo de cambio de contexto de longitud fija de 50us (independientemente del número de tareas). Además de ser difícil de medir, la demora de preferencia puede debilitar la efectividad de muchos indicadores de desempeño. El kernel de viento minimiza el retraso de preferencia al reducir el tamaño del kernel. Un kernel con múltiples funciones causará inevitablemente un retraso de preferencia prolongado.

Atentamente, hice una introducción general al kernel de Wind. En el próximo artículo, detallaré los aspectos específicos del kernel de Wind en combinación con el código. . . . O (∩_∩) O

Supongo que te gusta

Origin blog.csdn.net/qq543716996/article/details/105246387
Recomendado
Clasificación