2011-08-18 8 views
11

Hay dos casos en los que el código de programador es schedule() invoked-¿En qué contexto se ejecuta el código del programador?

  1. Cuando un proceso llama voluntariamente schedule()

  2. interrupción del temporizador llama schedule()

En el caso 2, creo schedule() se ejecuta en contexto de interrupción, pero ¿qué pasa con el primer caso? ¿Se ejecuta en el contexto del proceso que lo invocó?

También hay más escenarios que invocan schedule()?

+0

Hay otro caso en el que horario será invocado(): cuando un proceso bloques (por ejemplo debido a la operación de E/S). – omer

+0

@omer Es la interrupción del temporizador que llama a schedule() cuando el proceso bloquea. entonces su caso es el mismo para el caso 2 – baotiao

Respuesta

7

schedule() siempre se ejecuta en el contexto del proceso. En el segundo caso, cuando se inicia con una interrupción de temporizador, se encuentra en la ruta de retorno desde el núcleo al proceso interrumpido donde se llama al schedule().

+0

El horario del pozo() ocurre como una llamada al sistema que es solo una interrupción de interrupción AFAIK ¿verdad? –

+0

@Jesus Ramos: "contexto de proceso" y "contexto de interrupción" son términos de desarrollo de kernel de Linux que describen el contexto del código que se está ejecutando en el espacio kernel: si se puede considerar que se ejecuta en nombre de un proceso particular (como en un sistema llamada) o al servicio alternativo de una interrupción de hardware. – caf

+0

Sí, sé que la terminología es que fue un poco confuso en este sentido porque técnicamente una llamada al sistema es una interrupción, así que no estoy seguro de si eso es lo que quería decir o la forma en que se ejecuta la llamada. –

0

Cuando un proceso llama al schedule(), se ejecuta en un contexto de llamada del sistema basado en interrupciones. En el segundo caso, una interrupción de hardware desencadena la llamada schedule(). En ambos casos se ejecuta como una interrupción. AFAIK esas son las únicas veces que se llama schedule() porque la mayoría de las manipulaciones de programación implican modificar la cola de ejecución de kernel de las cosas que se programarán, aunque un proceso puede interrumpirse, pero esto se hace generalmente a través de una interrupción para indicar el proceso o el proceso cede sí mismo.

2

__schedule() es la función principal del planificador.

Los principales medios de accionamiento del programador y por lo tanto entrar en esta función son:

  1. bloqueo explícito: mutex, semáforos, cola de espera, etc.

  2. bandera TIF_NEED_RESCHED se comprueba en interrupción y de retorno de espacio de usuario caminos. Por ejemplo, vea arch/x86/entry_64.S. Para impulsar apropiadamente las tareas, el planificador establece el indicador en el controlador de interrupción del temporizador scheduler_tick().

  3. Wakeups realmente no causa la entrada en el programa(). Agregan una tarea a la cola de ejecución y eso es todo. Ahora bien, si la nueva tarea añadida a la fase previa de colas que reemplaza al de la tarea actual, a continuación, los conjuntos de activación TIF_NEED_RESCHED y schedule() es llamado en la cercana ocasiones posibles:

    • Si el núcleo es de derecho preferente (CONFIG_PREEMPT = y) :
      • en el contexto syscall o de excepción, en el próximo outemost preempt_enable(). (Esto podría ser tan pronto como wake_up() 's spin_unlock()!)
      • en su contexto IRQ, regreso de interrupción-manejador al contexto con derecho preferente de
    • Si el núcleo no es de derecho preferente (CONFIG_PREEMPT no está establecido) y en la siguiente:
      • cond_resched() llamar
      • horario explícita() llamar
      • regreso de syscall o excepción a espacio de usuario
      • regreso de interrupción-handler a espacio de usuario

http://lxr.free-electrons.com/source/kernel/sched/core.c#L2389

Cuestiones relacionadas