# Lista 13 (10.06.2021), grupa pwit
###### tags: `ask21` `ćwiczenia` `pwit`
## Deklaracje
Gotowość rozwiązania zadania należy wyrazić poprzez postawienie X w odpowiedniej kolumnie! Jeśli pożądasz zreferować dane zadanie (co najwyżej jedno!) w trakcie dyskusji oznacz je znakiem ==X== na żółtym tle.
**UWAGA: Tabelkę wolno edytować tylko wtedy, gdy jest na zielonym tle!**
Tabelka zawiera tylko osoby zapisane do grupy.
:::danger
| | 1 | 2 | 3 | 4 | 5 | 6 |
| --------------------:| --- | --- | --- | --- |:---:|:---:|
|Wojciech Adamiec | | | | | | |
|Kacper Bajkiewicz | X | X | X | | X | |
|Bartłomiej Hildebrandt| X | X | | | X | X |
|Dominik Komła | | | | | | |
|Aleksandra Kosińska | X | X | | X | X | X |
|Oleś Kulczewicz | X | | | X | X | |
|Damian Lukas | | | | | | |
|Michał Mikołajczyk | X | X | | | X | |
|Mateusz Opala | X | X | | X | X | |
|Łukasz Orawiec | X | X | | X | | |
|Szymon Pielat | X | X | | | X | |
|Łukasz Pluta | X | X | | X | X | X |
|Kamil Puchacz | | | | | | |
|Magdalena Rzepka | X | X | | | | |
|Cezary Stajszczyk | X | X | | X | X | X |
|Jakub Szajner | X | X | X | | X | |
|Bartosz Troszka | X | | | | X | |
|Miłosz Urbanik | X | X | X | | X | |
Zadanie 8 z listy 12
| | 7 | 8 |
| ------------------:|:---:|:---:|
| Michał Mikołajczyk | | X |
| Szymon Pielat | X | X |
:::
## Zadanie 1
:::info
Autor: Bartosz Troszka
:::

Można przetwarzać instrukcje znacznie sprawniej niż się wykonują.
Procesor często stara się przewidzieć czy warunek zajdzie, decyduje się na którąś opcję i przetwarza instrukcje do przodu nie zmieniając przy tym rejestrów i pamięci. Jeżeli program wykona się zgodnie z przewidywaniami to procesor comituje instrukcje do rejestrów,
jeżeli natomiast się pomylił to musi wrócić do momentu, w którym przewidywał. Jest to bardzo kosztowna operacja, kosztuje około 20 cykli, dlatego warto jej unikać i optymalizować skoki do instrukcji cmove szczególnie tam, gdzie warunek jest trudny do przewidzenia i często używany
```c=
void merge1(long src1[], long src2[], long dest[], long n) {
long i1 = 0, i2 = 0;
while (i1 < n && i2 < n) {
long v1 = src2[i1];
long v2 = src2[i2];
*dest++ = v1<v2 ? v1 : v2;
i1 += v1<v2;
i2 += (1-v1<v2);
}
}
```
## Zadanie 2
:::info
Autor: Łukasz Orawiec
:::
**Profilowanie** -- uruchamianie programu zawierającego dodatkowy kod pozwalający zmierzyć ile czasu zostało poświęcone na wykonanie poszczególne jego części.
<br/>
```
make gprof # 275.461 s
make gprof QUICK=1 # 19.970 s
make gprof QUICK=1 FIND=1 # 20.127 s
make gprof QUICK=1 FIND=2 # 15.837 s
make gprof QUICK=1 FIND=2 SIZE=199999 # 15.544 s
make gprof QUICK=1 FIND=2 SIZE=199999 HASH=2 # 1.103 s
make gprof QUICK=1 FIND=2 SIZE=199999 HASH=2 LOWER=1 # 0.840 s
```
Opis wyjścia gprof: https://ftp.gnu.org/old-gnu/Manuals/gprof-2.9.1/html_chapter/gprof_5.html
## Zadanie 3
:::info
Autor: Jakub Szajner
:::
**graf wywołań funkcji** - grał przepływu kontroli, który reprezentuje zależności między wywołaniami procedur. Krawędź (a, b) znaczy, że funkcja a wywołuje funkcję b.

Funkcje systemowe:
- te z podkreślnikiem
- wszystkie printfy, strtok, qsort
- main, start, malloc
Optymalizować można zmniejszajać liczbe malloców alokujać odrazu duża tablice stringów zamiast kazdego stringa osobno.
## Zadanie 4
:::info
Autor: Mateusz Opala
:::
sudo cat /proc/iomem:

sudo ./pagemap2 $$:

W celu przetłumaczenia adresów wirtualnych pomożymy pfn*page_size i dodamy do tego offset adresu wirtualnego. Przy czym mamy Page_Size= 4096 bajtów czyli 0x1000 Dla przykładu:
1.0x7ffd9f14b000 - 38103000 (System Ram)
2. 0x7ffd9f14c000 - 37f0e000 (System Ram)
## Zadanie 5
:::info
Autor: Aleksandra Kosińska
:::
**wirtualna przestrzeń adresowa** - każdy proces widzi swoją pamięć jako jednolity obszar, nie mając dostępu do pamięci innych procesów.
`vsz` - virtual memory size of the process in KiB
`rss` - resident set size, the non-swapped physical memory that a task has used (in kilobytes)
`ps -e -o pid,rss,vsz,cmd`:

`ps -e -o vsz | paste -sd+ - | bc`:

:::spoiler
nie mam tyle pamięci
:::
**współdzielenie pamięci** - segment przestrzeni adresowej, do którego dostęp może mieć wiele procesów. Jest to najszybszy sposób komunikacji pomiędzy procesami.
`free`:

**stronicowanie na żądanie** - sprowadzanie strony do pamięci operacyjnej tylko wtedy, gdy jest podjęta próba uzyskania dostępu do niej, a nie znajduje się ona jeszcze w pamięci
## Zadanie 6
:::info
Autor: Łukasz Pluta
:::

pamięć wymiany - pamięć na dysku, do której proces ma dostęp, to dodatkowe miejsce jest używane, gdy w RAMie nie ma już miejsca, odwołania do dysku są istotnie wolniejsze, ta pamięć w pewnym sensie udaje pamięć operacyjną dla procesu
zbiór roboczy - pamięć, której proces używa w jakimś przedziale czasu (być może po prostu podczas swojego działania)
zbiór rezydentny - pamięć jakiegoś procesu znajdująca się w RAMie w danym momencie
pamięć drugorzędna - urządzenia pamięci masowej - mamy więcej pamięci, ale jest ona wolniejsza niż RAM
System używa wymiany do pamięci drugorzędnej, kiedy w RAMie zaczyna brakować miejsca lub gdy jakaś część pamięci jest od dawna nieużywana.
System aproksymuje rozmiar zbioru roboczego sprawdzając regularnie, które strony były używane. Jeśli jakas strona jest nieużywana od długiego czasu to prawdopodobnie można zwolnić jej miejsce w RAMie. Przy odwołaniu do strony aktualizujemy czas jej ostatniego odwołania. W ten sposób jesteśmy w stanie łatwo znaleźć kandydata na wyrzucenie z RAMu, kiedy potrzebujemy załadować jakąś nową stronę.
Jeśli łączny rozmiar zbiorów
roboczych wszystkich procesów jest większy niż rozmiar pamięci fizycznej to system zaczyna się szamotać (ang. trashing) - żeby programy mogły się wykonywać system musi regularnie odczytywać informacje z dysku, przez co szybkość działania drastycznie spowalnia - odwołanie do dysku jest wielokrotnie wolniejsze niż odwołanie do RAMu.