Zmiany stanów procesów

Aleksander Zalewski
Listopad 2001

1 Algorytm sleep_on

Funkcje: Algorytm:
  1. zmiana stanu procesu na:
  2. zapamiętanie flag i blokada kolejki q
  3. dodanie bieżącego procesu do kolejki q
  4. odblokowanie kolejki q
  5. przeszeregowanie
  6. blokada kolejki q
  7. usunięcie z kolejki q
  8. odblokowanie kolejki q i odczytujemy flagi

2 Algorytm wake_up

W pliku sched.h mamy zdefiniowanych 10 makr. Tak naprawdę są to jednak wywołania funkcji __wake_up_common z różnymi parametrami, tj. Występuje jeszcze etap pośredni pomiędzy makrami a funkcją __wake_up_common są to funkcje __wake_up i __wake_up_sync.
Różnią się one dokładnie jednym znakiem!!! A mianowicie wartością parametru synchronus.
  1. Zablokowanie dostępu do kolejki procesów oczekujących i zapisanie flag
  2. wywołanie funkcji __wake_up_common z przekazanymi parametrami
  3. odwrotnie do punktu 1, odblokowujemy kolejkę i odczytujemy flagi
Wersja z _sync jako wartość parametru synchronus przekazuje 1 a bez 0. Wartość tą interpretuje się następująco: Algorytm: W pętli, dla kolejnych procesów z kolejki, sprawdzamy czy proces został uśpiony w odpowiednim trybie jeśli tak to próbujemy go obudzić.
Przerwanie wykonywania pętli możliwe jest z dwóch powodów:
  1. przeszliśmy już całą kolejkę
  2. zaszły na raz 3 warunki:
Niestety komentarz dotyczący tej funkcji jest zupełnie inny.

3 Algorytm wake_up_process

Budzenie pojedynczego procesu.
  1. zablokowanie kolejki procesów gotowych i zapisanie flag
  2. zmiana stanu procesu na TASK_RUNNING
  3. jeśli proces jest w kolejce procesów gotowych to skaczemy do punktu 6
  4. dodajemy proces do kolejki procesów gotowych
  5. jeśli jest wykonywany proces idle to następuje przeszeregowanie (funkcja: reschedule_idle)
  6. odwrotnie do punktu 1, odblokowujemy kolejkę procesów gotowych i odczytujemy flagi

4 Uwagi i komentarze

Blokowanie kolejek odbywa się na semaforach.
Zapisanie flag oznacza zapis rejestru flagowego procesora.
Jedno z makr (do wake_up) nie przekazuje jednego parametru. (również w wersji 2.4.13)