# Lista 7
###### tags: `SO`
## Zadanie 1
Odwzorowanie pliku w pamięć mapuje region pliku wprost do pamięci wirtualnej procesu, a odwzorowanie pamięci anonimowej tworzy wirtualny plik wypełniony 0.
**Czym różni się odwzorowanie
prywatne od dzielonego?**
W prywatnym wszystkie zmiany widoczne są tylko w tym procesie, który dokonał zmiany, a w dzielonym zmiany są synchronizowane.
**Czy pamięć obiektów odwzorowanych prywatnie może być współdzielona?**
Raczej nie.
**Czemu można tworzyć odwzorowania plików urządzeń blokowych w pamięć, a znakowych nie?**
Urządzenia znakowe nie mają losowego dostępu.
## Zadanie 2

**Co się dzieje z odwzorowaniami po wywołaniu fork(2)?**
Są dziedziczone.
**Czy wywołanie execve(2) tworzy odwzorowania prywatne czy dzielone**
Takie i takie, ponieważ musi stworzyć wirtualną przestrzeń adresową od nowa.
**W jaki sposób jądro systemu automatycznie zwiększa rozmiar stosu do ustalonego limitu?**
**Kiedy jądro wyśle sygnał SIGBUS do procesu posiadającego odwzorowanie pliku w pamięć?**

## Zadanie 3
## Zadanie 4
**Do czego służą struktury jądra «mm_struct::pgd» i «mm_struct::mmap»?**
mmap - tablica spójnych przestrzeni pamięci
## Zadanie 5
## Zadanie 6
**Czy mamy gwarancję, że program nie zobaczy modyfikacji zawartości pliku, które zostaną wprowadzone po utworzeniu tego odwzorowania?**
Nie mamy.
**Co złego mogłoby się stać, gdyby system operacyjny pozwolił modyfikować plik wykonywalny, który jest uruchomiony?**
Złośliwy użytkownik mógłby wstrzyknąć kod do wykonania już działającemu programowi.
## Zadanie 7
```c=
static int QuickSort(long table[], size_t left, size_t right) {
pid_t pid_left = -1, pid_right = -1, pid = -1;
/* TODO: If there is more to sort than FORKSORT_MIN start a subprocess. */
if(right - left > FORKSORT_MIN && true) {
pid = Fork();
if(pid) {
// Parent
return pid;
}
}
if (left < right) {
if (right - left <= INSERTSORT_MAX) {
InsertionSort(table, left, right);
} else {
size_t pivot = left + random() % (right - left + 1);
size_t split = Partition(table, left, right, table[pivot]);
if (left == split) {
SwapElem(table, left, pivot);
split++;
} else {
pid_left = QuickSort(table, left, split - 1);
}
pid_right = QuickSort(table, split, right);
/* TODO: Wait for possible children and exit if created a subprocess. */
if(pid_left > 0) {
Wait(NULL);
}
if(pid_right > 0) {
Wait(NULL);
}
if(pid == 0) {
// Child
exit(EXIT_SUCCESS);
}
}
}
return pid;
}
```
## Zadanie 8