Linux – procesy. Stany procesów w praktyce.
Do zrozumienia wpisu wymagana jest umiejętność napisania modułu jądra „HelloWorld” plus przynajmniej podstawowa wiedza na temat posługiwania się terminalem w Linuxie.
Proces jest programem w trakcie wykonania. Każdy proces posiada swój identyfikator (nr pid – process identifier).
W Linuksie procesy są opisane przez deskryptor procesu – strukturę task_struct ( implementacja ). W strukturze tej są zawarte wszystkie najważniejsze informacje o procesie, m. in. stan procesu, wskaźnik stosu, flagi, priorytety, pid, nr procesora, na którym proces jest wykonywany, listy procesów potomnych i siostrzanych itp.
Wykonywany proces może znajdować się w następujących stanach:
- unrunnable (wartość -1),
- runnable (wartość 0),
- stopped (wartość >0).
Wartości podane w nawiasach ( -1 , 0 , >0 ) są przypisywane do pola state w strukturze task_struct. Aby się dowiedzieć, w jaki sposób funkcjonują, najlepiej uzyskać dostęp do deskryptora pewnego procesu. Tutaj tym procesem będzie moduł jądra.
Teraz można z procesu dostać się do jego struktury task_struct. Aby móc korzystać z typu task_struct, należy dodać plik nagłówkowy <linux/sched.h>. Wtedy można zacząć działać:
Przy użyciu plecenia dmesg:
~# dmesg |tail
(w celu wyczyszczenia logów można użyć
~# dmesg -C
).
Można zobaczyć, w jakim stanie znajduje się proces w momencie wypisywania logów, np:
Teraz mały eksperyment z zatrzymywaniem procesu:
W powyższym przykładzie widać, że proces jest zatrzymywany wraz z przypisaniem mu wartości state 1. Proces jest wznawiany wraz z wywołaniem funkcji usuwającej moduł – komunikat wyświetlany po zmianie stanu procesu (z funkcji inicjującej) jest wyświetlany dopiero przy uruchomieniu
rmmod process
.
To będzie na tyle, jeśli chodzi o artykuł. Zachęcam do dalszego, samodzielnego eksperymentowania ze strukturą task_struct i wszystkim innym.
Wiktoria
Ten autor jeszcze nie podzielił się czymś o sobie.
Zobacz wszystkie posty tego autora →
Komentarze