Sincronización y programación de tareas en el kernel de Linux

  

Resumen: El concepto de sincronización se ha interpretado completamente en la programación de multiproceso y multiproceso. Los métodos de sincronización son fáciles de usar para las aplicaciones de usuario, sin tener que pensar demasiado en las razones por las que se generan (la única razón es el hilo o la concurrencia del proceso). Sin embargo, el proceso de sincronización en el kernel es mucho más complicado. El desarrollador debe saber cómo están programadas las tareas en el kernel para controlar efectivamente la sincronización en el kernel. Entonces, este artículo combinará la programación de tareas del kernel, analizará las medidas de sincronización en el kernel y combinará un ejemplo para describir cómo usar varios métodos de sincronización en el kernel.

Concurrencia, Competencia y Sincronización: los conceptos de concurrencia, competencia y sincronización, suponemos que todos saben, y este artículo no se repite. El foco de nuestra discusión es sobre qué sucede cuando el kernel es concurrencia? ¿Cómo prevenir la concurrencia del kernel? ¿Cuáles son los métodos de sincronización? ¿Y cuáles son las características de estos métodos y cómo usarlos?

El siguiente párrafo describe la relación general entre los conceptos anteriores, que también es aplicable en el kernel.

Para los desarrolladores de subprocesos múltiples, el acceso de múltiples subprocesos a los datos compartidos se utiliza a menudo para evitar una comunicación complicada entre procesos. Sin embargo, es probable que el acceso simultáneo de múltiples subprocesos a los datos compartidos cause competencia, lo que hace que los datos se encuentren en un estado inconsistente, por lo que se necesitan algunos métodos de sincronización para proteger los datos compartidos. La ejecución simultánea de subprocesos múltiples se debe a la programación preferente de subprocesos — — el programador interrumpe un subproceso durante el acceso a datos compartidos (aún no se ha completado), pone otro subproceso en operación — — Los hilos también necesitan acceder a estos datos compartidos, lo que creará competencia. Para evitar la competencia, es necesario que el subproceso acceda en serie a los datos compartidos, es decir, el acceso debe sincronizarse (mdash; mdash); una vez que una parte haya terminado de acceder a los datos, la otra parte puede acceder a los mismos datos.

Causas de concurrencia principales La situación anterior es una causa común del espacio de usuario concurrente. Para el núcleo, las razones de la concurrencia son similares, pero la situación es más diversa y más complicada.

La situación es relativamente simple para máquinas de procesamiento individuales. Antes del kernel 2.6, el kernel de Linux no era preventivo — — no podía interrumpirse hasta que se ejecutara la tarea del kernel. En este caso, la ejecución concurrente del programa en el kernel es rara. Solo hay dos posibilidades: Br>

Uno: Las interrupciones se producen porque la ejecución de la interrupción es asíncrona, y las interrupciones son la única manera de interrumpir el código del kernel en ejecución actual en un kernel no preventivo, por lo que las interrupciones obviamente se pueden ejecutar de forma concurrente con otro código del kernel. Entonces, si la operación de interrupción y el código del kernel interrumpido acceden a los mismos datos del kernel, se producirá la competencia.

Dos: reposo y reprogramación, la tarea del núcleo en el contexto del proceso (que se describe a continuación) puede dormir (reposo significa abandonar el procesador), luego el programador programará otros programas para que se ejecuten (primero ejecute la tarea programada) Las tareas del kernel en la cola, luego realizan interrupciones suaves, etc., y finalmente seleccionan un proceso de usuario de alta prioridad de la cola de ejecución para ejecutar). Obviamente, esto también causará el acceso simultáneo del kernel. Cuando la tarea del kernel está durmiendo y la tarea del kernel recién iniciada acceden a los mismos datos compartidos, ocurre la competencia. Vea Recursos 1

El kernel 2.6 se convierte en un kernel preventivo — — el kernel puede adelantarse al código del kernel en ejecución en cualquier momento. Así que la situación de ejecución concurrente en el kernel ha aumentado enormemente. La prioridad de Kernel se ha convertido en otra posibilidad para la concurrencia del programa del núcleo, por lo que debe tener cuidado con la competencia de preferencia al desarrollar el código de núcleo preventivo.

La concurrencia en un solo procesador es una pseudo concurrencia lógica. De hecho, el llamado programa de kernel concurrente en realidad usa el procesador de manera intercalada. Los verdaderos programas de ejecución concurrente deben confiar en multiprocesadores simétricos. Pero ya sea una concurrencia lógica o una verdadera concurrencia, habrá competencia y su procesamiento será el mismo. Pero para los multiprocesadores simétricos, dado que dos o más procesadores pueden ejecutar código al mismo tiempo, es inevitable traer concurrencia al kernel, si el código del kernel ejecutado en diferentes procesadores accede simultáneamente al mismo Compartiendo datos, se crea competencia. Por lo tanto, no hace falta decir que el multiprocesamiento simétrico es otra posibilidad de la concurrencia del kernel. Consulte la Referencia 2

. A medida que el kernel de Linux continúa evolucionando, el kernel es compatible con el sistema de manera más completa y la programación de tareas es más eficiente. Al mismo tiempo, también brinda más concurrencia al kernel. Fácil de provocar la competencia. Las diversas situaciones de concurrencia mencionadas anteriormente deben manejarse de manera efectiva en el kernel para asegurar una alta estabilidad del kernel.

Ya sea la concurrencia causada por interrupciones o la concurrencia causada por la suspensión, o la concurrencia causada por la preferencia del kernel, para evitarlo bien en el desarrollo del kernel, debe comprender sus razones de concurrencia en esencia. Solo después de dominar el mecanismo de programación de la tarea del kernel puede lograr realmente la posible predicción de la concurrencia, y luego puede adoptar el método de sincronización apropiado — — lock — — para evitar la concurrencia.

Vamos a discutir la programación de tareas a continuación. Compare las condiciones de la generación concurrente para analizar las condiciones bajo las cuales se produce la programación en el kernel.

Programación de tareas en el kernel: la programación de tareas de la que estamos hablando aquí es diferente de la programación de procesos que se dice a menudo. La programación del proceso es: El programador en el kernel selecciona la ejecución del proceso apropiado (prioridad alta) en la cola de ejecución del proceso. Lo que queremos decir con la programación de tareas del kernel significa que las tareas en el kernel obtienen oportunidades de ejecución. Para la concurrencia del kernel, la relación entre las tareas del kernel es especialmente importante.

Primero, echemos un vistazo a las tareas que tiene el kernel y cuáles son las características de cada uno.

Tipo de tarea principal Operación de interrupción dura:

Una interrupción dura es una interrupción generada por un periférico que no es el procesador. Estas interrupciones son recibidas por el procesador y se pasan al controlador de interrupciones en el kernel. Procesamiento. Se debe tener en cuenta que: Primero, la interrupción de disco duro se genera de forma asíncrona y la interrupción se procesa inmediatamente después de que se produce la interrupción, es decir, la operación de interrupción puede adelantarse al código en ejecución en el kernel. Esto es muy importante. Segundo, las operaciones de interrupción ocurren en el contexto de interrupciones (los denominados contextos de interrupción se refieren a contextos que son independientes de cualquier proceso). En el contexto de interrupción, los recursos relacionados con el proceso no pueden utilizarse y no pueden programarse. Consulte la referencia 2


Operación de interrupción suave:

La interrupción suave es un mecanismo de ejecución posterior al empuje en Linux que realiza algunas operaciones de interrupción dura más allá del momento en que se completa. Debido a que las interrupciones durante las operaciones de interrupción dura se descartan, las interrupciones duras se ejecutan en momentos inseguros. El tiempo inseguro debe ser lo más corto posible, por lo que las interrupciones suaves se utilizan para realizar la mayoría de las tareas. Empuja las tareas que consumen mucho tiempo y no se pueden completar con interrupciones duras para la ejecución segura del tiempo (la señal de interrupción no se descarta durante las interrupciones suaves).

Se puede ejecutar una interrupción suave en cualquier momento, como una interrupción fuerte. En general, una interrupción suave se procesará antes de volver al programa de nivel de usuario después de que se haya procesado la tarea de procesamiento del kernel. Específicamente, hay tres veces en que se ejecutará (do_softirq ()): después de que se complete la operación de interrupción de hardware; en el programador del kernel; cuando la llamada al sistema regresa, (el otro ciclo del ksoftirqd del kernel ejecuta la interrupción suave). Debe tenerse en cuenta que la ejecución de la interrupción suave también se encuentra en el contexto de la interrupción, por lo que el contexto de la interrupción lo limita a ser la interrupción dura.

Tasklet y mitad inferior

Tasklet y mitad inferior son dos tipos de mecanismos de retardo basados ​​en interrupciones suaves, la diferencia específica es que las interrupciones suaves están asignadas estáticamente, y las interrupciones suaves similares pueden ser Se ejecutan simultáneamente en varias CPU; las Tasklets pueden asignarse dinámicamente y diferentes tipos de Tasklets pueden ejecutarse en varias CPU al mismo tiempo, pero las Tasklets similares no pueden; la mitad inferior solo puede asignarse de forma estática, esencialmente la mitad inferior es una no puede Tasklets de alta prioridad que se ejecutan simultáneamente con la otra mitad inferior, incluso si son de diferentes tipos y se ejecutan en diferentes CPU.

Copyright © Conocimiento de Windows All Rights Reserved