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

- 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

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