• W jądrze może przebywać wiele procesów. Na przykład Proces A wywołuje funkcje read aby odczytać dane z pliku, wykonuje się w trybie jądra, trzeba zaczekać aż dane nadejdą (transmisja DMA), więc jest usypiany, planista przełącza procesor do procesu B, a ten również wchodzi do jądra. Musimy więc zadbać o synchronizację.
• Jądro Linuksa 2.0.x (ale późniejsze już nie), oparte jest na klasycznej zasadzie: Kod jądra jest niewywłaszczalny. Procesowi, który wykonuje się w trybie jądra nie zostanie odebrany procesor w celu przekazania innemu procesowi.
- Proces tylko może dobrowolnie zrzec się procesora, np. uśpić się jak w powyższym scenariuszu.
- Ponadto proces może być przerwany przerwaniem (ale cli() przed tym zabezpiecza).
• Upraszcza to znacznie synchronizację jądra. Wystarczy dbać:
- o blokowanie przerwań gdy handler przerwania odwołuje się do tej samej struktury danych co aktualna ścieżka kodu jądra.
- O pozostawienie danych w stanie spójnym, jeżeli proces w trybie jądra będzie usypiany.
• Jest to główna przyczyna stosowanie tej wersji jądra na zajęciach. W wersjach (2.2.x i późniejszych jest o wiele trudniej).
• Uwaga: czasami uśpić proces mogą pozornie niewinne funkcje jądra.
Wojciech Kwedlo, Systemy Operacyjne II -9- VWdzial Informatyki 1 PB