# 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 ![](https://i.imgur.com/KosFpg7.png) **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ęć?** ![](https://i.imgur.com/SDHVKan.png) ## 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