2010-09-03 13 views
5

http://lxr.linux.no/linux+v2.6.35/include/linux/preempt.h#L21W jaki sposób linux synchronizuje zliczanie prewencyjne

Próbuję tylko zdobyć źródło linuxa. Widziałem, jak to jest z prewencją i w jaki sposób linux zapewnia, że ​​liczba wyładowań jest atomowa? Kod tylko zwiększa wartość.

Mam również inne pytanie. dlaczego obsługa przerwań wymaga zachowania wzajemnego wykluczenia. Ponieważ tylko jeden może wykonać w tym samym czasie?

Również, gdy przerywanie jest wyłączone, co robi system operacyjny? Zignorować interrupy lub utrzymać kolejkę?

Odpowiedz

6

To preempt_count() - zauważysz () - co to makro jest zdefiniowany jako:

#define preempt_count() (current_thread_info()->preempt_count) 

Więc to jest inkrementacja zmiennej per-wątku, który nie wymaga żadnego blokowania i jest bezpieczny.


Najlepiej zadawać pytania wielokrotnego jako osobne pytania, ale krótko:

  • przerwań koparki może w ogóle być przerwana przez innych przerwań ładowarki;
  • Obsługa przerwania może działać na jednym rdzeniu procesora, podczas gdy inny kod jądra działa na innym rdzeniu;
  • Przerwania są zwykle wyłączane za pomocą mechanizmu sprzętowego. Mają one tendencję do zapamiętywania oczekujących przerwań, ale tylko do maksymalnie jednego na wektor przerwań.
+0

Dziękuję bardzo. czy możesz odpowiedzieć na moje następne pytania też. – mousey

+0

dziękuję bardzo. – mousey

+0

@ cf i mousey: jeśli inc/dec jest również wywoływane przez procedury obsługi błędów lub procedury obsługi przerw, czy byłoby to bezpieczne? Czy istnieją jakieś zasady mówiąc, że nie można tego zrobić? Pomysły? – minghua

0

Każdy współczesny procesor ma jakiś wariant instrukcji atomowej test-and-set. zwiększa

+1

sprawdź źródło. Nie używa żadnych instrukcji specyficznych dla systemu. Po prostu wzrasta – mousey

1

Operacja na zmiennej preempt_count nie jest atomowa. Region kodu między inc i dec z preempt_count wątku gwarantuje, że harmonogram nie zostanie wyłączony. Przełączanie kontekstu z bieżącego wątku w tym regionie kodu może się odbywać tylko w dalszych osadzonych wyjątkach lub przerwaniach. Po zakończeniu pierwszej operacji inc kolejne moduły obsługi zobaczą, że zmienna jest niezerowa, a zatem nie powoduje przełączenia kontekstu. Przed zakończeniem wątku można wyłączyć wątek, ale jest ok, ponieważ kod nie dotarł do strzeżonego regionu.

Kilka szczegółów: Definicja zmiennej atomowej powinna być podobna do "Atomic variables are the ones on whom the read modify write operation is done as one instruction with out any interruption". Operacja "Read-Modify-Write" na preempt_count może zostać przerwana przez inną procedurę obsługi wyjątku lub procedurę obsługi przerwań, ale tylko w sposób ściśle osadzony, czyli przez projekt jądra. Ponieważ te operacje osadzone są w parach, więc wartość preempt_count nie zostanie ostatecznie uszkodzona. Chociaż operacja R-M-W może zostać przerwana, a bieżący wątek może zostać wyłączony (tylko, jeśli żaden z wielu wbudowanych elementów nie został zakończony), ale jest to ok, ponieważ kod nie dotarł do strzeżonego regionu. Po ponownym przełączeniu wątku będzie kontynuował operację R-M-W i od tego punktu bieżący wątek nie zostanie wyłączony do momentu zakończenia wszystkich sparowanych dekad.

Powiązane problemy