Nastoletni
Programiści

Logo Nastoletnich Programistów

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

  • Wojtek Olech

    Ogółem fajne, ale brakuje mi paru rzeczy
    – Skąd wzięło się current?
    – Czo to KERN_INFO?
    – skąd się konkretnie wzięły/co robią te magiczne makra z modułami?
    – dlaczego wszystkie funkcje są statyczne?
    – jak ogólnie działa printk() i czym się różni od, przykładowo, printf()?

    • `current` to proces, który odwołał się do tego modułu jakimś syscallem. Chyba.

      `KERN_INFO` to chyba jakieś makro, w każdym razie nim oznacza się że to co wypisuje się z jądra to informacja (a nie warning / error).

      „skąd się konkretnie wzięły/co robią te magiczne makra z modułami?”
      Magiczne makra z modułami to podstawowa wiedza o pisaniu modułów Linuksa, Wiktoria prosiła o tą wiedzę w pierwszym akapicie. 😛

      „dlaczego wszystkie funkcje są statyczne?”
      Bo potem eksportuje się je makrami module_* a `static` gwarantuje stały adres.

      „jak ogólnie działa printk() i czym się różni od, przykładowo, printf()?”
      printf » print format
      printk » print kernel
      Prawdopodobnie, nie chciało mi się googlać i strzelam.

      //edit: Mi w tym artykule brakuje czegoś więcej o procesach, bo fajnie by było pogłębić wiedzę na ten temat a dostałem 2 zdania z informacjami, które zna prawie każdy kto choć liznął temat i jakiś moduł, który tak w praktyce nie wiadomo co robi jak się samemu nie pogoogla.

    • Wiktoria Lewicka

      Current to deskryptor aktualnego procesu, jego struktura task_struct. Co do reszty pytań, większość odpowiedzi na nie można znależć w linku, który podałam na początku wpisu (hello world), są to podstawy pisania modułów.