2012-01-25 9 views
5

Czy przełącznik kontekstowy występuje w systemie, którego gotowa kolejka ma tylko jeden proces i która używa planowania cyklicznego?Czy przełącznik kontekstowy występuje w systemie, którego gotowa kolejka ma tylko jeden proces i która używa planowania cyklicznego?

Załóżmy, że aktualna seria procesorów pojedynczego procesu obejmuje więcej niż jeden wycinek algorytmu rundy-robin.

Moje rozumowanie jest jak poniżej

Kroki, które mogą mieć miejsce, gdy nastąpi przerwanie timera w typowym przypadku są

  1. Przerwanie występuje. Przełącznik trybu jądra
  2. OS zapisuje bieżący kontekst do PCB (z wyjątkiem rejestrów stanu procesu i informacje o pamięci zarządzania bieżącego procesu)
  3. wykonywać wiele architektury specyficzne operacje, w tym uderzenia gorąca danych i pamięci podręczne instrukcji i TLB-tych.
  4. Put bieżący proces do gotowego kolejce
  5. Wybierz nowy proces do wykonania
  6. kontekst ładunek z PCB tego procesu
  7. Przełącz do trybu użytkownika. Rozpocznij wykonywanie nowego procesu

Teraz myślę, że system operacyjny może równie dobrze sprawdzić gotową kolejkę i sprawdzić, czy są inne procesy. Jeśli nie ma żadnych, nie ma potrzeby zmiany kontekstu. Tak więc obsługa przerwań czasowych będzie wymagać przełączenia między trybem użytkownika i trybem jądra, sprawdzeniem gotowości Q i powrotem do trybu użytkownika w celu wznowienia wykonywania procesu.

Czy tak się dzieje? Czy ma miejsce właściwa zmiana kontekstu polegająca na niepotrzebnym oszczędzaniu obecnego stanu samotnego procesu i przywracaniu tego samego?

Jeśli to się wydarzy, czy jest jakiś szczególny powód?

To zamieszanie pojawiło się z powodu pytania w dokumencie egzaminacyjnym dotyczącym obliczenia czasu spędzonego w zmianie kontekstu w takiej sytuacji. Podana odpowiedź oznacza, że ​​mają miejsce przełączniki kontekstu.

Mam nadzieję, że ludzie, którzy zajrzeli do kodu jądra, będą w stanie to sprawdzić. Tak więc to pytanie na stackoverflow.

Odpowiedz

7

Poniższy kod z Linux Kernel wyjaśni wątpliwości. W różnych momentach jądro wywoła program planujący, aby wybrać nowy proces do uruchomienia. Ale może się okazać, że program planujący nie znajdzie innego zadania oprócz aktualnie uruchomionego zadania. W takim przypadku program planujący nie podejmie "przełącznika kontekstu", a raczej po prostu nie zwraca nic.

Na przykład, dam ci kod z jądrem Linux

......... 
    if (likely(prev != next)) {<-- if next and current are same, then no context switch 
      sched_info_switch(prev, next); 
      perf_event_task_sched_out(prev, next); 

      rq->nr_switches++; 
      rq->curr = next; 
      ++*switch_count; 

      context_switch(rq, prev, next); /* unlocks the rq */ 
      /* 
      * The context switch have flipped the stack from under us 
      * and restored the local variables which were saved when 
      * this task called schedule() in the past. prev == current 
      * is still correct, but it can be moved to another cpu/rq. 
      */ 
      cpu = smp_processor_id(); 
      rq = cpu_rq(cpu); 
    } else { 
    ............ 
+0

Nie chciałem powiedzieć, że to były dokładne i kroki w tej kolejności. Chciałem powiedzieć, że były to możliwe kroki i że mogą nie być potrzebne, jeśli nie było innego procesu w gotowym Q. Spróbuję uczynić to jaśniejszym w moim pytaniu. I tak, są z podręcznika. Teraz poznaję systemy operacyjne. –

+0

Dobrze! Książka wyświetli listę, co system operacyjny robi w ogólnym przypadku. Ale faktyczne wdrożenie zajmie się sprawami narożnymi, jak wspomniałeś.Zauważ, że na podstawie polityki planowania, nawet jeśli jest więcej niż jeden gotowy proces, system operacyjny może nadal wybrać proces, którego wycinek czasu właśnie się skończył. Jest to bardzo przydatna kontrola. Nie chcesz uruchamiać dodatkowego kodu, aby dowiedzieć się, że spowalnia system. – Saurabh

+0

Chciałbym zaakceptować twoją odpowiedź z tego powodu, że pokazany kod Linuksa wyraźnie pokazuje, że zmiana kontekstu nie ma miejsca, jeśli jest tylko jeden proces. Jednak uważam, że wyjaśnienie powyżej kodu nie prowadzi naturalnie do punktu wyrażonego przez kod. Stało się to przed moim wyjaśnieniem na temat pytania. Czy mógłbyś edytować swoją odpowiedź (część kodu innego niż linux), abym mógł zaakceptować twoją odpowiedź. Wszelkie sugestie dotyczące edytowania mojego pytania będą mile widziane. –

Powiązane problemy