2012-02-28 15 views
11

Właśnie rozpocząłem kodowanie sterownika urządzenia i nowe wątki, przejrzałem wiele dokumentów, aby uzyskać pojęcie o wątkach. nadal mam pewne wątpliwości.Co to jest wątek jądra?

  1. co to jest wątek jądra?
  2. jak to się różni od wątku użytkownika?
  3. jaki jest związek między tymi dwoma wątkami?
  4. Jak mogę zaimplementować wątki jądra?
  5. gdzie mogę zobaczyć dane wyjściowe wdrożenia ?.

Czy ktoś może mi pomóc? dzięki.

+2

Przeczytałeś to, zakładam? http://en.wikipedia.org/wiki/Thread_(computing) To powinno przynajmniej odpowiedzieć na niektóre z twoich pytań. – Bart

+2

Istnieje również [ta poprzednia odpowiedź] (http://stackoverflow.com/a/8809791/777186) w podobnym kontekście. – jogojapan

Odpowiedz

7

Wątek jądra to zadanie jądra działające tylko w trybie jądra; zwykle nie został utworzony przez wywołania systemowe fork() lub clone(). Przykładem jest kworker lub kswapd.

Prawdopodobnie nie powinieneś implementować wątków jądra, jeśli nie wiesz, czym one są.

Google podaje wiele stron dotyczących wątków jądra, np. Frey's page.

+2

Tylko dla informacji 'task-> mm' dla wątku jądra jest w rzeczywistości' NULL'. –

0

Ponieważ porównujesz wątki jądra z wątkami użytkownika [land], zakładam, że masz na myśli coś takiego.

Normalnym sposobem implementowania wątków jest obecnie zrobienie tego w jądrze, więc można je uznać za "normalne" wątki. Można to jednak zrobić w przestrzeni użytkownika, używając sygnałów takich jak SIGALRM, którego program obsługi zapisze bieżący stan procesu (rejestruje się w większości) i zmieni go na inny wcześniej zapisany. Wiele systemów operacyjnych używało tego jako sposobu implementowania wątków, zanim uzyskały właściwą obsługę wątków jądra. Mogą być szybsze, ponieważ nie musisz wchodzić w tryb jądra, ale w praktyce zanikają.

Istnieją również wątki współpracy z użytkownikami, w których jeden wątek działa, dopóki nie wywoła specjalnej funkcji (zwykle nazywanej wydajnością), która następnie przełącza się na inny wątek w podobny sposób, jak w przypadku SIGALRM powyżej. Zaletą jest to, że program jest w całkowitej kontroli, co może być przydatne, gdy masz problemy z czasem (na przykład gra). Nie musisz także dbać o bezpieczeństwo nici. Dużą wadą jest to, że tylko jeden wątek może działać na raz, a zatem ta metoda jest również niezbyt często teraz, gdy procesory mają wiele rdzeni.

Nici jądra są zaimplementowane w jądrze. Być może miałeś na myśli, jak z nich korzystać? Najczęstszym sposobem jest wywołanie pthread_create.

14
  1. Wątek jądra to task_struct bez komponentów przestrzeni użytkownika.
  2. Obok z powodu braku przestrzeni użytkownika, ma różne przodków (kthreadd gwint jądra zamiast procesu init) jest utworzona przez jądra tylko API zamiast sekwencji clone z fork/exec wywołań systemowych.
  3. Dwa wątki jądra mają jako rodzic nadrzędną nazwę kthreadd. Poza tym wątek jądra korzysta z tej samej "niezależności" od siebie jako procesów przestrzeni użytkownika.
  4. Użyj kthread_run funkcji/makro z kthread.h header Będziesz prawdopodobnie musiał napisać moduł jądra w celu wywołania tej funkcji, należy więc wziąć wyglądać A Linux Device Drivers
  5. Jeśli odnosimy się do wyjścia tekstu Twoja implementacja (przez wywołania printk), możesz zobaczyć to wyjście w dzienniku jądra, używając polecenia dmesg.