# Lista 10, 26 maja 2021 ###### tags: `sju21` `ćwiczenia` ## Deklaracje Gotowość rozwiązania zadania należy wyrazić poprzez postawienie X w odpowiedniej kolumnie! Jeśli pożądasz zreferować dane zadanie w trakcie dyskusji (co najwyżej jedno!) oznacz je znakiem ==X== na żółtym tle. **UWAGA: Tabelkę wolno edytować tylko wtedy, gdy jest na zielonym tle!** :::success | |10-1 |10-2 |10-3 | | ---------------------:| --- | --- | --- | | Jacek Bizub | X | X | | 2 | Wojciech Jasiński | | | | 0 | Artur Juraszek | X | X | | 2 | Michał Myczkowski | | | | 0 | Michał Odorczuk | X | X | | 2 | Damian Ratajski | | | | 0 | Łukasz Siudek | | | | 0 | Błażej Sowa |==X==| X | | 2 | Andrzej Turko | X | X | | 2 | Maksymilian Zawartko | X | X | X | 3 ::: ## Zadanie 10-1 :::info Autor: Błażej Sowa ::: > Rozważmy wielowątkowy proces, w którym jeden z wątków wywołał [exit(2)]. Na podstawie implementacji procedury [exit_lwps] wyjaśnij uczestnikom zajęć w jaki sposób jądro kończy wykonanie pozostałych wątków w procesie. [exit(2)]: https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exit.c?r=1fe5c4da&mo=6017&fi=170#170 [exit_lwps]: https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exit.c?r=1fe5c4da#exit_lwps Wywołanie systemowe [sys_exit] przed zwolnieniem zasobów procesu, musi zakończyć wszystkie inne wątki korzystające z tych zasobów. Dzieje się to przez wywołanie procedury [exit_lwps], która: 1. Dla każdego bliźniaczego procesu: 1. Ustawia flagę `LW_EXIT`, która sprawi, że wątek wywoła exit przy powrocie do userspace. 1. Jeśli wątek jest w śnie przerywalnym albo jest wstrzymany, dodajemy go do run queue. ([setrunnable]) 1. W p.p. próbujemy wymusić powrót do userspace ([lwp_need_userret]) 1. Dopóki nie wszystkie wątki zostały zamknięte: 1. Czekamy na następny wątek zombie i zwalniamy jego zasoby ([lwp_wait]) 1. Jeśli przy czekaniu wystąpił błąd (np. wykryto deadlock), uruchamiamy [exit_lwps] ponownie. > Czy można wyznaczyć górne ograniczenie na czas wykonania wywołania `«exit»`? Nie, ponieważ musimy poczekać na wątki, które są w śnie nieprzerywalnym (np. przez wywołanie systemowe), a nie wiemy ile to może potrwać. > Gdzie jeszcze w jądrze wymagane jest użycie procedury «exit_lwps»? [execve_runproc](https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exec.c?r=1fe5c4da#execve_runproc) uruchomiony z wywołania systemowego [sys_execve](https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exec.c?r=1fe5c4da#598) [sys_exit]: https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exit.c?r=1fe5c4da&mo=6017&fi=170#170 [lwp_need_userret]: https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_lwp.c?r=1fe5c4da&fi=lwp_need_userret#1686 [setrunnable]: https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_synch.c?r=1fe5c4da#842 [lwp_wait]: https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_lwp.c?r=1fe5c4da#573 ## Zadanie 10-2 :::info Autor: Artur Juraszek ::: - przekazane w `options` flagi muszą należeć do [zbioru znanych wartości]( https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exit.c?r=1fe5c4da#997) - trzeba podać [przynajmniej jedną](https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exit.c?r=1fe5c4da#1002) flagę określającą typ eventu, na który czekamy - [wymiana](https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exit.c?r=1fe5c4da#1013) meta-id "moja grupa" na konkretny pgid - [matchujemy dany proces z naszymi oczekiwaniami](https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exit.c?r=1fe5c4da#819) - jeśli to nie jego szukamy, to wychodzimy - na zombiaki czekamy jedynie z [WEXITED](https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exit.c?r=1fe5c4da#868) - [wypełniamy](https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exit.c?r=1fe5c4da#871) siginfo - `WCONTINUED`, flagę wyrażającą chęć dowiedzenia się o tym, że zadanie zmieniło niedawno stan ze wstrzymanego na runnable obsługujemy [tutaj](https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exit.c?r=1fe5c4da#1065) - `WSTOPPED`, analogiczna flaga, ale w drugą stronę - "`STOPPED`" znaczy tutaj "zatrzymany przez jeden z sygnałów: SIGTTIN, SIGTTOU, SIGTSTP, or SIGSTOP" https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exit.c?r=1fe5c4da#1080 - jeśli znaleziony wątek nie spełnił naszych oczekiwań, a nie czekamy na całą grupę, to nie warto pętlić się dalej bez sensu: https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exit.c?r=1fe5c4da#1097 - `WNOHANG`: jeśli nie wykryliśmy żadnych zmian w statusie potomków, to zamiast zasnąć w oczekiwaniu na wystąpienie jej wychodzimy z błędem: https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exit.c?r=1fe5c4da#1115 - zasypiamy na CV przypisanej do rodzica, a nie dzieci, bo dzięki temu łatwiej go potem znaleźć (każde dziecko zna swojego rodzica, więc wybudzić może dowolne z nich): https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/kern_exit.c?r=1fe5c4da#1124 ## Zadanie 10-3 :::info Autor: Maksymilian Zawartko ::: Aktywator obrazu procesu rozpoznaje plik, który jest w stanie wykonać (różne aktywatory dla różnych formatów), a następnie przystępuje do wykonania. Aktywator może użyć swojej wiedzy o SO, dla którego plik został skompilowany, by poinstruować jądro, żeby używało odpowiednich implementacji wywołań systemowych podczas działania programu. * `exec_elf64_makecmds` ustawia odpowiednio vmcmds / Prepare an Elf binary's exec package. * `netbsd_elf64_probe` * `elf64_copyargs` kopiuje argumenty na nowy stos. * `coredump_elf64` robi core dumped * `exec_setup_stack` prekonfiguruje stos. https://mimiker.ii.uni.wroc.pl/source/xref/NetBSD/sys/kern/exec_elf.c?r=1fe5c4da#655 * `vn_marktext` oznacza vnode'a jako sekcję `.text`. Interpreter – program wykonujący inne programy.