---
# System prepended metadata

title: SO Lista 7
tags: [SO]

---

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

