Initial commit

This commit is contained in:
Pavle Portic 2020-02-11 23:53:59 +01:00
commit f0bb3fa7c2
Signed by: TheEdgeOfRage
GPG Key ID: 6758ACE46AA2A849
5 changed files with 626 additions and 0 deletions

263
.gitignore vendored Normal file
View File

@ -0,0 +1,263 @@
## Core latex/pdflatex auxiliary files:
*.aux
*.lof
*.log
*.lot
*.fls
*.out
*.toc
*.fmt
*.fot
*.cb
*.cb2
.*.lb
## Intermediate documents:
*.dvi
*.xdv
*-converted-to.*
# these rules might exclude image files for figures etc.
# *.ps
# *.eps
*.pdf
## Generated if empty string is given at "Please type another file name for output:"
.pdf
## Bibliography auxiliary files (bibtex/biblatex/biber):
*.bbl
*.bcf
*.blg
*-blx.aux
*-blx.bib
*.run.xml
## Build tool auxiliary files:
*.fdb_latexmk
*.synctex
*.synctex(busy)
*.synctex.gz
*.synctex.gz(busy)
*.pdfsync
## Build tool directories for auxiliary files
# latexrun
latex.out/
## Auxiliary and intermediate files from other packages:
# algorithms
*.alg
*.loa
# achemso
acs-*.bib
# amsthm
*.thm
# beamer
*.nav
*.pre
*.snm
*.vrb
# changes
*.soc
# comment
*.cut
# cprotect
*.cpt
# elsarticle (documentclass of Elsevier journals)
*.spl
# endnotes
*.ent
# fixme
*.lox
# feynmf/feynmp
*.mf
*.mp
*.t[1-9]
*.t[1-9][0-9]
*.tfm
#(r)(e)ledmac/(r)(e)ledpar
*.end
*.?end
*.[1-9]
*.[1-9][0-9]
*.[1-9][0-9][0-9]
*.[1-9]R
*.[1-9][0-9]R
*.[1-9][0-9][0-9]R
*.eledsec[1-9]
*.eledsec[1-9]R
*.eledsec[1-9][0-9]
*.eledsec[1-9][0-9]R
*.eledsec[1-9][0-9][0-9]
*.eledsec[1-9][0-9][0-9]R
# glossaries
*.acn
*.acr
*.glg
*.glo
*.gls
*.glsdefs
# gnuplottex
*-gnuplottex-*
# gregoriotex
*.gaux
*.gtex
# htlatex
*.4ct
*.4tc
*.idv
*.lg
*.trc
*.xref
# hyperref
*.brf
# knitr
*-concordance.tex
# TODO Comment the next line if you want to keep your tikz graphics files
*.tikz
*-tikzDictionary
# listings
*.lol
# luatexja-ruby
*.ltjruby
# makeidx
*.idx
*.ilg
*.ind
# minitoc
*.maf
*.mlf
*.mlt
*.mtc[0-9]*
*.slf[0-9]*
*.slt[0-9]*
*.stc[0-9]*
# minted
_minted*
*.pyg
# morewrites
*.mw
# nomencl
*.nlg
*.nlo
*.nls
# pax
*.pax
# pdfpcnotes
*.pdfpc
# sagetex
*.sagetex.sage
*.sagetex.py
*.sagetex.scmd
# scrwfile
*.wrt
# sympy
*.sout
*.sympy
sympy-plots-for-*.tex/
# pdfcomment
*.upa
*.upb
# pythontex
*.pytxcode
pythontex-files-*/
# tcolorbox
*.listing
# thmtools
*.loe
# TikZ & PGF
*.dpth
*.md5
*.auxlock
# todonotes
*.tdo
# vhistory
*.hst
*.ver
# easy-todo
*.lod
# xcolor
*.xcp
# xmpincl
*.xmpi
# xindy
*.xdy
# xypic precompiled matrices
*.xyc
# endfloat
*.ttt
*.fff
# Latexian
TSWLatexianTemp*
## Editors:
# WinEdt
*.bak
*.sav
# Texpad
.texpadtmp
# LyX
*.lyx~
# Kile
*.backup
# KBibTeX
*~[0-9]*
# auto folder when using emacs and auctex
./auto/*
*.el
# expex forward references with \gathertags
*-tags.tex
# standalone packages
*.sta
*.ist

BIN
images/pavle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

10
literature.bib Normal file
View File

@ -0,0 +1,10 @@
@online{metodologija,
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",
}

17
makefile Normal file
View File

@ -0,0 +1,17 @@
# makefile
# pavle, 2019-05-12 18:11
#
.phony: all latex biber clean
all: latex biber
biber: seminarski.tex
biber seminarski
latex: seminarski.tex
xelatex -shell-escape -halt-on-error -interaction=nonstopmode seminarski.tex
clean:
rm -f *.aux *.lof *.log *.lot *.toc *.bbl *.blg *-blx.bib *.run.xml *.bcf *.out *.pdf *.acn *.acr *.alg *.fdb_latexmk *.fls *.glg *.glo *.gls *.ist

336
seminarski.tex Normal file
View File

@ -0,0 +1,336 @@
% vim: ft=tex expandtab
\documentclass[12pt]{report}
\usepackage[utf8]{inputenc}
\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{fancyhdr}
\usepackage{float}
\usepackage{fontspec}
\usepackage[acronym]{glossaries}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage{titlesec}
\usepackage{ragged2e}
\usepackage{setspace}
\usepackage{minted}
\hypersetup{hidelinks}
\setmainfont{Times New Roman}
\tolerance=1
\emergencystretch=\maxdimen
\hyphenpenalty=10000
\hbadness=10000
\addbibresource{literature.bib}
\pagestyle{fancy}
\makeatletter
\newcommand\frontmatter{
\cleardoublepage{}
\pagenumbering{Roman}
\setlength{\parskip}{0pt}
}
\setsansfont{Arial}
\newcommand\mainmatter{
\cleardoublepage{}
\pagenumbering{arabic}
\setlength{\parskip}{2mm}
\titleformat{\chapter}{\normalfont\Large\bf\sffamily\raggedleft}{\thechapter.}{12pt}{}
}
\makeatother
\raggedbottom{}
\title{\textbf{Merenje performansi sistemskih poziva u zavisnosti od konfiguracije Linux jezgra} \protect\\ Računarstvo visokih performansi}
\date{2020\\ Februar}
\author{Jelena Dokić, Pavle Portić}
\begin{document}
\maketitle
\frontmatter{}
\renewcommand{\MakeUppercase}[1]{#1}
\tableofcontents
\mainmatter{}
\chapter{Motivacija}
Na osnovu konfiguracije Linux jezgra prilikom prevođenja, određene operacije koje se izvršavaju nad sistemom mogu imati različito vreme izvršavanja. Pozivanjem sistemskih poziva ili programa koji aktivno koriste pojedine sistemske pozive sa različitim konfiguracijama jezgra i poređenjem vremena izvršavanja možemo da utvrdimo kako ti konfiguracioni parametri utiču na vreme izvršavanja pojedinačnih poziva, a samim tim i programa koje korisnik pokreće. U ovom projektu izdvojeni su kritični sistemski pozivi i poređeno je njihovo vreme izvršavanja sa različitim konfiguracijama Linux jezgra.
\chapter{Metodologija merenja performansi}
Merenje performansi je proces poredjenja odabrane metrike između različitih sistema koji imaju sličnu namenu. Poređenje se može vršiti interno (u okviru jednog sistema, sa različitim vrednostima kongiguracionih parametara činilaca tog sistema) ili eksterno (poređenjem performansi sa sličnim sistemima, koje najčešće proizvodi konkurentna kompanija).
Metrike koje se najčešće koriste su:
\begin{samepage}
\begin{itemize}
\item cena po jedinici merenja
\item produktivnost po jedinici merenja
\item vreme izvršava po jedinici merenja
\item broj otkaza po jedinici merenja
\end{itemize}
\end{samepage}
Često se merenje performansi prepusti nekoj firmi koja je zadužena da sprovede ceo proces merenja. Metodologija merenja performansi~\cite{metodologija} sastoji se iz nekoliko koraka, koji će biti 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 4 koraka: identifikacija funkcionalnosti čije se performanse mere, pronalaženje najboljih od najboljih u toj oblasti, biranje kriterijuma merenja performansi i izbor načina prikupljanja podataka.
\subsection{Identifikacija funkcionalnosti čije se performanse mere}
Ovaj korak je zadužen za uspostavljanje metrika koje se mere. Na osnovu metrika kasnije se utvrđuju funkcionalnosti koje su dovele do izmerenih vrednosti metrika i porede se sa drugim sistemima ili istim sistemima pri drugačijim uslovima merenja. Potrebno je definisati parametre koje je potrebno menjati da bi se izmerile performanse. Metrike se utvrđuju kroz praktično znanje ili istraživanje sistema čije se performanse mere.
Pored metrika, u ovom koraku se utvrđuju resursi koji su potrebni za merenje metrika odabranog sistema. U resurse spadaju ljudi koji vrše merenje, objekti čije se performanse mere, okruženje u kojem se vrši merenje i drugi potrebni resursi, ako postoje.
Izlaz iz ove faze je opis prethodno pomenutih metrika i resursa ili njihov grafički prikaz. Ako se meri više metrika, u ovom koraku se definiše njihov prioritet.
\subsection{Pronalaženje najboljih od najboljih u toj oblasti}
Ako se merenje performansi vrši eksterno, onda je potrebno naći najbolje predstavnike sistema koji su slični onom čije performanse merimo. Time imamo mogućnost da poredimo slične ili iste funkcionalnosti sa najboljim iz oblasti merenja. Cilj ovih poređenja je da se napravi sistem koji je bolji od najboljeg konkurentnog sistema.
Ovakvo merenje performansi se naziva i ``Takmičarsko merenje performansi''.
\subsection{Biranje kriterijuma merenja performansi}
U prvom koraku planiranja izabrane su metrike sistema koje će se meriti. Te metrike treba kalibrisati prema već postojećim metrikama ako postoje, ili treba osmisliti sistem kalibrisanja koji će se koristiti ako prethodna merenja ne postoje. Potrebno je razjasniti značenje brojeva koji se dobijaju kao rezultat merenja i pridružiti im merne jedinice. Takođe je potrebno razjasniti reči kojima se opisuje proces merenja.
Rezultat ovog koraka je detaljan opis kvalitativnih ili kvantitativnih vrednosti koje opisuju reziltat merenja. Češće se koriste kvantitativne metrike zato što daju preciznije rezultate merenja.
\subsection{Izbor načina prikupljanja podataka}
Kao poslednji korak planiranja potrebno je navesti sve postojeće podatke i podatke koje je potrebno izmeriti. U ovom koraku se opisuju objekti, metode i ljudi koji su uključeni u merenje. Ako je potrebno i moguće, prikupljaju se i postojeći podaci konkurentnih sistema radi poređenja. Za neke metrike se često definiše više načina merenja radi sigurnosti ispravnosti merenja. Naravno, očekuje se da rezultat u tom slučaju bude isti za iste ulazne parametre.
\section{Analiza}
Analiza je proces merenja performansi na način koji je definisan u koraku planiranja. U ovom procesu se prkupljaju i analiziraju podaci. Sastoji se od 3 koraka: prikupljanje podataka interno i eksterno, merenje i poređenje performansi sistema i nalaženje najboljeg načina za poboljšanje performansi sistema.
\subsection{Prikupljanje podataka interno i eksterno}
U ovom koraku se prikupljaju podaci interno i eksterno (ako ima potrebe i ako su dostupni). Podaci se prikupljaju na način koji je definisan u tački 2.1.4.
\subsection{Merenje i poređenje performansi sistema}
Mere se performanse sistema na način koji je opisan u procesu planiranja. Ako ima potrebe, vrše se transformacije izmerenih podataka. Transformacije se rade da bi podaci mogli da se porede sa podacima sličnih sistema ili istih sistema sa različitim ulaznim parametrima.
Poređenjem se nalaze razlike u performansama sistema. Razlike mogu biti negativne (sistem čije se performanse mere ima lošije performanse od sistema sa kojim se poredi), neutralne (sistem čije se performanse mere ima iste performanse kao sistem sa kojim se poredi) i pozitivne (sistem čije se performanse mere ima bolje performanse od sistema sa kojim se poredi).
Ako su razlike negativne (a ponekad i ako su neutralne ili pozitivne), isputuje se razlog koji dovodi do tih performansi.
\subsection{Nalaženje najboljeg načina za poboljšanje performansi sistema}
Ako ima potrebe za poboljšanjem sistema, procenjuje se da li se poboljšanje isplati i da li je ono uopsšte potrebno za slučaj korišćenja za koji je sistem namenjan.
Da bi se poboljšale performanse sistema, najčešće se radi na smanjenju negativnih razlika.
\section{Integracija}
Integracija je proces uvođenja sistema u upotrebu, nakon što se na njemu izvrše sva potrebna poboljšanja i ponovna merenja performansi dok sistem ne zadovolji željene performanse.
Ovaj korak je posebno značajan pri merenju performansi komercijalnih sistema koji treba nakon merenja da se puste u prodaju. Tada on podrazumeva i osmišljavanje ostatka životnog ciklusa sistema (dalji razvoj sistema, način reklamiranja, itd.).
\chapter{Metodologija merenja performansi}
Ova oblast objašnjava način merenja performansi sistemskih poziva koji zavise od konfiguracije Linux jezgra. Metodologija merenja performansi opisana je u drugoj oblasti ovog rada.
\section{Planiranje}
\subsection{Identifikacija funkcionalnosti čije se performanse mere}
Na osnovu rada ``An Analysis of Performance Evolution of Linuxs Core Operations''~\cite{rad} i poznavanja Linux operativnog sistema, odlučili smo da merimo vreme izvršanja sledećih sistemskih poziva:
\begin{itemize}
\item thread
\item fork
\item read
\item write
\item mmap
\item munmap
\item page fault
\item send
\item recv
\end{itemize}
Detaljno objašnjenje pokretanja i uloge ovih sistemskih poziva biće objašnjeno u poglavlju JELENAAA
Vreme izvršanja sistemskih poziva se meri pri promeni konfiugracionih parametara Linux jezgra, kao što su:
\begin{itemize}
\item CONFIG\_HARDENED\_USERCOPY
\item CONFIG\_MEMCG
\item CONFIG\_PAGE\_TABLE\_ISOLATION
\item CONFIG\_RETPOLINE
\item CONFIG\_TRANSPARENT\_HUGEPAGE\_ALWAYS
\item CONFIG\_USERFAULTFD
\end{itemize}
Resursi korišćeni za merenje ovih performansi su lični računari sa sledećim procesorima:
\begin{itemize}
\item AMD Ryzen 7 1700 @ 3.6 GHz
\item Intel Core i7-6500U @ 2.5 GHz
\item Intel Core i5-3320M @ 2.6 GHz
\item Intel Pentium Dual-Core E5300 @ 2.6 GHz
\end{itemize}
Verzija Linux jezgra je 5.5 i ista je na svim računarima. Merenje se vrši od strane autora ovog rada. Pošto su merenja jednostavna, merenju svakog sistemskog poziva se pristupa sa istim prioritetom.
\subsection{Pronalaženje najboljih od najboljih u toj oblasti}
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}
Kriterijum merenja performansi je brzina izvršanja sistemskih poziva koji su navedeni u sekciji 3.1.1. Brzina se izražava u mikrosekundama (0.000001s) za sve sistemske pozive. Sistemski pozivi se izvršavaju više puta radi veće precinsosti merenja. Pri promeni ulaznih parametara (konfiguracije jezgra) broj izvršavanja sistemskih poziva se ne menja.
\subsection{Izbor načina prikupljanja podataka}
Podaci se prikupljaju tako što se isti program koji poziva sistemske pozive pokreće na jezgru operativnog sistemima sa različitim parametrima. Kao rezultat, program vraća vreme izvršavanja za svaki sistemski poziv.
\section{Analiza}
\subsection{Prikupljanje podataka interno i eksterno}
Prikupljanje podataka izvršeno je na način koji je naveden u procesu planiranja. Detalji arhitekture PAVLEEE i programa koji su pokretani prikazani su u naredna dva poglavlja.
\subsection{Merenje i poređenje performansi sistema}
Prikupljeni podaci prikazani su narednoj tabeli. JELENAAAmnozina? Merna jedinica svih vremenskih intervala su mikrosekunda:
TABELAAA
\begin{figure}[H]
\includegraphics[width=\linewidth]{images/pavle.png}
\caption{PAVLEEE}
\end{figure}
Iz priloženog se vidi da različite konfiguracije parametara jezgra Linux operativnog sistema znatno utiču na vreme izvršavanja pojedinih sistemskih poziva. Pošto je uzrok promene u vremenu paljenje i gašenje tih parametara, ispitivanje razloga koji dovodi do promene performansi nije potrebno.
\subsection{Nalaženje najboljeg načina za poboljšanje performansi sistema}
Računari u današnje vreme imaju veliki spektar primene i samim tim su im potrebna različita podešavanja parametara jezgra. Neke je moguće ugasiti, dok su neki neophodni za neke od primena. Samim tim ne postoji savršeno rešenje po pitanju izbora parametara i to se ostavlja čitaocima na izbor. Uloga svakog od parametara je objašnjena u četvrtom poglavlju.
\chapter{Arhitektura} % TODO
\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.
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}.
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.
\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.
\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.
\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.
\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.
\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.
\chapter{Sistemski pozivi}
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. JELENAAA
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:
\begin{minted}{c}
struct timeval start;
gettimeofday(&start, NULL);
\end{minted}
i zaustavi merenje vremena 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.
\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\textasciicircum{n} procesa. Poziv sistemskog poziva izgleda ovako: % TODO jelena
\begin{minted}{c}
syscall(SYS_fork);
\end{minted}
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:
\begin{minted}{c}
syscall(SYS_read,fileno(f), &c, 1);
\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.
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:
\begin{minted}{c}
syscall(SYS_write,fileno(f), text, strlen(text));
\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.
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 JELENAAA 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.
Mmap:
\begin{minted}{c}
char* region = mmap(
(void*) pagesize,
pages * pagesize,
PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_ANON|MAP_PRIVATE,
0,
0
);
\end{minted}
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.
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.
\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:
\begin{minted}{c}
unsigned char *p = malloc(pagesize + 1);
p[0] = 0;
\end{minted}
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.
\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.
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:
\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.
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:
\begin{minted}{c}
send(sockfd, buff, sizeof(buff), 0);
\end{minted}
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.
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.
\section{Thread}
Ova sekcija je zadužena da prikaže način merenja vremena koje je potrebno za kreiranje i uništavanje niti. Program kao argument komandne linije prima broj koji označava broj niti koje se kreiraju. Za svaku od niti izvrši se sledeći kod:
\begin{minted}{c}
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.
\chapter{Literatura}
\sloppy
\printbibliography[heading=none]
\end{document}