2011-08-18 18 views
11

Istnieją dwa przypadki, w których kod scheduler schedule() jest invoked-W jakim kontekście działa kod programu planującego?

  1. Gdy proces dobrowolnie wzywa schedule()

  2. czasowy przerwania połączenia schedule()

W przypadku 2, myślę schedule() działa w kontekście przerwań, ale co z pierwszym przypadkiem? Czy działa w kontekście procesu, który go wywołał?

Czy są jeszcze jakieś scenariusze, które wywołują schedule()?

+0

jeszcze inny przypadek, w którym plan() zostanie wywołana, gdy bloki przetwarzania (na przykład w wyniku operacji I/O). – omer

+0

@omer Jest przerwą czasową, która wywołuje harmonogram połączeń(), gdy bloki procesowe. więc twój przypadek jest taki sam jak w przypadku 2 – baotiao

Odpowiedz

7

schedule() zawsze działa w kontekście procesu. W drugim przypadku, gdy jest on inicjowany przez przerwanie zegara, znajduje się on na ścieżce powrotnej od jądra do przerwanego procesu, w którym wywoływana jest nazwa schedule().

+0

Cóż, harmonogram() występuje jako wywołanie systemowe, które jest po prostu przerwaniem pułapki AFAIK, prawda? –

+0

@Jesus Ramos: "kontekst procesu" i "kontekst przerwań" to terminy rozwojowe jądra systemu Linux, które opisują kontekst kodu wykonywany w przestrzeni jądra: czy można go uznać za wykonywanie w imieniu określonego procesu (jak w systemie call) lub alternatywnie obsługujące przerwanie sprzętowe. – caf

+0

Tak, wiem, że terminologia polega na tym, że było to trochę zagmatwane w tym sensie, ponieważ wywołanie systemowe jest technicznie przerwaniem, więc nie jestem pewien, czy to właśnie miał na myśli, ani sposób, w jaki wywołanie jest wykonywane. –

0

Gdy proces wywołuje schedule(), uruchamia się w kontekście wywołania systemowego, który jest oparty na przerwaniach. W drugim przypadku przerwanie sprzętowe wyzwala wywołanie schedule(). W obu przypadkach działa jako przerwanie. AFAIK to jedyne czasy, w których wywoływana jest nazwa schedule(), ponieważ większość manipulacji harmonogramem obejmuje modyfikowanie kolejki uruchamiania jądra obiektów do zaplanowania, chociaż proces może zostać przerwany, ale zwykle odbywa się to za pomocą przerwania, aby powiedzieć procesowi o wydajności lub procesie samo.

2

__schedule() jest główną funkcją harmonogramu.

głównych sposobów prowadzenia harmonogramu, a tym samym wprowadzenie tej funkcji są:

  1. Explicit blokowanie: mutex, semafor, waitqueue itp

  2. TIF_NEED_RESCHED flaga jest sprawdzana na przerwanie i powrót w przestrzeni użytkownika ścieżki. Na przykład zobacz arch/x86/entry_64.S. Aby sterować prewencją między zadaniami, program planujący ustawia flagę w module obsługi przerwań timera scheduler_tick().

  3. Pobudki tak naprawdę nie powodują wejścia w harmonogram(). Dodają zadanie do kolejki uruchamiania i to wszystko. Teraz, gdy nowe zadanie dodany do run-kolejce ma pierwszeństwo bieżącego zadania, a następnie ustawia budzeniem TIF_NEED_RESCHED i harmonogram() jest wywoływana na najbliższej możliwej okazji:

    • Jeśli jądro jest wywłaszczonymi (CONFIG_PREEMPT = y) :
      • w kontekście syscall lub wyjątku, przy najbliższej preempt_enable(). (może to być tak szybko, jak w funkcji wake_up() w spin_unlock()!)
      • w kontekście IRQ powrocie z przerwaniami obsługi do wywłaszczonymi kontekście
    • Jeśli jądro nie jest wywłaszczonymi (CONFIG_PREEMPT nie jest ustawiony), a następnie na następny:
      • cond_resched() zadzwonić
      • wyraźny harmonogramu() wywołanie
      • powrót z syscall lub wyjątek dla przestrzeni
      • powrót z przerwaniami do obsługi przez użytkownika miejsca

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

Powiązane problemy