# 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.