Fix wording and typos and add repository links

This commit is contained in:
Pavle Portic 2020-02-22 13:07:08 +01:00
parent 5827bc9328
commit db086982ae
Signed by: TheEdgeOfRage
GPG Key ID: 6758ACE46AA2A849
2 changed files with 66 additions and 50 deletions

View File

@ -1,10 +1,23 @@
@online{metodologija,
@online{methodology,
author = "TRBs National Freight Cooperative Research Program (NFCRP)",
title = "Report 21: Handbook on Applying Environmental Benchmarking in Freight Transportation explores how benchmarking can be used as a management tool in the freight and logistics industry to promote environmental performance.",
}
@online{rad,
author = "Xiang (Jenny) Ren; Kirk Rodrigues; Luyuan Chen; Camilo Vega; Michael Stumm; Ding Yuan (University of Toronto)",
title = "An Analysis of Performance Evolution of Linuxs Core Operations",
@online{paper,
author = "Xiang (Jenny) Ren; Kirk Rodrigues; Luyuan Chen; Camilo Vega; Michael Stumm; Ding Yuan",
url = "https://dl.acm.org/doi/10.1145/3341301.3359640",
title = "An Analysis of Performance Evolution of Linux's Core Operations",
year = "2019",
}
@online{repo:syscalls,
author = "Jelena Dokić",
title = "A collection of programs to benchmark system calls",
url = "https://gitlab.theedgeofrage.com/hpc/syscalls",
}
@online{repo:runner,
author = "Pavle Portić",
title = "Kernel compilation and benchmark execution",
url = "https://gitlab.theedgeofrage.com/hpc/runner",
}

View File

@ -5,8 +5,7 @@
\usepackage[serbian]{babel}
\usepackage[backend=biber, style=numeric, sorting=none]{biblatex}
\usepackage{csquotes}
% \usepackage[a4paper, top=20mm, bottom=20mm, left=30mm, right=15mm, headheight=10mm, headsep=5mm, footskip=9mm]{geometry}
\usepackage[a4paper]{geometry}
\usepackage[a4paper, top=30mm, bottom=30mm, left=30mm, right=30mm, headheight=10mm, headsep=8mm, footskip=15mm]{geometry}
\usepackage{fancyhdr}
\usepackage{float}
\usepackage{fontspec}
@ -77,7 +76,7 @@ Metrike koje se najčešće porede su:
\end{itemize}
\end{samepage}
Često se merenje performansi prepusti nekoj trećoj firmi koja je zadužena da sprovede ceo proces merenja. Metodologija merenja performansi~\cite{metodologija} sastoji se iz nekoliko koraka, koji su opisani u narednim sekcijama.
Često se merenje performansi prepusti nekoj trećoj firmi koja je zadužena da sprovede ceo proces merenja. Metodologija merenja performansi~\cite{methodology} sastoji se iz nekoliko koraka, koji su opisani u narednim sekcijama.
\section{Planiranje}
Planiranje je proces koji se radi pre merenja performansi. On je zadužen da definiše način merenja performansi, kriterijume merenja, kriterijume poređenja itd. Sastoji se od četiri koraka:
@ -153,7 +152,7 @@ Ova oblast objašnjava način merenja performansi sistemskih poziva koji zavise
\section{Planiranje}
\subsection{Identifikacija funkcionalnosti čije se performanse mere}\label{identifikacija_funkcionalnosti}
Na osnovu rada ``An Analysis of Performance Evolution of Linuxs Core Operations''~\cite{rad} i poznavanja Linux operativnog sistema, odlučeno je da se meri vreme izvršanja sledećih sistemskih poziva:
Na osnovu rada ``An Analysis of Performance Evolution of Linuxs Core Operations''~\cite{paper} i poznavanja Linux operativnog sistema, odlučeno je da se meri vreme izvršanja sledećih sistemskih poziva:
\begin{samepage}
\begin{itemize}
\item thread
@ -195,7 +194,6 @@ Verzija Linux jezgra je 5.5 i ista je na svim računarima. Merenje se vrši od s
Pošto cilj ovog rada nije unapređenje performansi nekog sistema, nije potrebno pronalaziti sistem sa kojim bi se ovaj sistem poredio. Poređenje se vrši između performansi koje sistem postigne pri različitim ulaznim parametrima.
\subsection{Biranje kriterijuma merenja performansi}
%\label{sec:hello}
Kriterijum merenja performansi je brzina izvršanja sistemskih poziva koji su navedeni u \hyperref[identifikacija_funkcionalnosti]{sekciji 3.1.1}. Brzina se izražava u milisekundama (1E-3 s) za sve sistemske pozive. Sistemski pozivi se izvršavaju više puta radi veće preciznosti merenja. Pri promeni ulaznih parametara (konfiguracije jezgra) broj izvršavanja sistemskih poziva se ne menja.
\subsection{Izbor načina prikupljanja podataka}
@ -233,60 +231,65 @@ Računari u današnje vreme imaju široki spektar primene i samim tim su im potr
\section{Integracija}
Pošto ovo merenje performansi nije takmičarsko merenje i ne služi za kreiranje komercijalnog proizvoda, integracija se znatno olakšava. Potrebno je podesiti konfiguracione parametre Linux jezgra, prevesti ga i instalirati na računaru.
\chapter{Arhitektura} % TODO
\chapter{Arhitektura}
\section{Linux jezgro}
Linux jezgro operativnog sistema je softver otvorenog koda, što znači da svaki korisnik može da preuzme celokupan kod sa interneta i prevede ga za lični računar. Pored toga što se neke funkcionalnosti Linux jezgra mogu kontrolisati tokom vremena izvršavanja, nudi i mnoštvo konfiguracionih parametara tokom prevođenja. Ti parametri ne utiču samo na mogućnosti jezgra, već mogu i menjati način rada internih komponenti (modula). Shodno tome, menjaju se i performanse jezgra, tj vreme izvršavanja koda tih modula.
Linux jezgro operativnog sistema je softver otvorenog koda, što znači da svaki korisnik može da preuzme celokupan kod sa interneta i prevede ga za lični računar. Pored toga što se neke funkcionalnosti Linux jezgra mogu kontrolisati tokom vremena izvršavanja, nudi i mnoštvo konfiguracionih parametara tokom prevođenja. Ti parametri ne utiču samo na mogućnosti jezgra, već mogu menjati i način rada internih komponenti (modula). Shodno tome, menjaju se i performanse jezgra, tj vreme izvršavanja koda tih modula.
Cilj rada je da utvrdi koje konfiguracije imaju najveći uticaj na performanse na razne sistemske pozive. Lista parametara nad kojima je izvršeno testiranje je preuzeta iz istraživačkog rada koji je ispitivao performanse različitih verzija jezgra~\cite{rad}.
Cilj rada je da utvrdi koje konfiguracije imaju najveći uticaj na performanse na razne sistemske pozive. Lista parametara nad kojima je izvršeno testiranje je preuzeta iz istraživačkog rada koji je ispitivao performanse različitih verzija jezgra~\cite{paper}.
Ostatak ove sekcije objašnjava svaki parametar, njegov uticaj na jezgro, kao i očekivani uticaj na performanse.
\subsection{CONFIG\_HARDENED\_USERCOPY}
\textit{Hardened usercopy} dodaje dodatne (i ponekad redundante) provere validnosti kernel pokazivača prilikom kopiranja podataka iz prostora jezgra u korisnički prostor i obrnuto. Te provere mogu imati ne zanemarljiv uticaj na trajanje operacije kopiranja.
\textit{Hardened usercopy} dodaje dodatne (i ponekad redundante) provere validnosti kernel pokazivača prilikom kopiranja podataka iz prostora jezgra u korisnički prostor i obrnuto. Te provere mogu imati nezanemarljiv uticaj na trajanje operacije kopiranja.
\subsection{CONFIG\_MEMCG}
\textit{CGroup memory controller}, memorijski kontroler za kontrolne grupe zabeležava i ograničava zauzeće memorije različitih kontrolnih grupa (\textit{cgroups}). Dozvoljava granularnu kontrolu nad resursima i jedna od glavnih je gradivnih jedinica za tehnologije kontejnerizacije procesa kao što su Docker i LXC\@. Ovaj modul može imati značajan uticaj na procese koji značajno koriste kontroler memorije jezgra, iako ne koriste mogućnosti kontrolera memorije kontrolnih grupa.
\textit{CGroup memory controller}, memorijski kontroler za kontrolne grupe zabeležava i ograničava zauzeće memorije različitih kontrolnih grupa (\textit{cgroups}). Dozvoljava granularnu kontrolu nad resursima i jedna je od glavnih gradivnih jedinica za tehnologije kontejnerizacije procesa kao što su Docker i LXC\@. Ovaj modul može imati značajan uticaj na procese koji intenzivno koriste kontroler memorije jezgra, iako ne koriste mogućnosti kontrolera memorije kontrolnih grupa.
\subsection{CONFIG\_PAGE\_TABLE\_ISOLATION}
Izolacija jezgarne tabele stranica od korisničkog prostora je dodata kao sigurnosna zakrpa za izbegavanje \textit{Meltdown} ranjivosti prisutna kod velikog broja procesora. Uticaj na performnse varira od procesora i programa koji se izvršava, ali sa obzirom da eksploatisanje ranjivosti zahteva pokretanje programa, ovaj parametar se može ugasiti za sisteme na kojima je garantovano da se pokreće isključivo provereni kod, kao na primer\ HPC klasteri.
Izolacija jezgarne tabele stranica od korisničkog prostora je dodata kao sigurnosna zakrpa za izbegavanje \textit{Meltdown} ranjivosti prisutna kod velikog broja procesora. Uticaj na performanse varira od procesora i programa koji se izvršava, ali sa obzirom da eksploatisanje ranjivosti zahteva pokretanje malicioznog programa, ovaj parametar se može ugasiti za sisteme na kojima je garantovano da se pokreće isključivo provereni kod, kao na primer\ HPC proračuni.
\subsection{CONFIG\_RETPOLINE}
Izbegavanje spekulacije indirektnih grana je mera zaštite od \textit{Spectre V2} ranjivosti prisutna u modernim procesorima. Ovaj parametar kontroliše prisutnost zakrpe za izbegavanje te ranjivosti u kodu jezgra. Indirektna grana je skok u programskom kodu čiji cilj se ne može utvrditi statički, samo tokom vremena izvršavanja. Moderni Intel i AMD procesori predviđaju koja će se grana najverovatnije izvršiti i nastavljaju sa izvršavanjem kako se ne bi prekinuo tok instrukcija. Problem je u tome što procesori ne eliminišu sve sporedne efekte prilikom pogrešne predikcije, npr.\ tako što ostave podatke u keš memoriji, što dovodi do toga da pažljivo izvršen maliciozan program može izvući poverljive podatke direktno iz procesora. Zakrpa je da na svim mestima u kodu jezgra gde može doći do pogrešne predikcije se to mesto popuni takozvanim \textit{thunk} segmentom koji se u suštini sastoji od beskonačne petlje.
Izbegavanje spekulacije indirektnih grana je mera zaštite od \textit{Spectre V2} ranjivosti prisutna u modernim procesorima. Ovaj parametar kontroliše prisutnost zakrpe za izbegavanje te ranjivosti u kodu jezgra. Indirektna grana je skok u programskom kodu čiji cilj se ne može utvrditi statički, već samo tokom vremena izvršavanja. Moderni Intel i AMD procesori predviđaju koja će se grana najverovatnije izvršiti i nastavljaju sa izvršavanjem kako se ne bi prekinuo tok instrukcija. Problem je u tome što procesori ne eliminišu sve sporedne efekte prilikom pogrešne predikcije, npr.\ tako što ostave podatke u keš memoriji, što dovodi do toga da pažljivo izvršen maliciozan program može izvući poverljive podatke direktno iz procesora. Zakrpa je da se svako mesto u kodu jezgra, gde može doći do pogrešne predikcije, popuni takozvanim \textit{thunk} segmentom, koji se u suštini sastoji od beskonačne petlje.
\subsection{CONFIG\_TRANSPARENT\_HUGEPAGE\_ALWAYS}
Transparentne podrazumevane velike stranice dozvoljavaju jezgru da uvek odvoji veliku stranicu (2M) umesto osnovne (4K) što dovodi do smanjena tabele stranica i smanjuje broj \textit{pagefault} grešaka. Sa druge strane, može imati i negativan uticaj na performanse. Može dovesti do interne fragmentacije unutar stranica. Postoji i pozadinska nit koja povremeno osnovne stranice unapredi u velike, ali i troši procesorsko vreme. Razlika u performansi zavisi od načina korišćenja memorije, pa je teško meriti performanse za ovaj parametar.
Podrazumevane velike stranice dozvoljavaju jezgru da uvek odvoji veliku stranicu (2M) umesto osnovne (4K), što dovodi do smanjena tabele stranica i smanjuje broj \textit{pagefault} grešaka. Sa druge strane, može imati i negativan uticaj na performanse. Može dovesti do interne fragmentacije unutar stranica. Postoji i pozadinska nit koja povremeno osnovne stranice unapredi u velike, ali i troši procesorsko vreme. Razlika u performansi zavisi od načina korišćenja memorije, pa je teško meriti performanse za ovaj parametar.
\subsection{CONFIG\_USERFAULTFD}
Rukovanje \textit{pagefault} greškom u korisničkom prostoru ima primena za virtuelne mašine, ali sa sobom nosi i smanjene performanse nekih sistemskih poziva, najiviše za \texttt{fork}. Razlog je što prilikom kreiranja procesa, sistemski poziv mora proveriti za svaku memorijsku regiju roditlja da li ima informacije o rukovanju \textit{pagefault} grešaka u korisničkom prostoru.
Rukovanje \textit{pagefault} greškom u korisničkom prostoru ima primena za virtuelne mašine, ali sa sobom nosi i smanjenje performansi nekih sistemskih poziva, najiviše za \texttt{fork}. Razlog je što, prilikom kreiranja procesa, sistemski poziv mora proveriti za svaku memorijsku regiju roditelja da li ima informacije o rukovanju \textit{pagefault} greškama u korisničkom prostoru i preneti informaciju na regiju u procesu deteta.
\section{Distribucija}
Izvorni kod Linux jezgra je javno dostupan i proces prevođenja u binarnu datoteku je prost i jasno dokumentovan. Ono što nedostaje su korisničke aplikacije i ostatak operativnog sistema. Kad je u pitanju Linux jezgro, postoji mnoštvo takozvanih distribucija koje nude celokupan operativni sistem sa korisničkim aplikacijama i svim što je potrebno da bi sistem bio funkcionalan.
Izvorni kod Linux jezgra je javno dostupan i proces prevođenja u binarnu datoteku je prost i jasno dokumentovan. Ono što nedostaje su korisničke aplikacije i ostatak operativnog sistema. Kad je u pitanju Linux jezgro, postoji mnoštvo takozvanih distribucija, koje nude celokupan operativni sistem sa korisničkim aplikacijama i svim što je potrebno da bi sistem bio funkcionalan.
Distribucija koja je izabrana za ovo testiranje je Arch Linux. Glavne prednosti ove distribucije su prilagodljivost i minimalnost. Minimalna instalacija troši veoma malo resursa pošto nema grafički interfejs i pozadinske servise koji nisu potrebni za osnovni rad operativnog sistema.
Pored toga, nudi i alate za kreiranje prilagođenih paketa (\textit{eng.\ package}), uključujući i samog jezgra. Kreirane su datoteke sa konfiguracijama za prevođenje jezgra sa izmenjenim parametrima koji su navedeni u prethodnoj sekciji, a zatim pokrenuta skripta koja prevodi kod jezgra i pakuje u izlaznu datoteku (paket).
Pored toga, nudi i alate za kreiranje prilagođenih paketa (\textit{eng.\ package}), uključujući i samog jezgra. Za merenje performansi sistemskih poziva, kreirane su datoteke sa konfiguracijama za prevođenje jezgra sa izmenjenim parametrima koji su navedeni u prethodnoj sekciji, a zatim pokrenuta skripta koja prevodi kod jezgra i pakuje u izlaznu datoteku (paket).
Podrazumevana konfiguracija jezgra na Arch Linux distribuciji je prilagođena da obuhvata veliki broj računara. Zbog toga se proces prevođenja i pakovanja izvršava samo jednom na jednom računaru, pa se zatim izlazne datoteke prenose na ostale kako bi se stedelo na vremenu i garantovalo da će jezgra biti identična na svim računarima.
Podrazumevana konfiguracija jezgra na Arch Linux distribuciji je prilagođena da obuhvata veliki broj računara. Zbog toga se proces prevođenja i pakovanja izvršava samo jednom na jednom računaru, pa se zatim izlazne datoteke prenose na ostale kako bi se štedelo na vremenu i garantovalo da će jezgra biti identična na svim računarima.
Git repozitorijumu sa svim konfiguracijama i skriptama za pokretanje je javno dostupan~\cite{repo:runner}
\chapter{Sistemski pozivi}
Sistemski pozivi su način na koji programi zahtevaju razne servise od jezgra operativnog sistema. To uključuje servise za komunikaciju sa eksternim uređajima (na primer: pristup disku), kreiranje i izvršavanje novih procesa, komunikaciju sa servisima koje samo jezgro pruža (na primer: raspoređivanje procesa), itd. Sistemski pozivi čine neophodan interfejs između procesa i operativnog sistema.
Sistemski pozivi su način na koji korisnički programi zahtevaju razne operacije od jezgra operativnog sistema. To uključuje operacije za komunikaciju sa eksternim uređajima (npr.\ pristup disku), kreiranje i izvršavanje novih procesa, zauzimanje i oslobađanje memorije, itd. Sistemski pozivi čine neophodan interfejs između procesa i operativnog sistema.
U ovom projektu, sistemski pozivi su pozivani pomoću programskog jezika c i odgovarajućih biblioteka za neke od poziva, što je prikazano u nastavku teksta. Svaki sistemski poziv se testira u okviru različitog programa, a za pokretanje tih programa i prikazivanje rezultata zadužena je python skripta koja je takođe opisana u ovom poglavlju.
U ovom projektu, sistemski pozivi su pozivani pomoću programskog jezika \textit{C} i odgovarajućih biblioteka za neke od poziva, što je prikazano u nastavku teksta. Svaki sistemski poziv se testira u okviru različitog programa, a za pokretanje tih programa i prikazivanje rezultata zadužena je \textit{Bash} skripta.
Za merenje vremena koje je potrebno za izvršavanje sistemskih poziva koristi se biblioteka \texttt{sys/time.h} koja pokrene merenje vremena pre pozivanja sistemskog poziva:
Za merenje vremena koje je potrebno za izvršavanje sistemskih poziva koristi se biblioteka \texttt{sys/time.h} koja zabeleži sistemsko vreme pre pozivanja sistemskog poziva:
\begin{minted}{c}
struct timeval start;
gettimeofday(&start, NULL);
\end{minted}
i zaustavi merenje vremena nakon izvršenja sistemskog poziva:
i nakon izvršenja sistemskog poziva:
\begin{minted}{c}
struct timeval stop;
gettimeofday(&stop, NULL);
\end{minted}
Oduzimanjem ova dva intervala, dobija se vreme koje je bilo potrebno za izvršavanje koda koji se nalazi između ovih naredbi.
Oduzimanjem ova dva trenutka, dobija se vreme koje je bilo potrebno za izvršavanje koda koji se nalazi između ovih naredbi.
Kod za pozivanje svakog sistemskog poziva je javno dostupa na Git repozitorijumu~\cite{repo:syscalls}
\section{Fork}
Ova sekcija prikazuje merenje vremena koje je potrebno za kreiranje novoih procesa. Program kao argument komandne linije prima broj \texttt{n} koji označava broj poziva sistemskog poziva fork. Nakon n poziva, postojaće $ 2^n $ procesa. Poziv sistemskog poziva izgleda ovako:
\textit{Fork} sistemski poziv služi za kreiranje novog procesa sa identičnim kontekstom kao trenutni. Program kao argument komandne linije prima broj $ n $ koji označava broj poziva sistemskog poziva fork. Nakon $ n $ poziva, postojaće $ 2^n $ procesa. Poziv sistemskog poziva izgleda ovako:
\begin{minted}{c}
syscall(SYS_fork);
\end{minted}
@ -294,31 +297,31 @@ Ova sekcija prikazuje merenje vremena koje je potrebno za kreiranje novoih proce
Povratna vrednost poziva fork je id procesa deteta u roditeljskom procesu, odnosno 0 u novonastalom procesu. Izmereno vreme je vreme koje se izmeri nakon kreiranja poslednjeg procesa.
\section{Read}
Ova sekcija je zadužena da prikaže način merenja vremena koje je potrebno za pozivanje read sistemskog poziva koji čita vrednosti iz datoteke. Program kao argument komandne linije prima broj koji označava broj izvršavanja sistemskog poziva read. Svaki poziv izgleda ovako:
\textit{Read} sistemski poziv služi za čitanje sadržaja datoteka iz sistema datoteka. Program kao argument komandne linije prima broj koji označava broj izvršavanja sistemskog poziva read. Svaki poziv izgleda ovako:
\begin{minted}{c}
syscall(SYS_read,fileno(f), &c, 1);
syscall(SYS_read, fileno(f), &c, n);
\end{minted}
gde je \texttt{fileno(f)} deskriptor fajla iz kojeg se čita, \texttt{c} promenjiva u koju se smešta pročitano i \texttt{1} broj bajtova koji se čitaju.
gde je \texttt{fileno(f)} deskriptor fajla iz kojeg se čita, \texttt{c} promenljiva u koju se smešta pročitani sadržaj i \texttt{n} broj bajtova koji se čitaju.
Povratna vrednost sistemskog poziva read je broj pročitanih bajtova ako je čitanje uspešo, 0 ako se dođe do kraja fajla ili -1 ako čitanje nije uspešno.
\section{Write}
Ova sekcija je zadužena da prikaže način merenja vremena koje je potrebno za pozivanje sistemskog poziva write koji radi pisanje u datoteku. Program kao argument komandne linije prima broj koji označava broj izvršavanja sistemskog poziva write. Svaki poziv izgleda ovako:
\textit{Write} sistemski poziv služi za upisivanje sadržaja u datoteke. Program kao argument komandne linije prima broj koji označava broj izvršavanja sistemskog poziva write. Svaki poziv izgleda ovako:
\begin{minted}{c}
syscall(SYS_write,fileno(f), text, strlen(text));
syscall(SYS_write, fileno(f), text, n);
\end{minted}
gde je \texttt{fileno(f)} deskriptor fajla u koji se piše, \texttt{text} tekst koji se piše u fajl i \texttt{strlen(text)} broj bajtova koji se upisuju u fajl.
gde je \texttt{fileno(f)} deskriptor fajla u koji se piše, \texttt{text} sadržaj koji se piše u fajl i \texttt{n} broj bajtova koji se upisuju u fajl.
Povratna vrednost sistemskog poziva write je broj upisanih bajtova ako je pisanje uspešo ili -1 ako pisanje nije uspešno.
\section{Mmup i munmap}
Ova sekcija je zadužena da prikaže način merenja vremena koje je potrebno za pozivanje mmap i munmap sistemskih poziva. Mmap povezuje adresni prostor procesa sa objektom u RAM memoriji. Munmap sistemski poziv je zadužen da ukloni vezu koju mmap kreira. Pošto su operacije usko povezane, njihovo vreme izvršavanja se meri zajedno. Program kao argument komandne linije prima broj izvršavanja sistemskih poziva mmap i munmap, \texttt{n} i broj memorijskih stranica koje se mapiraju, \texttt{pages}. Svaki od n poziva prvo izvršava mmap, pa nakon njega munmap sistemski poziv.
\section{Mmap i munmap}
\textit{Mmap} povezuje adresni prostor procesa sa objektom u RAM memoriji. \textit{Munmap} sistemski poziv je zadužen da ukloni vezu koju \textit{mmap} kreira. Pošto su operacije usko povezane, njihovo vreme izvršavanja se meri zajedno. Program kao argument komandne linije prima broj izvršavanja sistemskih poziva \textit{mmap} i \textit{munmap}, $ n $ i broj memorijskih stranica koje se mapiraju, \texttt{pages}. Svaki od $ n $ poziva prvo izvršava \textit{mmap}, pa nakon njega \textit{munmap} sistemski poziv.
Mmap:
\textit{mmap}:
\begin{minted}{c}
char* region = mmap(
(void*) pagesize,
pages * pagesize,
pages* pagesize,
PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_ANON|MAP_PRIVATE,
0,
@ -326,19 +329,19 @@ Mmap:
);
\end{minted}
Munmap:
\textit{munmap}:
\begin{minted}{c}
munmap(region, pages * pagesize);
\end{minted}
Mmap kao parametre prima \texttt{(void*) pagesize} kao početnu adresu regiona koji se mapira, \texttt{pages * pagesize} kao veličinu adresnog prostora koji se mapira, \texttt{PROT\_READ|PROT\_WRITE|PROT\_EXEC} kao permisije, \texttt{MAP\_ANON|MAP\_PRIVATE} kao \texttt{flags} parametar koji dodatno opisuje način mapiranja i naredna dva parametra koja očekuju deskriptor fajla i pomeraj u odnosu na početak fajla. Povratna vrednost ovog sistemskog poziva je pokazivač na početak mapiranog bloka.
\textit{Mmap} kao parametre prima \texttt{(void*) pagesize} kao početnu adresu regiona koji se mapira, \texttt{pages * pagesize} kao veličinu adresnog prostora koji se mapira, \texttt{PROT\_READ|PROT\_WRITE|PROT\_EXEC} kao permisije, \texttt{MAP\_ANON|MAP\_PRIVATE} kao \texttt{flags} parametar koji dodatno opisuje način mapiranja i naredna dva parametra koja očekuju deskriptor fajla i pomeraj u odnosu na početak fajla. Povratna vrednost ovog sistemskog poziva je pokazivač na početak mapiranog bloka.
Munmap kao parametre prima \texttt{region} kao početnu adresu regiona i \texttt{pages * pagesize} kao veličinu adresnog prostora čije mapiranje se uklanja. Povratna vrednost ovog sistemskog poziva je 0 ako se uspešno izvrši, odnosno -1 ako se neuspešno izvrši.
\textit{Munmap} kao parametre prima \texttt{region} kao početnu adresu regiona i \texttt{pages* pagesize} kao veličinu adresnog prostora čije mapiranje se uklanja. Povratna vrednost ovog sistemskog poziva je 0 ako se uspešno izvrši, odnosno -1 ako se neuspešno izvrši.
Pagesize je veličina jedne memorijske stranice.
\texttt{Pagesize} je veličina jedne memorijske stranice.
\section{Page fault}
Ova sekcija je zadužena da prikaže način merenja vremena koje je potrebno za rukovanje page fault izuzetkom. Page fault se desi kada pokrenuti program pristupa memorijskoj stranici koja nije trenutni mapirana u virtuelni adresni prostor procesora. Nakon ovog događaja, sistem za upravljanje izuzetcima pokuša da dobavi traženu stranicu i da je mapira. Program kao argument komandne linije prima broj izazivanja page fault izuzetka. Jedno izazivanje page fault izuzetka izgleda ovako:
\textit{Page fault} nije eksplicitan sistemski poziv, već je izuzetak koji se desi kada pokrenuti program pristupa memorijskoj stranici koja nije trenutno mapirana u virtuelni adresni prostor procesora. Nakon ovog događaja, sistem za upravljanje izuzetcima pokuša da dobavi traženu stranicu i da je mapira. Program kao argument komandne linije prima broj izazivanja page fault izuzetka. Jedno izazivanje page fault izuzetka izgleda ovako:
\begin{minted}{c}
unsigned char *p = malloc(pagesize + 1);
@ -347,21 +350,21 @@ Ova sekcija je zadužena da prikaže način merenja vremena koje je potrebno za
Velika je verovatnoća da se pri pozivu \texttt{p[0] = 0;} stranica koja je potrebna ne nalazi u memoriji i time će se pokrenuti obrada page fault izuzetka.
Pagesize je veličina jedne memorijske stranice.
\texttt{Pagesize} je veličina jedne memorijske stranice.
\section{Send i recv}
Ova sekcija je zadužena da prikaže način merenja vremena koje je potrebno za pozivanje send i recv sistemskih poziva. Send sistemski poziv je zadužen da pošalje poruku drugom soketu. Recv je zadužen da primi poruku iz soketa. Za merenje vremena izvršavanja ova dva poziva, koristi se klijent-server aplikacija gde klijent šalje poruke pomoću send-a, a server prima poruke pomoću recv-a.
\textit{Send} sistemski poziv je zadužen da pošalje poruku drugom soketu. \textit{Recv} je zadužen da primi poruku iz soketa. Za merenje vremena izvršavanja ova dva poziva, koristi se klijent-server aplikacija gde klijent šalje poruke pomoću \textit{send}-a, a server prima poruke pomoću \textit{recv}-a.
Serverska aplikacija nakon pokretanja očekuje konekciju sa klijentskom aplikacijom. Nakon konekcije, serverska aplikacija kreće da meri vreme i osluškuje poruke koje stižu sa klijentske aplikacije. Kada stigne poruka \texttt{exit}, osluškivanje poruka i merenje vremena se obustavljaju. Recv sistemski poziv u serverskoj aplikaciji prikazan je u narednom kodu:
Serverska aplikacija nakon pokretanja očekuje konekciju sa klijentskom aplikacijom. Nakon konekcije, serverska aplikacija kreće da meri vreme i osluškuje poruke koje stižu sa klijentske aplikacije. Kada stigne poruka \texttt{exit}, osluškivanje poruka i merenje vremena se obustavljaju. \textit{Recv} sistemski poziv u serverskoj aplikaciji prikazan je u narednom kodu:
\begin{minted}{c}
recv(sockfd, buff, sizeof(buff), 0);
\end{minted}
gde \texttt{sockfd} predstavlja fajl deskriptor soketa koji šalje poruku, \texttt{buff} i \texttt{sizeof(buff)} predstavljaju promenjivu u koju se smešta primljeni tekst i njenu dužinu i, kao poslednji parametar, \texttt{flags} ova funkcija može da primi dodatna podešavanja za primanje poruka.
Povratna vrednost sistemskog poziva recv je broj primljenih bajtova ako je primanje uspešo ili -1 ako primanje nije uspešno.
Povratna vrednost sistemskog poziva \textit{recv} je broj primljenih bajtova ako je primanje uspešo ili -1 ako primanje nije uspešno.
Klijentska aplikacija kao argument komandne linije prima broj poruka, \texttt{n} i tekst koji će poslati, konektuje se na serversku aplikaciju i zatim vrši slanje poruka:
Klijentska aplikacija kao argument komandne linije prima broj poruka, $ n $ i tekst koji će poslati, konektuje se na serversku aplikaciju i zatim vrši slanje poruka:
\begin{minted}{c}
send(sockfd, buff, sizeof(buff), 0);
@ -369,7 +372,7 @@ Klijentska aplikacija kao argument komandne linije prima broj poruka, \texttt{n}
Parametri ovog sistemskog poziva imaju isto značenje kao i parametri kod primanja poruka, samo u kontekstu slanja poruka.
Povratna vrednost sistemskog poziva send je broj poslatih bajtova ako je slanje uspešo ili -1 ako slanje nije uspešno.
Povratna vrednost sistemskog poziva \textit{send} je broj poslatih bajtova ako je slanje uspešo ili -1 ako slanje nije uspešno.
Nakon slanja svih poruka, šalje se poruka \texttt{exit} da naznači serverskoj aplikaciji da su poslate sve poruke. Kod klijentske aplikacije, vreme se meri od početka slanja poruka do slanja poslednje poruke.
@ -379,7 +382,7 @@ Ova sekcija je zadužena da prikaže način merenja vremena koje je potrebno za
pthread_create(&thread_id, NULL, threadFun, NULL);
pthread_join(thread_id, NULL);
\end{minted}
i meri vreme koje je potrebno da se kod izvrši. Prva komanda kreira nit i id niti sačuva u promenjivoj \texttt{thread\_id}, i nakon toga pozove funkciju \texttt{threadFun()} bez parametara. Druga komanda sačeka da se izvrši funkcija \texttt{threadFun()} bez da sačuva povratnu vrednost i nakon toga uništi nit.
i meri vreme koje je potrebno da se kod izvrši. Prva komanda kreira nit i identifikator niti sačuva u promenjivoj \texttt{thread\_id}. Nakon toga pozove funkciju \texttt{threadFun()} bez parametara. Druga komanda čeka da se izvrši funkcija \texttt{threadFun()} bez da sačuva povratnu vrednost i nakon toga uništi nit.
\chapter{Literatura}
\sloppy