--- title: SO Lista 7 tags: SO author: Mateusz Reis --- # SO LISTA 7 ## Zadanie 2 **odwzorowanie plików w pamięć** - zmapowanie pliku bezpośrednio do pamięci wirtualnej procesu **odwzorowanie pamięci anonimowej** - mapowanie pamięci bez pliku jest **Wypełnienie**: - pliki - zawartość pliku - anon - zera ``MAP_SHARED`` - mapowanie jest wspołdzielone między procesami, zmiany w tym obszarze będą widoczne dla innych procesów, które z niej skorzystają  ``MAP_PRIVATE`` - mapowanie jest prywatne dla danego procesu => inny proces może ją czytać jednak kiedy spróbuje coś do niej zapisać dostanie swoją kopię (copy-on-write) ## Zadanie 3 ![](https://i.imgur.com/2mNhNvm.png) - Prywatne odwzorowanie pliku - zainicjalizowanie pamięci zawartością z pliku, niektóre implementacje korzystają z tego do ładowania sekcji text z pliku wykonywalnego - Prywatne anonimowe odwzorowanie - alokacja nowej pamięci (malloc używa mmap) - Dzielone odwzorowanie pliku - dzielenie pamięci między procesami, alternatywa dla read/write - Dzielone anonimowe odwzorowanie - dzielenie pamięci między procesami ```cpp= void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); /** * * reszta jest do napisania w chwile wiec es * * */ ``` Po wywołaniu fork(): - mapowania prywatne od rodzica są widoczne ale przy próbie zapisu dziecko otrzymuje swoją kopię - mapowania współdzielone sa widoczne i można do nich pisać i czytać Po wywołaniu execve(): - w przypadku gdy plik wykonywalny jest dynamicznie linkowany ?? tworzone jest publiczne wspoldzielone mapowanie **pamięć wymiany** – miejsce na dysku, w którym system przechowuje strony, które nie mieszczą się fizycznie w pamięci RAM. Pamięć wymiany może być wymagana w przypadku używania prywatnych odwzorowań plików z prawami do pisania, gdyż zmiany w prywatnym odwzorowaniu nie są zapisywane do faktycznego pliku. W przypadku stron tylko do odczytu, nie ma potrzeby przechowywania ich w pamięci wymiany. Mie ma również potrzeby przydzielania pamięci wymiany dla mapowań dzielonych plików, gdyż sam plik zachowuje się jak swoja pamięć wymiany. Anonimowe mapowania z prawem do zapisu mogą wymagać użycia pamięci wymiany. Za pomocą flagi MAP_NORESERVE można ustalić czy należy zarezerwować miejsce w pamięci wymiany dla tworzonego mapowania. ## Zadanie 5 czas przebywania w systemie - czas od utworzenia do zakonczenia procesu czas procesora - czas jaki proces spedzil na wykonywaniu instrukcji Bez delegowania do podprocesów: ``` real 0m8,183s user 0m7,917s sys 0m0,208s ``` ``` Performance counter stats for './forksort': 8 162,81 msec task-clock # 0,989 CPUs utilized 1 658 context-switches # 0,203 K/sec 1 cpu-migrations # 0,000 K/sec 131 119 page-faults # 0,016 M/sec 30 084 769 018 cycles # 3,686 GHz (50,06%) 29 851 309 084 instructions # 0,99 insn per cycle (62,61%) 10 625 085 049 branches # 1301,646 M/sec (62,74%) 698 190 058 branch-misses # 6,57% of all branches (62,65%) 6 492 863 140 L1-dcache-loads # 795,420 M/sec (62,38%) 191 852 692 L1-dcache-load-misses # 2,95% of all L1-dcache hits (24,76%) 22 528 507 LLC-loads # 2,760 M/sec (25,00%) 11 353 366 LLC-load-misses # 50,40% of all LL-cache hits (37,50%) 8,257482966 seconds time elapsed 7,981885000 seconds user 0,187856000 seconds sys ``` Przy delegowaniu: ``` real 0m4,090s user 0m10,540s sys 0m0,691s ``` ``` Performance counter stats for './forksort': 11 305,98 msec task-clock # 2,793 CPUs utilized 9 927 context-switches # 0,878 K/sec 245 cpu-migrations # 0,022 K/sec 244 160 page-faults # 0,022 M/sec 41 480 052 456 cycles # 3,669 GHz (45,45%) 31 844 840 067 instructions # 0,77 insn per cycle (57,49%) 11 014 938 095 branches # 974,258 M/sec (58,24%) 713 238 493 branch-misses # 6,48% of all branches (58,25%) 8 120 149 568 L1-dcache-loads # 718,217 M/sec (32,52%) 248 460 711 L1-dcache-load-misses # 3,06% of all L1-dcache hits (25,91%) 49 651 507 LLC-loads # 4,392 M/sec (24,95%) 26 314 722 LLC-load-misses # 53,00% of all LL-cache hits (34,63%) 4,048280996 seconds time elapsed 10,536776000 seconds user 0,814492000 seconds sys ``` 8,257482966/4,048280996 = 2.03975044572 <- tyle razy szybciej udalo nam sie wykonac zadanie ![](https://i.imgur.com/Ru58sEX.png) po podstawieniu N=3 otrzymujemy P=0,76 ~ taka czesc programu mozemy wykonac rownolegle Procedury, których nie można wykonać równolegle(gdy operuja na duzych czesciach tablicy): -Partition -InsertionSort -SwapElements