Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
452
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 135.69 KB | None | 0 0
  1. %\documentclass[12pt,a4paper]{article}
  2. %\documentclass[12pt,a4paper]{report}
  3.  
  4. \documentclass[12pt,a4paper]{article}
  5. \usepackage[margin=1 in]{geometry}
  6.  
  7. %\usepackage[a4paper, total={6in, 8in}]{geometry}
  8.  
  9. \usepackage{graphicx}
  10. \usepackage[italian]{babel}
  11. \usepackage[T1]{fontenc}
  12. \usepackage[utf8]{inputenc}
  13. \usepackage{wrapfig}
  14. \usepackage{algorithm}
  15. \usepackage{amsmath}
  16. \usepackage{scrextend}
  17. \usepackage{float}
  18. \usepackage{mathtools}
  19. \usepackage{multicol}
  20. \usepackage{appendix}
  21.  
  22. % CODE %
  23. \usepackage{listings}
  24. \usepackage{color}
  25. \usepackage{array}
  26. \usepackage{wrapfig}
  27. \usepackage{multirow}
  28. \usepackage{tabu}
  29. \definecolor{codegreen}{rgb}{0,0.6,0}
  30. \definecolor{codegray}{rgb}{0.5,0.5,0.5}
  31. \definecolor{codepurple}{rgb}{0.58,0,0.82}
  32. \definecolor{codeviolet}{rgb}{0.55,0.14,0.66}
  33. \definecolor{backcolour}{rgb}{0.96,0.96,0.96}
  34. \lstdefinestyle{mystyle}{
  35. backgroundcolor=\color{backcolour}, %background codice
  36. commentstyle=\color{codegreen},
  37. keywordstyle=\color{codeviolet},
  38. numberstyle=\tiny\color{codegray},
  39. stringstyle=\color{codepurple},
  40. basicstyle=\footnotesize,
  41. breakatwhitespace=false,
  42. frame = single,
  43. breaklines=true,
  44. captionpos=b,
  45. keepspaces=true,
  46. numbers=left,
  47. numbersep=5pt,
  48. showspaces=false,
  49. showstringspaces=false,
  50. showtabs=false,
  51. tabsize=2
  52. }
  53. \lstset{style=mystyle}
  54. \interfootnotelinepenalty=10000
  55. \usepackage{cancel}
  56. \usepackage{hyperref}
  57. \hypersetup{
  58. colorlinks,
  59. citecolor=black,
  60. filecolor=black,
  61. linkcolor=black,
  62. urlcolor=black
  63. }
  64. % END CODE %
  65.  
  66.  
  67. \begin{document}
  68. \begin{titlepage}
  69. \centering
  70. \includegraphics[width=0.4\textwidth]{uni-logo.png}\par\vspace{1cm}
  71. {\scshape\LARGE Università degli Studi di\\Roma Tor Vergata \par}
  72. \vspace{1cm}
  73. {\huge\bfseries Progetto Performance Modeling of Computer Systems and Networks\par}
  74. \vspace{2cm}
  75. {\Large\itshape Simone D'Aniello\\Giorgia Marchesi\par}
  76. \vfill
  77. \vfill
  78. {\large \ A.A. 2018-2019}
  79. \end{titlepage}
  80. \newpage
  81. \tableofcontents
  82. \newpage
  83.  
  84. \section{Introduzione}
  85. %\begin{wrapfigure}{r}{0.3\textwidth}
  86. % \centering
  87. % \includegraphics[width=0.25\textwidth]{MCC.png}
  88. % \caption{Schema mobile Cloud computing}
  89. % \label{fig:MCC}
  90. %\end{wrapfigure}
  91.  
  92. Il numero di dispositivi mobili sta aumentando in modo esponenziale, innescando nuove sfide per le reti mobili e wireless di tutto il mondo.
  93. Questa classe di reti è caratterizzata da una bassa capacità di archiviazione, un elevato consumo energetico, una larghezza di banda ridotta e un'elevata latenza.
  94.  
  95. Così nasce il \textit{mobile edge computing}, il cui obiettivo principale è potenziare le capacità virtuali di archiviazione, elaborazione ed energetiche fornendo agli utenti dei dispositivi stessi capacità di calcolo elevata, efficienza energetica, capacità di archiviazione e mobilità.
  96.  
  97. In questo progetto consideriamo un sistema a due livelli costituito da un \textbf{Cloudlet} - che si trova ad \textit{un hop} di distanza dai dispositivi mobili - e da un \textbf{server Cloud} remoto.
  98.  
  99. Le applicazioni in esecuzione sui dispositivi mobili selezionano i tasks da inviare sul server esterno ed inviano una richiesta di \textit{offload} ad un Controller situato nel Cloudlet.
  100.  
  101. Gli utenti sono inoltre divisi in due classi, in base alle quali variano sia il rate con cui inviano le richieste di offload sia i tempi di servizio con cui queste ultime vengono servite.
  102.  
  103. Quando il Controller riceve una richiesta, dovrà decidere se inviarla al Cloudlet oppure al Cloud in base al livello di occupazione del sistema. Si noti che generalmente le attività ospitate dal server Cloud\footnote{Nel seguito della trattazione indicheremo con “Cloud” il server Cloud remoto} beneficiano di un più alto tasso di esecuzione, ma soffrono per un maggiore ritardo della rete (essendo più distante dai dispositivi). L'obiettivo del Controller è dunque fare le scelte che minimizzino il tempo medio di risposta.
  104. \begin{center}
  105. \begin{figure}[H]
  106. \centering
  107. \includegraphics[width=0.7\textwidth]{explanation.png}
  108. \caption{Modello ad alto livello}
  109. \label{fig:my_label}
  110. \end{figure}
  111. \end{center}
  112.  
  113.  
  114. \newpage
  115.  
  116. \section{Modello}
  117.  
  118. \subsection{Obiettivi}
  119. L'obiettivo del progetto è quello di realizzare un \textbf{simulatore next-event} per il sistema descritto in precedenza, determinare se esso è stazionario e sviluppare dei test in accordo al comportamento del sistema.
  120. Viene quindi richiesta la valutazione dei seguenti elementi
  121. \begin{itemize}
  122. \item tempo di risposta
  123. \item throughput
  124. \item popolazione media
  125. \end{itemize}
  126. ciascuno dei quali a livello di sistema, sottosistema e classe.
  127.  
  128. Infine si dovrà ideare un nuovo algoritmo di dispatching dei task che minimizzi il tempo di risposta e confrontare e validare i risultati rispetto al caso precedente. \\
  129.  
  130. \subsection{Assunzioni}
  131. Per la trattazione analitica del problema si è deciso di assumere esponenziali sia i tempi di interarrivo (per i quali non vi è alcuna indicazione esplicita) sia i tempi di servizio del Cloudlet.
  132.  
  133. Si noti come, secondo la traccia, quest'ultimo sia caratterizzato da tempi di servizio iper-esponenziali. La scelta effettuata è stata guidata dal fatto di voler rendere il modello più semplice da analizzare senza però stravolgere la trattazione. In fase di simulazione sarà comunque possibile scegliere la distribuzione da testare.
  134.  
  135. %In realtà nel Cloudlet i tempi di servizio sono iper-esponenziali, ma la scelta effettuata è stata guidata dal fatto di voler rendere il modello più semplice da analizzare senza però stravolgere la trattazione. In fase di simulazione sarà comunque possibile scegliere la distribuzione da testare.
  136.  
  137. \subsection{Modello concettuale}
  138. Dall'introduzione appare chiara l'architettura \textit{two-layer} del sistema, dove il primo livello è occupato dal Cloudlet ed il secondo dal Cloud.
  139.  
  140. Il Cloudlet è suddiviso in \textbf{Controller} - che funge da dispatcher delle richieste che provengono dai dispositivi mobili - e dal \textbf{sistema Cloudlet} che si occupa effettivamente di servire le richieste\footnote{Per comodità, nel seguito della trattazione, chiameremo rispettivamente Controller il primo componente e Cloudlet il secondo}.
  141.  
  142. Il Cloud, a differenza del Cloudlet, possiede risorse "illimitate". Va tuttavia considerato il tradeoff tra capacità e latenza di rete dovuta alla maggiore distanza del Cloud dai dispositivi.
  143.  
  144. Poichè non vi è alcun riferimento esplicito nè alla presenza di code nei sistemi nè alla distribuzione degli arrivi e dei tempi di servizio, si può modellare il sistema nel seguente modo:
  145. \begin{labeling}{Cloudlet......}
  146. \item[\textbf{Cloudlet}:] M/M/N/N queuing model
  147. \item[\textbf{Cloud}:] M/M/$\infty$ queuing model
  148. \end{labeling}
  149.  
  150. %\begin{itemize}
  151. %\item M/M/N/N server per il Cloudlet;
  152. %\item M/M/$\infty$ server per il Cloud;
  153. %\end{itemize}
  154.  
  155. Il Controller decide come assegnare i task - al Cloudlet o al Cloud - secondo il seguente algoritmo\footnote{Viene qui mostrato l'algoritmo base di dispatching. Per algoritmi più avanzati vedere paragrafo \ref{algoritmi_dispatcher}}:\\
  156.  
  157. \begin{lstlisting}[language=Python, caption=algoritmo di dispatch]
  158. while(new task arrives){
  159. if n1 + n2 = N
  160. send to Cloud
  161. else
  162. accept the task on Cloudlet
  163. }
  164. \end{lstlisting}
  165.  
  166. Nell'algoritmo, $n_i$ per $i = \{1, 2\}$ è una variabile di stato che indica il numero di task di classe \textit{i} in servizio nel Cloudlet ad un certo istante di tempo.
  167.  
  168. Indipendentemente dalla classe di appartenenza, un qualsiasi task in arrivo viene inviato al Controller. Quest'ultimo, in base all'algoritmo di dispatching adottato, deciderà se inviarlo al Cloudlet oppure al Cloud affinché venga eseguito.
  169.  
  170. Nel modello non vengono esplicitamente considerati ritardi legati a latenze di rete in quanto già inclusi nei tempi di servizio dei rispettivi sistemi.
  171.  
  172. Nella figura \ref{key} si riporta il modello della rete ideato facendo riferimento alle considerazioni fatte finora.
  173.  
  174. \begin{center}
  175. \begin{figure}[H]
  176. \centering
  177. \includegraphics[width=0.8\textwidth]{breakpoint.png}
  178. \caption{Modello della rete}
  179. \label{key}
  180. \end{figure}
  181. \end{center}
  182.  
  183. Riassumendo brevemente i concetti chiave del modello concettuale si ha:\\
  184.  
  185. \noindent
  186. \textbf{Descrizione del sistema}:
  187. \begin{itemize}
  188. \item Cloudlet System
  189. \begin{itemize}
  190. \item Controller
  191. \item Cloudlet
  192. \end{itemize}
  193. \item Cloud
  194. \end{itemize}
  195.  
  196. \noindent
  197. \textbf{Variabili di stato}:
  198. \begin{labeling}{$n_{1_{Cloudlet}}(t)$ }
  199. \item [$n_{1_{Cloudlet}}(t)$] numero di task in esecuzione nel Cloudlet di classe 1 al tempo t
  200. \item [$n_{2_{Cloudlet}}(t)$] numero di task in esecuzione nel Cloudlet di classe 2 al tempo t
  201. \item [$n_{1_{Cloud}}(t)$] numero di task in esecuzione nel Cloud di classe 1 al tempo t
  202. \item [$n_{2_{Cloud}}(t)$] numero di task in esecuzione nel Cloud di classe 2 al tempo t
  203. \end{labeling}
  204. L'evoluzione nel tempo di queste variabili dipende dagli eventi di arrivo e di completamento, in particolare:
  205. \begin{itemize}
  206. \item arrivi di classe 1 nel Cloudlet provocano un incremento di 1 della variabile $n_{1_{Cloudlet}}(t)$
  207. \item arrivi di classe 2 nel Cloudlet provocano un incremento di 1 della variabile $n_{2_{Cloudlet}}(t)$
  208. \item arrivi di classe 1 nel Cloud provocano un incremento di 1 della variabile $n_{1_{Cloud}}(t)$
  209. \item arrivi di classe 2 nel Cloud provocano un incremento di 1 della variabile $n_{2_{Cloud}}(t)$
  210. \item il completamento di un task di classe 1 nel Cloudlet provoca un decremento di 1 della variabile $n_{1_{Cloudlet}}(t)$
  211. \item il completamento di un task di classe 2 nel Cloudlet provoca un decremento di 1 della variabile $n_{2_{Cloudlet}}(t)$
  212. \item il completamento di un task di classe 1 nel Cloud provoca un decremento di 1 della variabile $n_{1_{Cloud}}(t)$
  213. \item il completamento di un task di classe 2 nel Cloud provoca un decremento di 1 della variabile $n_{2_{Cloud}}(t)$
  214. \end{itemize}
  215.  
  216. \newpage
  217.  
  218. \subsection{Modello analitico e risultati}
  219. In questo paragrafo sono ricavati i risultati analitici per il modello della rete proposto, necessari per l'analisi, il confronto e la verifica delle performance del sistema di simulazione.
  220.  
  221. Vengono inoltre illustrate le formule matematiche utilizzate per ricavare i parametri di interesse - popolazione, throughput e tempo di risposta - con relativi risultati numerici.
  222.  
  223. Al fine di ridurre al minimo imprecisioni e approssimazione, i risultati proposti sono stati ottenuti e verificati tramite script Matlab.
  224.  
  225. \subsubsection{Assunzioni}
  226. Assumiamo sia per Cloud che per Cloudlet tempi di interarrivo esponenziali e denotiamo con $\lambda_1$ e $\lambda_2$ i tassi di arrivo rispettivamente dei task di classe 1 e di classe 2 aventi distribuzione esponenziale. Allo stesso modo assumiamo tempi di servizio esponenziali.
  227.  
  228. Per ogni classe di richiesta si riportano nella tabella \ref{tassi_di_servizio} i valori dei tassi di arrivo e di servizio per ciascuna classe, utilizzati sia per l'analisi del modello sia per la simulazione.
  229. %inserire tabella qui sotto
  230. \begin{table}[h]
  231. \center
  232. \label{tab:tassi}
  233. \begin{tabular}{|c |c |}
  234. \hline
  235. \textbf{Task di classe 1} & \textbf{Task di classe 2} \\
  236. \hline
  237. $\lambda_1 = 6 $ $task/s$ & $\lambda_2 = 6.25 $ $task/s$\\
  238. $\mu_{1\_clet} = 0.45 $ $task/s$ & $\mu_{2\_clet} = 0.27 $ $task/s$\\
  239. $\mu_{1\_cloud} = 0.25 $ $task/s$ & $\mu_{2\_cloud} = 0.22 $ $task/s$\\
  240. \hline
  241. \end{tabular}
  242. \caption{Tassi di arrivo e di servizio per classe}
  243. \label{tassi_di_servizio}
  244. \end{table}
  245.  
  246. \subsubsection{Cloudlet: modello e risultati analitici}\label{system}
  247. Sotto le assunzioni di cui sopra, il Cloudlet può essere modellato come un sistema a pura perdita composto da N serventi e privo di coda di attesa, ovvero come un un sistema M/M/N/N.
  248.  
  249. Si tratta di un sistema a pura perdita dal momento che, in assenza del Cloud, se il sistema fosse saturo i task in arrivo verrebbero scartati e quindi andrebbero persi. In questo specifico caso, quando tutti i server del Cloudlet sono occupati, i task in arrivo vengono reindirizzati dal Controller verso il Cloud affinché possano essere eseguiti.
  250.  
  251. Definiamo dunque lo stato del sistema tramite una coppia $(j,k)$ dove $j$ e $k$ sono rispettivamente il numero di task di classe 1 e di classe 2 attualmente in servizio nel sistema Cloudlet. Lo spazio degli stati $\Omega$ è finito ed è tale per cui \cite{spectrum}: \\
  252. \begin{center}
  253. $\Omega = \{ (j , k) : j + k <= s, j >= 0, k >= 0\}$
  254. \end{center}
  255. Si noti che il numero di stati per un tale sistema è pari a $\frac{(s + 1)(s + 2)}{2}$, per cui per $s = N = 20$ serventi il numero di stati del sistema diventa considerevolmente elevato: 231. \'E per questo motivo che si è deciso di semplificare l'analisi del modello limitando a 3 il numero di serventi ed utilizzare i risultati ottenuti per questo valore di N per verificare se il sistema di simulazione sia stato implementato correttamente.
  256.  
  257. Il modello di simulazione può essere considerato tanto più corretto quanto i valori restituiti in output sono vicini ai valori analitici derivati.\\
  258.  
  259. Tornando allo stato del sistema, si noti come questo segua un processo bidimensionale di nascita-morte per cui il diagramma di transizione degli stati risultante è il seguente:
  260.  
  261.  
  262. \begin{center}
  263. \begin{figure}[H]
  264. \centering
  265. \includegraphics[width=0.8\textwidth]{M-M-N-N.png}
  266. \caption{Catena di Markov per un sistema M/M/s/s con due classi di arrivo}
  267. \label{fig:my_label}
  268. \end{figure}
  269. \end{center}
  270.  
  271. Dopo aver mostrato il modello per $s = N$ serventi (con $N$ arbitrario), analizziamolo nel dettaglio per $N=3$ e due classi di arrivo indipendenti.
  272.  
  273. La catena di Markov risultante viene raffigurata nella figura \ref{fig:markov3}.
  274.  
  275. \begin{center}
  276. \begin{figure}[H]
  277. \centering
  278. \includegraphics[width=0.6\textwidth]{mcreduce.png}
  279. \caption{Catena di Markov per il sistema M/M/3/3}
  280. \label{fig:markov3}
  281. \end{figure}
  282. \end{center}
  283.  
  284. Sia dunque $p_{jk}$ la probabilità di avere in questo sistema $j$ task di classe 1 e $k$ task di classe 2 ad un certo istante di tempo, allora l'insieme delle equazioni di bilanciamento dei flussi per $p_{jk}:(j , k) \in \Omega'$ dove $(\Omega') = \{(j , k) : j+k <=3, j >=0, k >=0 \}$ è dato da: \\
  285.  
  286.  
  287.  
  288. \begin{center}
  289. \begin{cases}
  290. \pi_{00}(\lambda_\1 + \lambda_2) = \pi_{01}\mu_2 + \pi_{10}\mu_1\\
  291. \pi_{01}(\lambda_1+\lambda_2+\mu_2) = \pi_{00}\lambda_2 + \pi_{11}
  292. \mu_1 + \pi_{02}(2\mu_2)\\
  293. \pi_{02}(\lambda_1 + \lambda_2 + 2\mu_2) = \pi_{01}\lambda_2 + \pi_{12}\mu_1 + \pi_{03}(3\mu_2)\\
  294. \pi_{03}(3\mu_2) = \pi_{02}(\lambda_2)\\
  295. \pi_{10}(\lambda_1 + \lambda_2 + 2\mu_1) = \pi_{00}\lambda_1 + \pi_{11}\mu_2 + \pi_{20}(2\mu_1)\\
  296. \pi_{11}(\mu_1 + \mu_2 + \lambda_1 + \lambda_2) = \pi_{01}\lambda_1 + \pi_{10}\lambda_2 + \pi_{12}(2\mu_2) + \pi_{21}(2\mu_1)\\
  297. \pi_{12}(\mu_1 + 2\mu_2) = \pi_{02}\lambda_1 + \pi_{11}\lambda_2\\
  298. \pi_{20}(\lambda_1 + \lambda_2 + 2\mu_1) = \pi_{10}\lambda_1 + \pi_{21}\mu_2 + \pi_{30}(3\mu_1)\\
  299. \pi_{21}(2\mu_1 + \mu_2) = \pi_{11}\lambda_1 + \pi_{20}\lambda_2\\
  300. \pi_{30}(3\mu_1) = \pi_{20}\lambda_1
  301. \end{cases}
  302. \end{center}
  303.  
  304. La risoluzione di questo sistema di equazioni consente di determinare la probabilità di blocco (o perdita) del Cloudlet e le singole probabilità di routing.
  305.  
  306.  
  307. La probabilità di perdita è data dalla somma delle probabilità di essere negli stati caratterizzati dal colore rosso (vedere Figura \ref{fig:markov3}) ovvero dipende dagli stati in cui il sistema arriva a saturazione ed inizia a scartare i pacchetti in arrivo. In altre parole è la probabilità che nel sistema ci siano più di 3 job.
  308. Quindi:
  309. \begin{center}
  310. $P_{loss} = p_{30} + p_{03} + p_{21} + p_{12} = 0.92007 $\\~\\
  311. \end{center}
  312.  
  313. Una volta calcolata la probabilità di perdita ed il flusso totale in ingresso all'intero sistema, è possibile determinare il flusso di arrivi effettivo presso Cloudlet. Pertanto:\\
  314.  
  315. \begin{center}
  316. $\lambda_{tot} = \lambda_1 + \lambda_2 = 12,25$ $tasks/s \footnote{Flusso totale entrante nel sistema} $\\~\\
  317. $\lambda_{clet} = \lambda_{tot} - \lambda_{loss} = \lambda_{tot} - (P_{loss}*\lambda_{tot}) = \lambda_{tot}* (1-P_{loss}) = 0.97906 tasks/s $\\~\\
  318. \end{center}
  319.  
  320.  
  321. Per quanto riguarda i tempi di risposta (sia globale che per classe) del Cloudlet bisogna osservare che questi, poichè non è presente alcuna coda, non risentono del tempo di attesa in coda e dipendono solo dal tempo di servizio. Quindi abbiamo che:
  322.  
  323. \begin{center}
  324. Siano\\
  325. $[T_{1\_clet}]$ tempo di risposta dei task di classe 1 nel Cloudlet\\
  326. $E[T_{2\_clet}] $ tempo di risposta dei task di classe 2 nel Cloudlet\\
  327. $E[T_{clet}]$ tempo di risposta globale nel Cloudlet\\~\\
  328. Allora\\~\\
  329. $E[T_{1\_clet}] = 1/\mu_{1clet}= 2,222222$ s\\~\\
  330.  
  331. $E[T_{2\_clet}] = 1/\mu_{2clet} = 3,703704$ s \\~\\
  332.  
  333. $E[T_{clet}]= p_1 * E[T_{1\_clet}] + p_2 * E[T_{2\_clet}] = 2,97808 $ s \\
  334. \end{center}
  335.  
  336. dove $p_1$ e $p_2$ sono le probabilità che un task appartenga alla classe 1 ed alla classe 2, in particolare:
  337. \begin{center}
  338. $p_{class 1} = \frac{\lambda_1}{\lambda_{tot}} = 0.4898$\\~\\
  339. $p_{class 2} = \frac{\lambda_2}{\lambda_{tot}} = 0.5102$\\~\\
  340. \end{center}
  341.  
  342. Applicando la legge di Little è ora possibile calcolare la popolazione media (globale e per classe) all'interno del Cloudlet:
  343.  
  344. \begin{center}
  345. Siano\\
  346. $E[N_{clet}]$ popolazione media nel Cloudlet\\
  347. $[N_{1\_clet}]$ popolazione media di task di classe 1 nel Cloudlet\\
  348. $E[N_{2\_clet}] $ popolazione media di task di classe 2 nel Cloudlet\\~\\
  349. Allora\\~\\
  350.  
  351. $E[N]= \lambda_{clet}*E[T] = 2,915702$ tasks\\~\\
  352.  
  353. $E[N_{1\_clet}]= \lambda_{1\_clet}*E[T_1] = 1,065637$ tasks\\~\\
  354.  
  355. $E[N_{2\_clet}]= \lambda_{2\_clet}*E[T_{2\_clet}] = 1,850065$ tasks
  356. \end{center}
  357.  
  358. dove $\lambda_{1\_clet}$ e $\lambda_{2\_clet} $ sono i task in arrivo di classe 1 e di classe 2 presso il Cloudlet:
  359.  
  360. \begin{center}
  361. $\lambda_{1\_clet} = p_1 * \lambda_{clet} = 0,47954$\\
  362. $\lambda_{2\_clet} = p_2 * \lambda_{clet} = 0,49952$\\
  363. \end{center}
  364.  
  365.  
  366. I risultati per la popolazione media sono ricavabili anche tramite le equazioni di bilanciamento dei flussi relativi alla catena di Markov in Figura \ref{fig:markov3}:
  367.  
  368. \begin{center}
  369. $E[N_{clet}]= \sum_{j,k,n = 0}^{3}n*p_{jk} = 0*p_{00} + 1*(p_{01} + p_{10})+ 2*(p_{11} + p_{20} + p_{02}) +\\ + 3*(p_{30} + p_{12} + p_{21} + p_{03})$\\~\\
  370. $E[N_{1\_clet}]= = \sum_{j,n = 0}^{3}n*p_{jk} = 0*(p_{00} + p_{01}) + 1*(p_{10}+p_{11}) + 2*(p_{20} + p_{21}) + 3*p_{30} $\\~\\
  371. $E[N_{2\_clet}]=\sum_{k,n = 0}^{3}n*p_{jk} = 0*(p_{00} + p_{10}) + 1*(p_{01}+p_{11}) + 2*(p_{02} + p_{12}) + 3*p_{03}$
  372. \end{center}
  373.  
  374. Il throughput, definito come il numero completamenti per unità di tempo, può essere ricavato applicando la Legge di Little, da cui:
  375.  
  376. \begin{center}
  377. $X_{clet} = \frac{E[N_{clet}]}{E[T_{clet}]} = 0.97906$\\~\\
  378. $X_{1\_clet} = \frac{E[N_{1\_clet}]}{E[T_{1\_clet}]} = 0.47954$\\~\\
  379. $X_{2\_clet} = \frac{E[N_{2\_clet}]}{E[T_{2\_clet}]} =0.49952 $\\~\\
  380. \end{center}
  381.  
  382. Si può arrivare allo stesso risultato considerando il fatto che il Cloudlet è stato modellato tramite una Catena di Markov. Questa è tale per cui il processo dopo un certo tempo raggiunge una condizione di equilibrio e il flusso in uscita dallo stato uguaglia il flusso in ingresso. Ovvero è valida l’equazione del bilanciamento globale. Pertanto:
  383.  
  384. \begin{center}
  385. $X_{clet} = \lambda_{clet} = 0.97906$\\~\\
  386. $X_{1\_clet} = \lambda_{1\_clet} = 0.47954$\\~\\
  387. $X_{2\_clet} = \lambda_{2\_clet} =0.49952 $\\~\\
  388. \end{center}
  389.  
  390.  
  391. \subsubsection{Cloud: modello e risultati analitici}
  392. Il Cloud, a differenza del Cloudlet, presenta risorse illimitate. Pertanto a partire dalle assunzioni fatte\footnote{vedere paragrafo 3.4.1}, è possibile modellarlo come un sistema M/M/$\infty$.
  393.  
  394. Un tale sistema è caratterizzato da infiniti serventi in cui ogni arrivo prende servizio immediatamente e quindi non sperimenta attesa. Si parla quindi di un caso limite di un sistema M/M/k con k molto grande.
  395.  
  396. Definiamo dunque lo stato del sistema tramite una coppia $(j,k)$ dove $j$ e $k$ sono rispettivamente il numero di task di classe 1 e di classe 2 attualmente in servizio nel sistema. Lo spazio degli stati $\Omega$ è infinito numerabile ed è tale per cui:
  397. \begin{center}
  398. $\Omega = \{ (j , k) :j >= 0, k >= 0\}$\\
  399. \end{center}
  400.  
  401. e la catena di Markov risultante è:\\
  402.  
  403. %inserire catena per infinite server
  404. \begin{center}
  405. \begin{figure}[H]
  406. \centering
  407. \includegraphics[width=0.6\textwidth]{infinite_markov.png}
  408. \caption{Catena di Markov per un infinite Server}
  409. \label{fig:my_label}
  410. \end{figure}
  411. \end{center}
  412.  
  413.  
  414. Il flusso in arrivo dipende dalla probabilità di perdita del Cloudlet: quando quest'ultimo è saturo, i task vengono inviati al Cloud per poter essere eseguiti. Dunque è possibile determinare il flusso in ingresso nel Cloud come:\\
  415.  
  416. \begin{center}
  417. $\lambda_{cloud} = \lambda_{tot} - \lambda_{clet} = P_{loss} * \lambda_{tot} = 11,27094 tasks/s $\\~\\
  418. \end{center}
  419.  
  420.  
  421. Da cui si ricavano i tassi di arrivo di classe 1 e di classe 2:\\
  422. \begin{center}
  423. $\lambda_{1\_cloud} = p_1* \lambda_{cloud} = 5.51796$ tasks/s \\~\\
  424. $\lambda_{2\_cloud} = p_2* \lambda_{cloud} = 5.75348 $ tasks/s \\~\\
  425. \end{center}
  426.  
  427. Relativamente ai tempi di risposta e alla popolazione media nel Cloud vale quanto detto per il Cloudlet, si indica con:
  428. \begin{itemize}
  429. \item $E[T_{cloud}]$ Tempo di risposta globale nel Cloud
  430. \item $[T_{1\_cloud}]$ Tempo di risposta dei task di classe 1 nel Cloud
  431. \item $E[T_{2\_cloud}] $ Tempo di risposta dei task di classe 2 nel Cloud
  432. \item $E[N_{cloud}]$ popolazione media nel Cloud
  433. \item $[N_{1\_cloud}]$ popolazione media di task di classe 1 nel Cloud
  434. \item $E[N_{2\_cloud}] $ popolazione media di task di classe 2 nel Cloud\\~\\
  435. \end{itemize}
  436.  
  437. \newline
  438. Allora:
  439. \begin{center}
  440. $E[T_{1\_cloud}] = \frac{1}{\mu_{1\_cloud}} = 4,00000$ s \\~\\
  441.  
  442. $E[T_{2\_cloud}] = \frac{1}{\mu_{2\_cloud}} = 4.54545$ s\\~\\
  443.  
  444. $E[T_{cloud}]= p_1 * E[T_{1\_cloud}] + p_2 * E[T_{2\_cloud}] = 4,278292$ s\\~\\
  445. ***
  446. \end{center}
  447.  
  448.  
  449. \begin{center}
  450.  
  451. $E[N_{1\_cloud}] = \lambda_{1\_cloud}*E[T_{1\_cloud}] = 22,081853$ tasks\\~\\
  452.  
  453. $E[N_{2\_cloud}] = \lambda_{2\_cloud}*E[T_{2\_cloud}] = 26,138557$ tasks\\~\\
  454.  
  455. $E[N_{cloud}] = \lambda_{cloud}*E[T_{cloud}] = 48,220410$ tasks\\~\\
  456. \end{center}
  457.  
  458. Per quanto riguarda il throughput del Cloud valgono le considerazioni fatte per il Cloudlet, quindi:\\
  459.  
  460. \begin{center}
  461. $X_{cloud} = \lambda_{cloud} = 11.27094$\\~\\
  462. $X_{1\_cloud} = \lambda_{1\_cloud} = 5.51796$\\~\\
  463. $X_{2\_cloud} = \lambda_{2\_cloud} = 5.75348 $\\~\\
  464. \end{center}
  465.  
  466.  
  467. \subsubsection{Risultati analitici globali}
  468. Derivano dalla combinazione dei risultati precedenti.\\
  469. Innanzitutto occorre calcolare le probabilità che i task entrino nel Cloudlet piuttosto che nel Cloud:
  470.  
  471. \begin{center}
  472. $P_{cloud} = P_{loss} = 0,92007$\\~\\
  473. $P_{clet} = 1 - P_{cloud} = 0,07993$\\~\\
  474. \end{center}
  475. Tempi di risposta globali e per classe:
  476.  
  477. \begin{center}
  478. Siano\\
  479. $E[T_{glob}]$ Tempo di risposta globale\\
  480. $[T_{1\_glob}]$ Tempo di risposta globale dei task di classe 1\\
  481. $E[T_{2\_glob}] $ Tempo di risposta globale dei task di classe 2\\
  482. $E[N_{glob}]$ popolazione media globale \\
  483. $[N_{1\_glob}]$ popolazione media globale di task di classe 1\\
  484. $E[N_{2\_glob}] $ popolazione media globale di task di classe 2\\~\\
  485. Allora\\~\\
  486.  
  487. $E[T_{1\_glob}] = p_{clet}*E[T_{1\_clet}] + p_{cloud}*E[T_{1\_cloud}] = 3,857915$ s\\~\\
  488.  
  489. $E[T_{2\_glob}] = p_{clet}*E[T_{2\_clet}] + p_{cloud}*E[T_{2\_cloud}] = 4,478180$ s\\~\\
  490.  
  491. $E[T_{glob}]= p_{clet}*E[T_{clet}] + p_{cloud}*E[T_{cloud}] = 4,174377$ s\\~\\
  492. ***
  493. \end{center}
  494.  
  495.  
  496. \begin{center}
  497.  
  498. $E[N_{1\_glob}] = \lambda_{tot}*E[T_{1\_glob}] = 25,04626$ tasks\\~\\
  499. $E[N_{2\_glob}] = \lambda_1*E[T_{2\_glob}] = 26,08985$ tasks\\~\\
  500. $E[N_{glob}] = \lambda_2*E[T_{glob}] = 51,136112$ tasks \\~\\
  501. \end{center}
  502.  
  503. Il throughput globale è dato dalla somma dei throughput dei singoli sottosistemi (Cloudlet e Cloud). Inoltre, osservando tutto il sistema come fosse una blackbox e sapendo che raggiunge la stabilità, è possibile utilizzare in alternativa la Legge di Little. Pertanto:
  504.  
  505. \begin{center}
  506. $X_{glob} = X_{clet} + X_{cloud} = \lambda_{tot} = 12,25 $\\~\\
  507. $X_{1\_glob} = X_{1\_clet} + X_{1\_cloud} = \lambda_1 = 6,00$\\~\\
  508. $X_{2\_glob} = X_{2\_clet} + X_{2\_cloud}= \lambda_2 = 6,25 $\\~\\
  509. \end{center}
  510.  
  511.  
  512.  
  513. \newpage
  514.  
  515. \subsection{Modello delle specifiche}
  516.  
  517. \subsubsection{Next-event simulation}
  518. Per costruire un modello di simulazione Next-Event bisogna affinare la descrizione dello stato del sistema e della sua evoluzione nel tempo. Per \textit{stato del sistema} si intende una completa caratterizzazione del sistema ad un certo istante di tempo, descritto tramite variabili di stato.
  519.  
  520. Dunque, in questo capitolo (cioè a livello delle specifiche) si fornirà una descrizione dello stato del sistema intesa come una raccolta di variabili matematiche (le variabili di stato) messe in relazione tramite equazioni ed espressioni logiche e tramite un algoritmo che le metta in relazione e ne determini l'evoluzione nel tempo.\\
  521.  
  522.  
  523. La \textit{Next-Event Simulation} si basa su alcuni concetti chiave come: (1) stato del sistema, (2) eventi, (3) clock di simulazione, (4) scheduling degli eventi e (5) event-list. In particolare:
  524.  
  525. %che devono essere rispettati indipendentemente dalla implementazione.
  526.  
  527. %Nelle prossime righe alla loro definizione teorica viene aggiunta una descrizione su come lo sviluppo ha tenuto conto dei vari aspetti, mostrando in modo chiaro il flusso della simulazione.
  528.  
  529. \begin{itemize}
  530. \item \textbf{Stato del sistema}: lo stato rappresenta un insieme di variabili che identifica univocamente il sistema in un certo istante di tempo.
  531. \item \textbf{Evento}: occorrenza necessaria per il cambiamento dello stato del sistema. Ad ogni evento è associato un tipo.
  532. \item \textbf{Clock di simulazione}: rappresenta il valore corrente del tempo di simulazione.
  533. Il sistema simulato è dinamico ed evolve nel tempo, per cui è necessario tenere traccia del valore corrente di simulazione per poter scandire lo scorrere del tempo.
  534.  
  535. \item \textbf{Event-scheduling}: meccanismo di avanzamento del tempo che serve a garantire che gli eventi (e quindi la simulazione stessa) si verifichino nell'ordine corretto.
  536.  
  537. \item \textbf{Event-list}: è la struttura dati che contiene gli eventi ordinati in base al tempo in cui dovranno verificarsi. Tramite la scansione di questa lista è possibile determinare quale sarà il prossimo evento da schedulare.
  538. \end{itemize}
  539.  
  540.  
  541. Una volta individuate le variabili di stato che descrivono il sistema ed i tipi di eventi bisogna costruire l'algoritmo che definisce i cambiamenti di stato che avranno luogo al verificarsi di un evento.\\
  542.  
  543. Un modello di simulazione next-event è costituito dai seguenti quattro passaggi:
  544. \begin{itemize}
  545. \item \textbf{Inizializzazione:} il clock di simulazione viene inizializzato (solitamente a zero) e in seguito viene determinata e schedulata la prima occorrenza di ogni evento possibile, inizializzando in tal modo la lista di eventi;
  546. \item \textbf{Processamento dell'evento corrente:} la event-list viene scansionata per determinare l'evento più imminente, quindi viene avanzato il clock di simulazione al momento in cui è prevista l'occorrenza di questo e lo stato del sistema viene aggiornato. Questo evento è noto come l'evento corrente.
  547. \item \textbf{Scheduling dei nuovi eventi:} i nuovi eventi (se ce ne sono) che possono essere generati dall'evento corrente vengono inseriti nella lista degli eventi (in ordine cronologico).
  548. \item \textbf{Terminazione:} il processo di avanzamento del clock di simulazione continua finché non viene soddisfatta una condizione di terminazione. Questa condizione può essere specificata come uno pseudo-evento che si verifica una sola volta al termine della simulazione. Può essere basata sul raggiungimento di un numero arbitrario di eventi da processare, sul superamento del tempo di simulazione o sulla stima di una misura di uscita.
  549. \end{itemize}
  550.  
  551. Il modello di simulazione viene quindi inizializzato una sola volta all'inizio della simulazione, poi si alterna tra il secondo passaggio ed il terzo passaggio (pianificazione degli eventi successivi) finché non viene rilevato un criterio di terminazione.\\
  552.  
  553.  
  554. \subsubsection{La next-event simulation in pratica}
  555. In questo specifico caso lo \textbf{stato del sistema} è identificato da:
  556. \begin{itemize}
  557. \item \textbf{$n_{i\_clet}(t)$:} rappresenta il numero di job di classe \textit{i} presenti nel Cloudlet;
  558. \item \textbf{$n_{i\_cloud} (t)$:} rappresenta il numero di job di classe \textit{i} presenti nel Cloud ad un certo istante \textit{t};
  559. \item \textbf{N:} numero di server nel Cloudlet. \'E infatti necessario sapere il livello di occupazione del Cloudlet per applicare l'algoritmo di dispatching;
  560. \item \textbf{s:} stato del singolo server (0 o 1 se idle o busy).
  561. \end{itemize}
  562.  
  563.  
  564. Gli \textbf{eventi} possono essere invece di due tipologie (una per ogni sottosistema):
  565. \begin{itemize}
  566. \item \textbf{arrivo}: evento che si verifica quando perviene al sistema un nuovo task. Il tempo di riferimento è quindi il tempo di arrivo che è pari al tempo intercorso tra il suo e quello del task precedente
  567. \begin{center}
  568. tempo evento arrivo: $\tau_{a_n} = t_n - t_{n-i}$
  569. \end{center}
  570. \begin{center}
  571. tempo completamento task: $\tau_{c} = t_{service} + t_{arrival}$
  572. \end{center}
  573.  
  574. Inoltre, quando si verifica un tale evento verranno incrementate le variabili di stato relativi al numero di task attualmente presenti nel sistema.
  575. \item \textbf{completamento}: evento secondo cui il sistema porta a termine l’esecuzione di uno specifico task. Tale evento viene aggiornato di volta in volta al valore dato dalla differenza tra il tempo di completamento del task e il tempo in cui si è verificato l'ultimo arrivo nel sistema
  576. \begin{center}
  577. tempo evento completamento: $\tau_{c_n} = t_{c_n} - t_{last arrive}$
  578. \end{center}
  579. Infine viene decrementata opportunamente la popolazione del sistema e viene aumentato il numero di completamenti.
  580. \end{itemize}
  581.  
  582. Si può notare come il tempo relativo all'evento arrivo rimanga fissato per tutto il tempo di vita dell'evento. Questo non avviene per i completamenti, il cui tempo viene decrementato ad ogni arrivo.
  583. Per semplificare la simulazione, il \textit{tempo di simulazione} viene incrementato dei soli tempi legati agli eventi di tipo arrivo. Solo una volta terminati gli arrivi, si prendono in considerazione i tempi di servizio, in modo tale da garantire la correttezza della simulazione.\\
  584.  
  585. L'avanzamento del tempo della simulazione attraversa 3 fasi:
  586. \begin{enumerate}
  587. \item \textbf{estrazione}
  588. \item \textbf{processamento}
  589. \item \textbf{rimozione del primo evento in ordine temporale dalla lista}
  590. \end{enumerate}
  591.  
  592. In Listing \ref{simulation} lo pseudocodice:\\
  593.  
  594. \begin{minipage}{\linewidth}
  595. \begin{lstlisting}[language=Python, caption=pseudocodice del flusso della simulazione, label={simulation}]
  596. Simulation() {
  597. int i = 0;
  598. while(i < TOTAL_PACKETS){
  599. Event e = generateArrival();
  600. eventList.add(e);
  601. sortList();
  602. handleFirstEvent();
  603. i++;
  604. }
  605. }
  606.  
  607. handleFirstEvent(){
  608. while(first event is not an arrival){
  609. if(firstEvent is a Cloudlet completion)
  610. Cloudlet.processCompletion();
  611. else if(firstEvent is a Cloud completion)
  612. Cloud.processCompletion();
  613. remove_event_from_list();
  614. }
  615. }
  616. \end{lstlisting}
  617. \end{minipage}
  618. L'algoritmo di avanzamento del tempo di simulazione funziona quindi in tal modo: all'inizio di ogni ciclo\footnote{per ciclo si intende il tempo che intercorre tra un arrivo ed il successivo, o anche la singola iterazione della simulazione} viene aggiunto un nuovo arrivo alla lista di eventi. Dopo aver ordinato la lista sulla base dell'\textit{eventTime}, gli eventi vengono estratti con la seguente logica:
  619. \begin{itemize}
  620. \item se l'evento in cima è di tipo arrivo, viene processato. Questo comporta l'inserimento di un evento di tipo completamento nella lista di eventi.
  621. \item se l'evento è un completamento, viene processato e rimosso dalla lista. In seguito si estrae un nuovo evento.
  622. \end{itemize}
  623.  
  624. In figura \ref{event_list} un esempio di inserimento e rimozione degli eventi dalla eventList.
  625.  
  626. \begin{center}
  627. \begin{figure}[H]
  628. \centering
  629. \includegraphics[width=0.5\textwidth]{event_list.png}
  630. \caption{inserimento e rimozione dalla lista di eventi}
  631. \label{event_list}
  632. \end{figure}
  633. \end{center}
  634.  
  635. Si noti che il tempo di simulazione evolve eseguendo gli eventi in ordine crescente rispetto al tempo in cui è stato pianificato il loro accadimento. Il tempo quindi non scorre in modo continuo ma avanza in modo discontinuo tra un evento e l'altro. A livello computazionale, l'orologio di simulazione viene congelato durante l'esecuzione dell'algoritmo che determina il cambiamento di stato in modo tale che quest'ultimo si verifichi in modo istantaneo rispetto all'orologio di simulazione.
  636.  
  637. La simulazione procede fintanto che non viene raggiunta la condizione di uscita, che in tal caso è relativa al raggiungimento del numero di eventi di tipo arrivo determinati dall'utente\footnote{parametro ITERATIONS nel file \textit{config.properties}}. Considerato che ad ogni arrivo corrisponde un completamento, la simulazione termina quando il numero di eventi processati è il doppio del valore stabilito dall'utente in fase di configurazione.
  638.  
  639. Tenendo conto di quanto detto finora è possibile schematizzare nella figura \ref{flusso_eventi} il flusso di simulazione.
  640.  
  641. \begin{center}
  642. \begin{figure}[h]
  643. \centering
  644. \includegraphics[width=0.8\textwidth]{immagini/flusso_eventi.png}
  645. \caption{flusso della simulazione}
  646. \label{flusso_eventi}
  647. \end{figure}
  648. \end{center}
  649.  
  650. Le operazioni di processamento degli eventi arrivo e completamento sono state volutamente lasciate generiche perché non esistono solamente eventi che cambiano lo stato del sistema (ad esempio incrementando o decrementando le popolazioni). Basti pensare ad eventi legati al campionamento delle statistiche.
  651.  
  652. Entrando più nel dettaglio quindi, in caso di estrazione di un evento di tipo arrivo, il Job corrispondente viene inviato al Controller. Questo, sulla base dell'algoritmo di dispatching scelto\footnote{i vari algoritmi di dispatching sono trattati nel dettaglio nel paragrafo \ref{algoritmi_dispatch}}, decide se dirottare il pacchetto verso il Cloud o verso il Cloudlet.
  653.  
  654. %RIMUOVERE? GIà DETTO IN ALTRE OCCASIONI
  655. \textcolor{red}{In quest'ultimo caso il sistema tiene conto del fatto che ogni Server viene trattato come un oggetto a sé stante e pertanto si potrebbero effettuare statistiche anche sullo stato di utilizzazione del server\footnote{Per ulteriori considerazioni sull'importanza di avere statistiche per ciascun server si veda il paragrafo \ref{sviluppi_futuri}}.}
  656.  
  657. Sia che il pacchetto vada nel Cloudlet che nel Cloud, viene incrementato il valore relativo al numero di Job attualmente presenti nel sistema e viene aggiunto un evento di completamento alla lista di eventi. Infine viene aggiornato il tempo di simulazione e viene decrementato il tempo relativo agli eventi di tipo completamento che devono ancora essere processati.
  658.  
  659. In caso di estrazione di un evento di tipo completamento, il sottosistema presso cui il Job ha terminato la sua esecuzione si occupa non solo di decrementare la propria popolazione attuale ma consente al sistema di aggiornare le statistiche riguardanti popolazione media e tempi medi di servizio globali.
  660.  
  661.  
  662. \newpage
  663. \subsection{Modello computazionale}
  664. In questo paragrafo viene illustrato come il modello delle specifiche è stato tradotto in un modello computazionale. Per rendere la discussione più fluida, viene trattato solo quanto necessario ai fini della comprensione dell'implementazione effettiva del modello delle specifiche e del codice. Per una spiegazione più approfondita delle Features si invita alla lettura della sezione \ref{implementazione}.
  665.  
  666. Nella prima parte viene mostrata la struttura del codice, realizzato nel linguaggio di programmazione Java, coadiuvata dalla descrizione delle funzionalità di ciascuna classe. Successivamente viene mostrata l'implementazione effettiva del modello\footnote{Si noti che il codice mostrato all'interno di questo paragrafo può differire leggermente dal codice reale. Sono state infatti omesse le funzioni che si occupano delle stampe su console e su file per incentrare la trattazione solo sulle entità fondamentali}.
  667.  
  668. \subsubsection{Classi}
  669. Il codice è suddiviso in package, ciascuno relativo ad una macro-area funzionale di interesse. La struttura dei pacchetti e del codice è la seguente:
  670. \begin{itemize}
  671. \item cloud
  672. \begin{itemize}
  673. \item Cloud
  674. \end{itemize}
  675. \item cloudlet
  676. \begin{itemize}
  677. \item Cloudlet
  678. \item CloudletController
  679. \item DispatchAlgorithm
  680. \item Server
  681. \end{itemize}
  682. \item event
  683. \begin{itemize}
  684. \item CompletionHandler
  685. \item Event
  686. \item EventGenerator
  687. \item Server
  688. \end{itemize}
  689. \item job
  690. \begin{itemize}
  691. \item Job
  692. \end{itemize}
  693. \item results
  694. \begin{itemize}
  695. \item CSVLogger
  696. \item PerformanceLogger
  697. \item Printer
  698. \item ReadStatisticsCSV
  699. \end{itemize}
  700. \item simulation
  701. \begin{itemize}
  702. \item Simulation
  703. \end{itemize}
  704. \item statistics
  705. \begin{itemize}
  706. \item BatchMeans
  707. \item ConfidenceInterval
  708. \item JobStatistics
  709. \item Statistics
  710. \item TimeStatistics
  711. \end{itemize}
  712. \item system
  713. \begin{itemize}
  714. \item SystemConfiguration
  715. \end{itemize}
  716. \item variablesGenerator
  717. \begin{itemize}
  718. \item library
  719. \begin{itemize}
  720. \item Rngs
  721. \item Rvgs
  722. \item Rvms
  723. \end{itemize}
  724. \item Arrivals
  725. \item Clock
  726. \item InitGenerator
  727. \item Services
  728. \end{itemize}
  729. \end{itemize}
  730.  
  731. In seguito sono descritte le entità fondamentali del sistema di simulazione e, in modo sintetico, le loro funzionalità:
  732.  
  733. \begin{itemize}
  734. \item \textbf{Cloud}: classe che implementa il sistema Cloud, occupandosi della gestione dei task in arrivo per prendere servizio al suo interno e del loro processamento
  735.  
  736. \item \textbf{cloudlet package}:
  737. \begin{itemize}
  738. \item \textbf{Cloudlet}: classe che implementa il sistema Cloudlet, occupandosi della gestione sia dei task in servizio al suo interno sia dei serventi di cui è composto
  739. \item \textbf{Server}: classe che implementa ogni singolo servente che compone il Cloudlet. \'E descritto dal codice identificativo, dal job attualmente in servizio e da una variabile booleana che indica il suo stato attuale (busy/idle)
  740. \item \textbf{CloudletController}: classe che implementa il Controller del Cloudlet e che quindi si occupa di effettuare il dispatching dei task in arrivo secondo l'algoritmo stabilito dall'utente
  741. \item \textbf{DispatchAlgorithm}: classe che implementa gli algoritmi di dispatching
  742. \end{itemize}
  743.  
  744. \item \textbf{event package}:
  745. \begin{itemize}
  746. \item \textbf{Event}: classe che rappresenta un generico evento specificato poi dal tipo associato (se arrivo o completamento), dal job che lo ha generato e dal tempo di accadimento
  747. \item \textbf{EventGenerator}: classe che si occupa della generazione di eventi di arrivo e di completamento
  748. \item \textbf{CompletionHandler}: classe che si occupa della gestione degli eventi di completamento (specializzati poi a Cloudlet e Cloud)
  749. \end{itemize}
  750.  
  751. \item \textbf{Job}: classe che rappresenta una richiesta di servizio. \'E descritta dalla classe di appartenenza, dal tempo di arrivo e dal tempo di completamento
  752.  
  753. \item \textbf{Simulation}: classe che si occupa di avviare la simulazione e di gestire la lista di eventi in modo tale che la simulazione possa avanzare correttamente.
  754.  
  755. \item \textbf{statistics package}:
  756. \begin{itemize}
  757. \item \textbf{Statistics}: classe di supporto per il campionamento delle statistiche. Implementa l'algoritmo di Welford
  758. \item \textbf{TimeStatistics}: classe che si occupa del campionamento delle statistiche relative ai tempi di risposta
  759. \item \textbf{JobStatistics}: classe che si occupa del campionamento delle statistiche relative a popolazioni medie e throughput
  760. \item \textbf{BatchMeans}: classe che implementa e gestisce le statistiche tramite il metodo dei BatchMeans
  761. \item \textbf{ConfidenceInterval}: classe che implementa l'algoritmo per il calcolo dell'intervallo di confidenza
  762. \end{itemize}
  763.  
  764. \item \textbf{variablesGenerator package:}
  765. \begin{itemize}
  766. \item \textbf{InitGenerator}: classe che si occupa dell'istanziazione delle librerie per la generazione dei numeri random secondo Lehmer (\textbf{rngs}\textbf{rvgs}). Contiene al suo interno anche funzioni per la selezione del SEED iniziale, dello stream e delle distribuzioni
  767. \item \textbf{Arrivals}: classe che si occupa dell'estrazione randomica dei tempi di arrivo di un task e della determinazione dell'appartenenza alla classe
  768. \item \textbf{Services}: classe che si occupa dell'estrazione dei tempi di servizio
  769. \item \textbf{Clock}: classe che istanzia il Clock di simulazione.
  770. \end{itemize}
  771.  
  772. \end{itemize}
  773.  
  774. \subsubsection{Inizializzazione}
  775. Dopo la breve panoramica delle classi che compongono il codice, si può vedere ora come queste vengano inizializzate all'inizio di ogni \textit{run}.
  776.  
  777. Lo scopo di questo sotto-paragrafo è spiegare cosa avviene all'inizio della simulazione per alcune classi fondamentali, in modo tale da familiarizzare con gli attributi che le compongono e, di conseguenza, con la struttura del sistema implementato.\\
  778.  
  779. Iniziando dal \textbf{Cloudlet}, viene mostrato in Listing \ref{clet_init} cosa avviene appena inizia la simulazione. \\
  780.  
  781. \begin{minipage}{\linewidth}
  782. \begin{lstlisting}[language=Java, caption=Inizializzazione del Cloudlet, label={clet_init}]
  783. private static Cloudlet instance;
  784. private int n1;
  785. private int n2;
  786. private int numberOfServers;
  787. private ArrayList<Server> serverList;
  788.  
  789. private Cloudlet(){
  790. n1 = 0;
  791. n2 = 0;
  792. numberOfServers = SystemConfiguration.N;
  793. initServers();
  794. }
  795.  
  796. public static Cloudlet getInstance(){
  797. if(instance == null)
  798. instance = new Cloudlet();
  799. return instance;
  800. }
  801.  
  802. private void initServers(){
  803. serverList = new ArrayList<>();
  804. for (int i = 0; i<numberOfServers; i++) {
  805. serverList.add(new Server(i));
  806. }
  807. }
  808. \end{lstlisting}
  809. \end{minipage}\\
  810.  
  811. Il Cloudlet, così come molte delle classi analizzate in questo sotto-paragrafo, è stato implementato usando il pattern \textit{Singleton} per poter avere una sola istanza attiva alla volta e consentire gli aggiornamenti corretti delle variabili di stato del sistema. Nel costruttore, \texttt{n1} e \texttt{n2} rappresentano i Job rispettivamente di classe 1 e 2 attualmente in servizio nel Cloudlet e sono settati a 0 all'inizio della simulazione. I serventi che compongono il Cloudlet sono istanziati tramite \texttt{serverList}, una lista di oggetti di tipo Server. Questa costruzione è un punto di forza della simulazione perché permette non solo di avere statistiche al livello del singolo elemento, ma anche una semplice futura estensione del codice a nuove funzionalità (basti pensare ai casi in cui è necessario avere dati per ogni server, e.g. predictive maintenance dell'infrastruttura).\\
  812.  
  813. La classe \textbf{Cloud} risulta più semplice rispetto al Cloudlet. Viene mostrato in Listing \ref{cloudinit}.\\
  814.  
  815. \begin{minipage}{\linewidth}
  816. \begin{lstlisting}[language=Java, caption=Inizializzazione del Cloud, label={cloudinit}]
  817. private static Cloud instance = new Cloud();
  818. private int n1;
  819. private int n2;
  820.  
  821.  
  822. private Cloud(){
  823. n1 = 0;
  824. n2 = 0;
  825. }
  826.  
  827. public static Cloud getInstance(){ return instance;}
  828. \end{lstlisting}
  829. \end{minipage}\\
  830.  
  831. \'E di particolare interesse poi l'inizializzazione delle classi riguardanti le statistiche. Partendo dalla classe \textbf{TimeStatistics}, si noti come la fase di init contenga solamente le variabili legate ai tempi di risposta, come mostrato in Listing \ref{timestat_init}:\\
  832.  
  833. \begin{minipage}{\linewidth}
  834. \begin{lstlisting}[language=Java, caption=Inizializzazione TimeStatistics, label={timestat_init}]
  835. private static TimeStatistics instance = null;
  836. private double meanResponseTime;
  837. private double meanResponseTimeCloudlet;
  838. private double meanResponseTimeCloud;
  839. private double meanResponseTimeClass1;
  840. private double meanResponseTimeClass2;
  841. private double meanResponseTimeClass1Cloudlet;
  842. private double meanResponseTimeClass2Cloudlet;
  843. private double meanResponseTimeClass1Cloud;
  844. private double meanResponseTimeClass2Cloud;
  845.  
  846.  
  847. private TimeStatistics(){
  848. resetStatistics();
  849. }
  850.  
  851. public static TimeStatistics getInstance()
  852. {
  853. if(instance == null)
  854. instance = new TimeStatistics();
  855. return instance;
  856. }
  857.  
  858. public void resetStatistics(){
  859. this.meanResponseTime = 0.0;
  860. this.meanResponseTimeCloudlet = 0.0;
  861. this.meanResponseTimeCloud = 0.0;
  862. this.meanResponseTimeClass1 = 0.0;
  863. this.meanResponseTimeClass2 = 0.0;
  864. this.meanResponseTimeClass1Cloudlet = 0.0;
  865. this.meanResponseTimeClass2Cloudlet = 0.0;
  866. this.meanResponseTimeClass1Cloud = 0.0;
  867. this.meanResponseTimeClass2Cloud = 0.0;
  868. }
  869. \end{lstlisting}
  870. \end{minipage}\\
  871.  
  872. Per quanto riguarda popolazioni e throughput è stata utilizzata la classe \textbf{JobStatistics}. L'inizializzazione è mostrata in Listing \ref{jobstat_init}. Per evitare di ripetere il procedimento banale di settare tutte le variabili al valore 0, viene nel codice omessa la funzione \texttt{resetStatistics}.\\
  873.  
  874. \begin{minipage}{\linewidth}
  875. \begin{lstlisting}[language=Java, caption=Inizializzazione JobStatistics, label={jobstat_init}]
  876. private static JobStatistics instance = null;
  877. private static Statistics statistics;
  878. private static BatchMeans batchMeans;
  879.  
  880. //POPULATION MEANS
  881. private double meanGlobalPopulation;
  882. private double meanCloudletPopulation;
  883. private double meanCloudPopulation;
  884. private double meanGlobalPopulation_1;
  885. private double meanCloudletPopulation_1;
  886. private double meanCloudPopulation_1;
  887. private double meanGlobalPopulation_2;
  888. private double meanCloudletPopulation_2;
  889. private double meanCloudPopulation_2;
  890.  
  891. //POPULATION VARIANCE
  892. private double varGlobalPopulation;
  893. private double varCloudletPopulation;
  894. private double varCloudPopulation;
  895. private double varGlobalPopulation_1;
  896. private double varCloudletPopulation_1;
  897. private double varCloudPopulation_1;
  898. private double varGlobalPopulation_2;
  899. private double varCloudletPopulation_2;
  900. private double varCloudPopulation_2;
  901.  
  902. //COMPLETED
  903. private long completedCloudlet_1;
  904. private long completedCloudlet_2;
  905. private long completedCloud_1;
  906. private long completedCloud_2;
  907.  
  908. //ITERATIONS & CLOCK
  909. private long globalIteration;
  910. private long actualIteration;
  911. private double globalTime;
  912. private double actualTime;
  913. private double batchSize;
  914. private int actualBatch;
  915.  
  916. private JobStatistics(){
  917. resetStatistics();
  918. }
  919.  
  920. public static JobStatistics getInstance(){
  921. if(instance == null)
  922. instance = new JobStatistics();
  923. return instance;
  924. }
  925. \end{lstlisting}
  926. \end{minipage}\\
  927.  
  928. Per quanto riguarda la classe \textbf{Batch}, per ciascuna delle variabili riportate in Listing \ref{batch_init} viene inizializzato un nuovo \texttt{ArrayList} di \texttt{Double} che serve a contenere le medie campionate per ogni singolo Batch relative alla statistica di interesse:\
  929.  
  930. \begin{minipage}{\linewidth}
  931. \begin{lstlisting}[language=Java, caption=Inizializzazione Batch, label={batch_init}]
  932.  
  933. //BATCH MEANS
  934. private ArrayList<Double> BMGlobalPopulation;
  935. private ArrayList<Double> BMCloudletPopulation;
  936. private ArrayList<Double> BMCloudPopulation;
  937. private ArrayList<Double> BMGlobalPopulation_1;
  938. private ArrayList<Double> BMCloudletPopulation_1;
  939. private ArrayList<Double> BMCloudPopulation_1;
  940. private ArrayList<Double> BMGlobalPopulation_2;
  941. private ArrayList<Double> BMCloudletPopulation_2;
  942. private ArrayList<Double> BMCloudPopulation_2;
  943.  
  944. //BATCH VARIANCE
  945. private ArrayList<Double> BMVarGlobalPopulation;
  946. private ArrayList<Double> BMVarCloudletPopulation;
  947. private ArrayList<Double> BMVarCloudPopulation;
  948. private ArrayList<Double> BMVarGlobalPopulation_1;
  949. private ArrayList<Double> BMVarCloudletPopulation_1;
  950. private ArrayList<Double> BMVarCloudPopulation_1;
  951. private ArrayList<Double> BMVarGlobalPopulation_2;
  952. private ArrayList<Double> BMVarCloudletPopulation_2;
  953. private ArrayList<Double> BMVarCloudPopulation_2;
  954.  
  955. //THROUGHPUT
  956. private ArrayList<Double> avgSystemT;
  957. private ArrayList<Double> avgCloudletT;
  958. private ArrayList<Double> avgCloudT;
  959. private ArrayList<Double> avgSystemT1;
  960. private ArrayList<Double> avgCloudletT1;
  961. private ArrayList<Double> avgCloudT1;
  962. private ArrayList<Double> avgSystemT2;
  963. private ArrayList<Double> avgCloudletT2;
  964. private ArrayList<Double> avgCloudT2;
  965. private ArrayList<Double> varSystemT;
  966. private ArrayList<Double> varCloudletT;
  967. private ArrayList<Double> varCloudT;
  968. \end{lstlisting}
  969. \end{minipage}
  970.  
  971.  
  972. Per terminare la panoramica sull'inizializzazione, è importante menzionare la classe \textbf{SystemConfiguration}, avente il compito di scansionare il file di configurazione ed estrarre tutti i parametri necessari alla simulazione:
  973.  
  974. \subsubsection{Run}
  975. Il \texttt{main} della simulazione si trova nella classe \textbf{Simulation} e viene riportato in Listing \ref{main}. \\
  976.  
  977. \begin{minipage}{\linewidth}
  978. \begin{lstlisting}[language=Java, caption=main della simulazione, label={main}]
  979. private static void run(){
  980. initialize();
  981. for(int i = 0; i < SystemConfiguration.ITERATIONS; i++){
  982. Event e = EventGenerator.getInstance().
  983. generateArrival();
  984. eventList.add(e);
  985. sortEventList();
  986. handleEvent();
  987. }
  988. jobStatistics.
  989. setGlobalTime(jobStatistics.getGlobalTime() +
  990. handleEvent());
  991. }
  992. \end{lstlisting}
  993. \end{minipage}\\
  994.  
  995. Tramite \texttt{initialize()} viene inizializzato l'\texttt{ArrayList eventList}, e vengono settati i parametri come indicati nel file di configurazione. Vengono poi salvate istanze di alcune classi, in modo da rendere il codice più leggibile.
  996.  
  997. Per ogni ciclo viene generato un nuovo evento di tipo arrivo. Ad ogni evento viene associato il tempo di arrivo, la classe e, se abilitato nel file di configurazione, la size del job\footnote{per maggiori informazioni vedere \ref{operation_enabled}}. In Listing \ref{eventGenerator} sono mostrate le fasi di generazione del tempo di arrivo (o più correttamente, di inter-arrivo) e di decisione della classe.\\
  998.  
  999. \begin{minipage}{\linewidth}
  1000. \begin{lstlisting}[language=Java, caption=Generazione di un evento, label={eventGenerator}]
  1001. public Event generateArrival(){
  1002. double arrival = Arrivals.getInstance().
  1003. getArrival();
  1004. Job job;
  1005. if(SystemConfiguration.OPERATIONS_ENABLED)
  1006. job = new Job(Arrivals.getInstance().
  1007. determineJobClass(),
  1008. arrival,
  1009. Services.getInstance().
  1010. getJobOperations());
  1011. else
  1012. job = new Job(Arrivals.getInstance().
  1013. determineJobClass(),
  1014. arrival, 0);
  1015. return new Event(0, job);
  1016. }
  1017.  
  1018. /**
  1019. * Return arrival times
  1020. */
  1021. public double getArrival(){
  1022. double total_rate = getTotalRate();
  1023. return exponential(total_rate,0);
  1024. }
  1025.  
  1026. public double exponential(double rate, int stream){
  1027. selectStream(stream);
  1028. return this.rvgs.exponential(1/rate);
  1029. }
  1030.  
  1031. /**
  1032. * Return job class
  1033. */
  1034. public int determineJobClass(){
  1035. double p1 =
  1036. SystemConfiguration.ARRIVAL_RATE_1/getTotalRate();
  1037. double p = init.uniform();
  1038.  
  1039. if(p <= p1){
  1040. return 1;
  1041. }
  1042. else {
  1043. return 2;
  1044. }
  1045. }
  1046. \end{lstlisting}
  1047. \end{minipage}\\
  1048.  
  1049. Una volta generato un evento di tipo arrivo, questo viene inserito nella \texttt{eventList}. Questa viene ordinata con il metodo presentato in Listing \ref{sort}.\\
  1050.  
  1051. \begin{minipage}{\linewidth}
  1052. \begin{lstlisting}[language=Java, caption=Ordinamento della eventList, label={sort}]
  1053. private static void sortEventList(){
  1054. eventList.sort((o1, o2) -> {
  1055. if (o1.getEventTime() < o2.getEventTime())
  1056. return -1;
  1057. else if(o1.getEventTime() == o2.getEventTime()){
  1058. if(o1.getType() != 0)
  1059. return -1;
  1060. else
  1061. return 1;
  1062. }
  1063. else
  1064. return 1;
  1065. });
  1066. }
  1067. \end{lstlisting}
  1068. \end{minipage}\\
  1069.  
  1070. A questo punto viene chiamata la funzione \texttt{handleEvent()}. Si scorre la lista ordinata e si prende il primo evento disponibile, se esiste (cosa vera a meno che non si parli del termine della simulazione). Dopo aver preso le attuali popolazioni dei due sistemi si analizza effettivamente l'elemento estratto. Se l'evento è un completamento allora questo deve essere processato dal sistema di riferimento. In alternativa il pacchetto deve essere smistato e il tempo aggiornato. In caso di evento di tipo arrivo, i tempi relativi ai completamenti rimanenti nella eventList vengono decrementati. Questo comportamento viene mostrato in Listing \ref{handleEvent} .\\
  1071.  
  1072. \begin{minipage}{\linewidth}
  1073. \begin{lstlisting}[language=Java, caption=gestione della eventList, label={handleEvent}]
  1074. private static double handleEvent(){
  1075. for (Event event: eventList)
  1076. event.setValid(true);
  1077. Iterator i = eventList.iterator();
  1078. double time = 0;
  1079. int[] numberOfJobsInCloudlet = {0,0};
  1080. int[] numberOfJobsInCloud = {0,0};
  1081. while(i.hasNext()){
  1082. numberOfJobsInCloudlet = Cloudlet.getInstance().
  1083. getJobsInCloudlet();
  1084. numberOfJobsInCloud = Cloud.getInstance().
  1085. returnJobsInCloud();
  1086. Event e = (Event) i.next();
  1087. time = e.getEventTime();
  1088. if(e.getType() == 0){ // arrival
  1089. break;
  1090. }
  1091. else if(e.getType() == 1){ // cloudlet
  1092. if(e.isValid()) {
  1093. cloudlet.processCompletion(e);
  1094. i.remove();
  1095. }
  1096. }
  1097. else{ // cloud
  1098. if(e.isValid()) {
  1099. cloud.processCompletion(e);
  1100. i.remove();
  1101. }
  1102. }
  1103. }
  1104. if(eventList.size() != 0) {
  1105. jobStatistics.updatePopulationMeans(
  1106. numberOfJobsInCloudlet,
  1107. numberOfJobsInCloud);
  1108. Event e = eventList.get(0);
  1109. cloudletController.dispatchArrivals(e);
  1110. jobStatistics.setGlobalTime(
  1111. jobStatistics.getGlobalTime() +
  1112. e.getJob().getArrivalTime());
  1113. jobStatistics.setActualTime(
  1114. jobStatistics.getActualTime() +
  1115. e.getJob().getArrivalTime());
  1116. eventList.remove(0);
  1117. for (Event event : eventList) {
  1118. if(event.isValid())
  1119. event.setEventTime(
  1120. event.getEventTime() - time);
  1121. }
  1122. }
  1123. else
  1124. return time;
  1125. return 0;
  1126. }
  1127. \end{lstlisting}
  1128. \end{minipage}\\
  1129.  
  1130. Il motivo per cui all'inizio tutti gli eventi vengono settati a \texttt{TRUE} è dato dal fatto che ad ogni arrivo corrisponde un nuovo completamento. Ogni completamento generato durante il ciclo ha \texttt{isValid = FALSE} e, al termine del ciclo, questo non subisce lo scorrere del tempo.
  1131.  
  1132. In caso di termine della simulazione la funzione ritorna il valore dell'ultimo completamento. In questo modo è possibile aggiornare correttamente il clock.\\
  1133.  
  1134. In caso di evento di tipo arrivo viene chiamata la funzione \texttt{dispatchArrivals(e)}. Sulla base di quanto settato nel file di configurazione, viene scelto l'algoritmo di dispatch. Essendo un argomento affrontato nel dettaglio nel paragrafo \ref{algoritmi_dispatch}, viene qui riportato solamente il comportamento del sistema con algoritmo standard.\\
  1135.  
  1136. \begin{minipage}{\linewidth}
  1137. \begin{lstlisting}[language=Java, caption=Gestione degli arrivi, label={dispatch}]
  1138. public void dispatchArrivals(Event e){
  1139. DispatchAlgorithm.getInstance().getAlgorithm(e);
  1140. }
  1141.  
  1142. public void getAlgorithm(Event e){
  1143. switch (algorithmType){
  1144. case 1: defaultAlgorithm(e);
  1145. break;
  1146. case 2: sizeBasedBAlgorithm(e);
  1147. break;
  1148. case 3: firstClassinCloudletAlgorithm(e);
  1149. break;
  1150. case 4: thresholdAlgorithm(e,
  1151. SystemConfiguration.THRESHOLD);
  1152. break;
  1153. }
  1154. }
  1155.  
  1156. /**
  1157. * Basic algoritm
  1158. */
  1159. public void defaultAlgorithm(Event e){
  1160. int[] numberOfJobsInCloudlet = Cloudlet.getInstance().getJobsInCloudlet();
  1161. int totalJobsInCloudlet = numberOfJobsInCloudlet[0] + numberOfJobsInCloudlet[1];
  1162.  
  1163. if(totalJobsInCloudlet == numberOfServers)
  1164. Cloud.getInstance().processArrival(e);
  1165. else
  1166. Cloudlet.getInstance().processArrival(e);
  1167. }
  1168. \end{lstlisting}
  1169. \end{minipage}\\
  1170.  
  1171. Nel caso in cui il processamento del Job venga affidato al Cloudlet, la prima operazione effettuata è l'associazione di un tempo di completamento al pacchetto. Successivamente il Job viene affidato al primo Server libero della lista e viene generato un evento di tipo completamento. Lo stato del sistema viene inoltre aggiornato, tenendo conto della classe da processare.
  1172.  
  1173. \begin{minipage}{\linewidth}
  1174. \begin{lstlisting}[language=Java, caption=Arrivo al Cloudlet, label={arrival_cloudlet}]
  1175. public void processArrival(Event e) {
  1176. Job job = e.getJob();
  1177. double completionTime =
  1178. Services.getInstance().getCloudletServiceTime(
  1179. job.getJobClass(),
  1180. job.getOperations());
  1181. int i = 0;
  1182. for(Server s: serverList){
  1183. if(!s.isBusy()){
  1184. increaseN(job.getJobClass());
  1185. s.setBusy(true);
  1186. job.setCompletionTime(completionTime);
  1187. s.setJobInService(job);
  1188. sendCompletionToSimulation(job, i);
  1189. break;
  1190. }
  1191. i++;
  1192. }
  1193. }
  1194. \end{lstlisting}
  1195. \end{minipage}\\
  1196.  
  1197. Nel caso in cui il Job sia inviato al Cloud, il metodo diventa ancora più semplice, non dovendo tenere conto delle statistiche a livello del singolo Server. Il procedimento è analogo a quanto visto per il caso del Cloudlet e viene riportato in Listing \ref{arrival_cloud}.\\
  1198.  
  1199.  
  1200. \begin{minipage}{\linewidth}
  1201. \begin{lstlisting}[language=Java, caption=Arrivo al Cloud, label={arrival_cloud}]
  1202. public void processArrival(Event e) {
  1203. Job j = e.getJob();
  1204. int jobclass = j.getJobClass();
  1205. double completionTime =
  1206. Services.getInstance().getCloudServiceTime(
  1207. jobclass,
  1208. j.getOperations());
  1209.  
  1210. j.setCompletionTime(completionTime);
  1211. increaseN(jobclass);
  1212. sendCompletionToSimulation(j);
  1213. }
  1214. \end{lstlisting}
  1215. \end{minipage}\\
  1216.  
  1217. Il metodo \texttt{sendCompletionToSimulation} si occupa di aggiungere un nuovo evento di tipo completamento alla event-list. \\
  1218.  
  1219. La generazione dei tempi di servizio è semplice ma richiede un gran numero di funzioni. Il sistema deve infatti tenere conto della classe del Job, del sistema che sta effettuando il processamento, della distribuzione scelta dall'utente e dall'uso o meno della size. Le operazioni \texttt{getCloudletServiceTime} e \texttt{getCloudServiceTime}, riportate in Listing \ref{getServiceTime}, permettono la chiamata della funzione corretta. \\
  1220.  
  1221. \begin{minipage}{\linewidth}
  1222. \begin{lstlisting}[language=Java, caption=Funzioni per tempo di servizio, label={getServiceTime}]
  1223. // SERVICE TIME CLOUD
  1224. public double getCloudServiceTime(int jobclass,
  1225. double numberOfOperations){
  1226. if(SystemConfiguration.OPERATIONS_ENABLED)
  1227. return getCloudServiceTimePerOperation(
  1228. jobclass, numberOfOperations);
  1229. else
  1230. return
  1231. getCloudServiceTimeWithoutOperations(jobclass);
  1232. }
  1233.  
  1234. // SERVICE TIME CLOUDLET
  1235. public double getCloudletServiceTime(int jobclass,
  1236. double numberOfOperations){
  1237. //hyperexponential using operations
  1238. if(SystemConfiguration.HYPEREXPO_ENABLED &&
  1239. SystemConfiguration.OPERATIONS_ENABLED)
  1240. return
  1241. getCloudletHyperExpServiceTimePerOperation(
  1242. jobclass, numberOfOperations);
  1243.  
  1244. //hyperexponential without using operations
  1245. else if (SystemConfiguration.HYPEREXPO_ENABLED)
  1246. return
  1247. getCloudletHyperExpServiceTimeWithoutOperations(jobclass);
  1248.  
  1249. //exponential using operations
  1250. else if(SystemConfiguration.OPERATIONS_ENABLED)
  1251. return
  1252. getCloudletExpServiceTimePerOperation(jobclass,
  1253. numberOfOperations);
  1254.  
  1255. //exponential without using operations
  1256. else
  1257. return
  1258. getCloudletServiceTimeWithoutOperations(jobclass);
  1259. }
  1260. \end{lstlisting}
  1261. \end{minipage}\\
  1262.  
  1263. Per non appesantire questa discussione viene qui riportata in Listing \ref{getCloudletExpo} solo una delle varie funzioni che permettono di generare un corretto tempo di servizio. La differenza con le altre risiede principalmente nella scelta dello stream e del tasso utilizzato come parametro della distribuzione desiderata. \\
  1264.  
  1265. \begin{minipage}{\linewidth}
  1266. \begin{lstlisting}[language=Java, caption=Tempo di servizio per il Cloudlet - distribuzione esponenziale, label={getCloudletExpo}]
  1267. private double getCloudletServiceTimeWithoutOperations(int job_class){
  1268. double service_rate;
  1269. int stream;
  1270. if(job_class == 1) {
  1271. service_rate = SystemConfiguration.CLOUDLET_M1;
  1272. stream = 2;
  1273. }
  1274. else {
  1275. service_rate = SystemConfiguration.CLOUDLET_M2;
  1276. stream = 3;
  1277. }
  1278. return InitGenerator.getInstance().
  1279. exponential(service_rate, stream);
  1280. }
  1281.  
  1282. public double exponential(double rate, int stream){
  1283. selectStream(stream);
  1284. return this.rvgs.exponential(1/rate);
  1285. }
  1286. \end{lstlisting}
  1287. \end{minipage}\\
  1288.  
  1289. Esaminando brevemente la funzione \texttt{handleEvent} (in Listing \ref{handleEvent}) si può notare che l'aggiornamento delle popolazioni medie viene eseguito prima di ogni processamento dell'evento di tipo arrivo. Per calcolare le diverse medie viene utilizzato l'algoritmo di Welford, riportato in Listing \ref{welford}\\
  1290.  
  1291. \begin{minipage}{\linewidth}
  1292. \begin{lstlisting}[language=Java, caption=Algoritmo di Welford, label={welford}]
  1293. public double[] computeMeanAndVariance(double oldVar,
  1294. double oldMean, double newValue, long n){
  1295. double diff = (newValue - oldMean);
  1296. double[] MV = new double[2];
  1297. MV[1] = oldVar + diff * diff * (n - 1) / n;
  1298. MV[0] = oldMean + (diff / n);
  1299. return MV;
  1300. }
  1301. \end{lstlisting}
  1302. \end{minipage}\\
  1303.  
  1304. Supponiamo ora che l'evento estratto dalla event-list sia una completamento. Anche in questo caso i metodi relativi a Cloudlet e Cloud sono molto simili e differiscono solo nella gestione dei server. In Listing \ref{comparisoncletcloud}.\\
  1305.  
  1306. \begin{minipage}{\linewidth}
  1307. \begin{lstlisting}[language=Java, caption=Completamento in Cloudlet e Cloud, label={comparisoncletcloud}]
  1308. //CLOUDLET
  1309. public void processCompletion(Event e){
  1310. Server s = serverList.get(e.getAdditionalInfo());
  1311. if(!s.isBusy())
  1312. System.exit(-1);
  1313. s.setBusy(false);
  1314. decreaseN(s.getJobInService().getJobClass());
  1315. CompletionHandler.getInstance().handleCompletion(
  1316. EventGenerator.getInstance().
  1317. generateCompletion(1, s.getJobInService()));
  1318. }
  1319.  
  1320. //CLOUD
  1321. public void processCompletion(Event e){
  1322. decreaseN(e.getJob().getJobClass());
  1323. CompletionHandler.getInstance().handleCompletion(
  1324. EventGenerator.getInstance().
  1325. generateCompletion(2, e.getJob()));
  1326. }
  1327.  
  1328. //GENERATE COMPLETION
  1329. public Event generateCompletion(int cloudletOrCloud, Job job){
  1330. if(cloudletOrCloud == 1 || cloudletOrCloud == 2)
  1331. return new Event(cloudletOrCloud, job);
  1332. else
  1333. return null;
  1334. }
  1335. \end{lstlisting}
  1336. \end{minipage}\\
  1337.  
  1338.  
  1339. La funzione \texttt{handleCompletion} effettua l'aggiornamento dei tempi di risposta relativi a classe e sistema, utilizzando l'algoritmo di Welford per il calcolo della media, esattamente come avviene per la popolazione media.\\
  1340.  
  1341. In questo paragrafo è stata quindi riportata una panoramica riguardante l'implementazione del flusso riportato in figura \ref{flusso_eventi}. La spiegazione delle funzioni \textit{core} della simulazione non è certamente sufficiente per dimostrare la robustezza e la bontà del codice. Per quanto sarebbe interessante approfondire ogni scelta effettuata nella fase di sviluppo, la trattazione risulterebbe eccessivamente lunga. Per questo motivo, per ulteriori approfondimenti riguardanti il codice e la teoria su cui si basa, si rimanda il lettore allo studio del capitolo \ref{implementazione} e alla lettura del codice allegato a questa discussione.
  1342.  
  1343. \subsection{Verifica}
  1344. La simulazione è stata sottoposta a verifica per capire se il modello computazionale fosse consistente con il modello delle specifiche. Ci si è posti la seguente domanda:
  1345.  
  1346. \begin{center}
  1347. \textit{Stiamo implementando il modello in modo corretto?}
  1348. \end{center}
  1349.  
  1350. Il paper \textit{Verifying and Validating Simulation Models, R. G. Sargent} \cite{verify} suggerisce alcuni metodi di verifica di un modello.
  1351.  
  1352. In particolare è stato utilizzato il \textbf{dynamic testing}, approccio attraverso cui il software viene testato sotto diverse condizioni. Tecniche comunemente usate nel dynamic testing sono
  1353. \begin{itemize}
  1354. \item studio della relazione tra differenti input-output per la verifica della coerenza e l'investigazione sulla presenza di anomalie;
  1355. \item check di consistenza sui singoli oggetti protratti per tutto lo sviluppo del codice;
  1356. \item riprogrammazione di componenti core della simulazione con lo scopo di determinare se i risultati ottenuti sono equivalenti.
  1357. \end{itemize}
  1358.  
  1359. Il processo di verifica ha quindi coinvolto nella sua interezza la fase di sviluppo del codice, permettendo di ottenere sempre risultati coerenti con il modello delle specifiche.
  1360.  
  1361. \subsection{Validazione}
  1362. Mentre tramite il processo di verifica si esamina la consistenza tra il modello computazionale e quello delle specifiche, con il processo di validazione si pone il focus sulla consistenza tra il modello computazionale ed il sistema che si sta analizzando. La domanda fondamentale di questa fase è quindi:
  1363.  
  1364. \begin{center}
  1365. \textit{Stiamo implementando il modello giusto?}
  1366. \end{center}
  1367.  
  1368. Per rispondere, si può fare ancora riferimento a \cite{verify}. Secondo Sargent esistono tre diversi approcci per confermare la validazione di un modello, in seguito descritti brevemente.
  1369.  
  1370. Il primo approccio viene chiamato Independent Verification and Validation (\textbf{IV\&V}). Questo prevede la presenza di una persona esterna al team di sviluppo e al committente che, tramite la sua professionalità ed esperienza, decida (in modo soggettivo) della validità del sistema. Un altro modo - più oggettivo - si basa sul confronto dei risultati della simulazione con l'output di un sistema reale: se l'esperto non riesce a distinguere con certezza il sistema simulato da quello reale, allora si può dire che il modello sia valido.
  1371.  
  1372. Il secondo approccio, sconsigliato dall'autore del paper, si basa sull'utilizzo di \textit{score}: a diversi aspetti del modello vengono associati dei punteggi e se la simulazione li supera, allora può essere considerata valida. Il problema risiede nella difficoltà di individuare sia i valori degli Score, sia le categorie da dover valutare. Non esistendo metriche universali (e non potrebbe essere altrimenti data l'unicità di ciascuna simulazione) si tenta quindi di dare valore oggettivo a qualcosa che per natura non è oggettivo.
  1373.  
  1374. L'ultimo approccio è sicuramente il più adottato e il più semplice: la validità di un modello viene confermata dal team di sviluppo sulla base di test e valutazioni protratti lungo tutto il corso del processo di implementazione.
  1375.  
  1376. Quest'ultimo è stato il metodo scelto. di seguito sono elencati alcuni dei test che il team ha effettuato per confermare la validità del modello:
  1377. \begin{labeling}{Comparison to other models aaa}
  1378. \item [\textbf{Extreme-Condition Test}:] il comportamento del sistema è risultato plausibile in caso di condizioni limite quali
  1379. aumento/diminuzione drastica prima del flusso entrante e poi dei tassi di servizio e presenza di 0 o infiniti server nel Cloudlet
  1380. \item[\textbf{Event Validity Test}:] Gli eventi generati dalla simulazione sono coerenti con quelli di un caso reale
  1381. \item[\textbf{Comparison to other models}:] i risultati ottenuti dalla simulazione sono stati comparati con quelli ottenuti da un corretto modello analitico
  1382. \end{labeling}
  1383.  
  1384. \newpage
  1385.  
  1386. \section{Implementazione}\label{implementazione}
  1387. Il modello delle specifiche ed in seguito il modello computazionale hanno portato allo sviluppo di un'applicazione di simulazione in Java. All'interno della stessa si trovano anche dei componenti non previsti dai modelli elencati ma che inglobano funzionalità prettamente di ausilio (vedere capitolo Features Aggiuntive).
  1388.  
  1389. \subsection{Features aggiuntive}
  1390. In questo paragrafo vengono descritte le varie funzionalità aggiuntive della simulazione. Queste feature non sono indispensabili per il funzionamento del flusso di base ma lasciano all'utente la libertà di modificare a proprio piacimento alcune caratteristiche riguardanti modalità di esecuzione della simulazione o varianti nell'implementazione.
  1391.  
  1392. \subsubsection{Verbose e CSVlogger}
  1393. Le prime feature analizzate sono certamente le più semplici e riguardano la gestione dell'output della simulazione. I parametri \texttt{VERBOSE} e \texttt{CSVLOGGER} controllano queste funzioni ed essendo booleani possono essere attivati o disattivati tramite i valori \texttt{true} o \texttt{false}.
  1394.  
  1395. Settando a true la verbosità è possibile stampare in console i risultati ottenuti al termine della simulazione. Le stampe riguardano i seguenti valori:
  1396. \begin{itemize}
  1397. \item percentuale di completamento della simulazione
  1398. \item parametri della simulazione quali arrival rate, service rate, numero di server nel Cloudlet e seed
  1399. \item probabilità di perdita del Cloudlet
  1400. \item throughput
  1401. \item completamenti
  1402. \item tempi di servizio
  1403. \item popolazioni medie
  1404. \item performance della simulazione riguardanti tempo reale, tempo simulato e RAM utilizzata
  1405. \end{itemize}
  1406. Anche settando a false il parametro della verbosità alcune stampe non invasive saranno comunque presenti. I risultati in consolle vengono stampati a schermo tramite la classe \textbf{PerformanceLogger} e la classe \textbf{Printer}, che si occupa di aspetti puramente di estetica della grafica di output.
  1407.  
  1408. \texttt{CSVLOGGER} è invece il parametro attraverso cui l'utente decide se scrivere su file o no i risultati ottenuti. I file sono i seguenti:
  1409. \begin{itemize}
  1410. \item \textbf{AVGjobs.csv}: file scritto in modalità append. Ogni volta che viene eseguita la simulazione viene aggiunta una riga con i risultati riguardanti le popolazioni medie per ciascuna classe e sistema
  1411. \item \textbf{BatchMeans.csv}: file sovrascritto ogni volta che viene avviata la simulazione. Presenta per ogni batch i valori relativi alle popolazioni medie per classe e sistema. Contiene quindi tante righe quanti sono i batch scelti e viene scritto solamente se il parametro \textit{BATCH} nel file di configurazione ha come flag \textit{true}
  1412. \item \textbf{MeansInOneSimulation.csv}: file sovrascritto ogni volta che viene avviata la simulazione. Contiene 2000 righe e ciascuna rappresenta la popolazione media di sistema e classi considerando la corrente iterazione e le precedenti. Questo permette di osservare la transizione dello stato del sistema da una situazione iniziale in cui questo è vuoto verso la stazionarietà.
  1413. \item \textbf{ResponseTime.csv}: file scritto in modalità append. Ogni volta che viene eseguita la simulazione viene aggiunta una riga con i risultati riguardanti il tempo medio di servizio per ciascuna classe e sistema
  1414. \item \textbf{ResponseTimeMeansInOneSimulation.csv}: file sovrascritto ogni volta che viene avviata la simulazione. Contiene tante righe quanti sono i pacchetti inviati durante la simulazione. Per questo motivo, al fine di evitare dimensioni eccessive, le informazioni salvate per ciascuna riga sono ridotte al minimo. Per ogni Job vengono infatti salvati solo i dati relativi alla classe, a chi ha completato la richiesta e quale è stato il tempo di servizio.
  1415. \item \textbf{ServerStatus.csv}: file sovrascritto ogni volta che viene avviata la simulazione. Contiene tante righe quanti sono i server presenti nel Cloudlet e per ciascuno di questi riporta l'utilizzazione e i pacchetti completati.
  1416. \item \textbf{SystemSimulation.csv}: file scritto in modalità append. Per ciascun Run della simulazione vengono riportate scritte le informazioni relative alle performance. In particolare per questo semplice caso sono scritti tempo reale di esecuzione, tempo di simulazione e RAM utilizzata dal processo.
  1417. \item \textbf{Throughput.csv} \textcolor{red}{file scritto in modalità append. Ogni volta che viene eseguira la simulazione viene aggiunta. una riga con i risultati riguardanti il throughput globale e per classe}.
  1418. \item \textbf{ThroughputBatch.csv} \textcolor{red}{TODO}
  1419. \item \textbf{BatchMeansPopulationCI.csv} \textcolor{red}{TODO}
  1420. \item \textbf{BatchVariances.csv} \textcolor{red}{TODO}
  1421. \item \textbf{VarianceJobs.csv} \textcolor{red}{TODO}
  1422. \end{itemize}
  1423.  
  1424. \subsection{File di configurazione}
  1425. Il file di configurazione \textit{config.properties} all'interno della directory \textit{resources} è stato ideato per consentire all'utente di settare e modificare i parametri fondamentali di simulazione in modo tale da poter interagire attivamente con il sistema. Illustriamo dunque le funzionalità e le possibili configurazioni per ogni parametro presente nel file:
  1426.  
  1427. \begin{itemize}
  1428. \item ARRIVAL\_RATE\_1: tasso di arrivi della classe 1;
  1429. \item ARRIVAL\_RATE\_2: tasso di arrivi della classe 2;
  1430. \item CLOUDLET\_M1: tasso di servizio dei task di classe 1 da parte del Cloudlet;
  1431. \item CLOUDLET\_M1: tasso di servizio dei task di classe 2 da parte del Cloudlet;
  1432. \item CLOUD\_M1: tasso di servizio dei task di classe 1 da parte del Cloud;
  1433. \item CLOUD\_M2: tasso di servizio dei task di classe 2 da parte del Cloud;
  1434. \item N: consente di impostare il numero di server che formano il Cloudlet;
  1435. \item HYPEREXPOENABLED (boolean): se pari a \textit{false} la distribuzione dei tempi di servizio del Cloudlet sarà esponenziale, altrimenti sarà iper-esponenziale;
  1436. \item PHASE\_P: consente di settare la fase in caso di distribuzione iper-esponenziale;
  1437. \item OPERATIONS\_ENABLED (boolean): se settato a \texttt{true} impone alla simulazione di associare un numero di operazioni richieste ad ogni job.
  1438. \item SEED: consente di impostare il SEED della simulazione
  1439. \item ITERATIONS: consente di impostare la durata della simulazione;
  1440. \item ALGORITHM: consente di decidere l'algoritmo di dispatching. Può assumere quattro diversi valori:
  1441. \begin{enumerate}
  1442. \item algoritmo standard (default);
  1443. \item algoritmo size-based;
  1444. \item algoritmo \textit{first class on Cloudlet};
  1445. \item algoritmo basato su soglia \textit{threshold algorithm};
  1446. \end{enumerate}standard
  1447. \item THRESHOLD: consente di selezionare il valore di soglia per l'algoritmo 4;
  1448. \item BATCH (boolean): se impostato a \textit{true} la simulazione utilizzerà il metodo dei \textit{Batch Means};
  1449. \item NUM\_BATCH: consente di impostare il numero di batch per la simulazione (impostato a 64 per default);
  1450. \item VERBOSE (boolean): se impostato a \texttt{true} aumenta la quantità di log stampati su console
  1451. \item MULTI\_RUN (boolean): se impostato a \texttt{true} permette l'esecuzione consecutiva della simulazione cambiando in modo automatico il SEED. Viene utilizzato insieme al parametro \texttt{RUNS} che decide il numero di volte che la simulazione dovrà essere eseguita.
  1452. \item CSV\_LOGGER (boolean): abilita la scrittura su file .csv delle statistiche collezionate durante la simulazione.
  1453. \end{itemize}
  1454. Nel paragrafo 4.2 verranno spiegati nel dettaglio il funzionamento di VERBOSE, MULTI\_RUN, CSV\_LOGGER e ALGORITHM.
  1455.  
  1456.  
  1457.  
  1458.  
  1459.  
  1460. \subsubsection{Multi-Run}
  1461. Avviare la simulazione in modalità \textit{Multi-Run} permette di eseguire più volte il processo utilizzando seed diversi. Per usare questa funzionalità bisogna settare il parametro \textit{MULTI\_RUN} a true e decidere il numero di cicli imponendo \textit{RUNS} al numero voluto.
  1462.  
  1463. Si noti che l'utilizzo del multi-run disabilita automaticamente la verbosità ed impedisce al programma di scrivere sui file \textit{ResponseTimeMeansInOneSimulation.csv} e \textit{MeansInOneSimulation.csv}. Questo al fine di evitare inutili scritture su file che verranno sovrascritti all'inizio di ciascun nuovo ciclo.
  1464.  
  1465. Per il primo ciclo della simulazione il programma utilizza il seed imposto dall'utente in fase di configurazione. Il seed utilizzato per il ciclo i-esimo è dato da \textit{SEED} + i.
  1466.  
  1467. \newpage
  1468. \subsection{Algoritmi di dispatching}\label{algoritmi_dispatcher}
  1469.  
  1470. Uno degli obiettivi principali di qualsiasi simulazione dovrebbe sempre essere quello di osservare come i risultati ottenuti dal processo varino a seconda dei diversi parametri in input e delle scelte algoritmiche adottabili. Per questo motivo è stata posta molta cura nel concedere più libertà possibile all'utente in fase di scelta dell'algoritmo di dispatching, elemento considerato fondamentale per gli scopi della simulazione.
  1471.  
  1472. Per scegliere la condizione di smistamento è possibile andare a modificare il parametro \texttt{ALGORITHM} presente nel file di configurazione. Di seguito vengono descritte a fondo le differenti soluzioni.
  1473.  
  1474.  
  1475. \subsubsection{Algoritmo di default}
  1476. L'algoritmo più semplice adottabile dal controllo è certamente il \textbf{default algorithm}, corrispondente al valore 1 del parametro \texttt{ALGORITHM}. Essendo stato analizzato abbondantemente nei precedenti capitoli, viene qui solo riassunto il suo funzionamento \\
  1477.  
  1478. \begin{minipage}{\linewidth}
  1479. \begin{lstlisting}[language=Python, caption=default algorithm, label={dispatch1}]
  1480. if(event is an arrival){
  1481. if(totalJobsInCloudlet == numberOfServers){
  1482. Cloud.processArrival(e);
  1483. }
  1484. else{
  1485. Cloudlet.processArrival(e);
  1486. }
  1487. }
  1488. \end{lstlisting}
  1489. \end{minipage}
  1490.  
  1491. \subsubsection{Algoritmo alternativo 1: size-based non-preemptive}
  1492. Il primo metodo di dispatching alternativo che l'utente può scegliere è l'algoritmo \textbf{size based}, corrispondente al valore 2 del parametro \texttt{ALGORITHM}. Per poter garantire la corretta esecuzione è necessario inoltre settare a \texttt{true} il parametro \texttt{OPERATIONS\_ENABLED}\footnote{ i dettagli del parametro in questione sono presentati nel paragrafo \ref{operation_enabled}}.\\
  1493.  
  1494. Seguendo l'algoritmo descritto in Listing \ref{dispatch2}, si supponga di inviare nel Cloudlet soltanto i task aventi tempo di servizio inferiore alla media. Dalla teoria si ha che $ P(size < E[S]) = 0.6332$. In generale il tempo di servizio di ciascuna classe è dato da
  1495.  
  1496. \begin{center}
  1497. $E[S_k] = \int_{x_{k-1}}^{x_k} t f^n(t) dt = \int_{x_{k-1}}^{x_k} t \frac{\mu e^{-\mu t}}{F(x_k)-F(x_{k-1})} = \int_{x_{k-1}}^{x_k} t \frac{\mu e^{-\mu t}}{p_k} dt$
  1498. \end{center}
  1499.  
  1500. Nel caso specifico di $size < E[S]$ si ha che
  1501.  
  1502. \begin{center}
  1503. $E[S_1] = \int_{0}^{\frac{1}{\mu}} t \frac{\mu e^{-\mu t}}{0.6332} dt$
  1504. \end{center}
  1505.  
  1506. Per ciascuna classe quindi
  1507. \begin{center}
  1508. $E[S_1_{class\_1}] = \int_{0}^{\frac{1}{\mu_{1\_clet}}} t \frac{\mu e^{-\mu t}}{0.6332} dt$
  1509. \end{center}
  1510.  
  1511. \begin{center}
  1512. $E[S_1_{class\_1}] = \int_{0}^{\frac{1}{\mu_{1\_clet}}} t \frac{\mu_{1\_clet} e^{-\mu_{1\_clet} t}}{0.6332} dt = \int_{0}^{\frac{1}{0.45}} t \frac{0.45 e^{-0.45 t}}{0.6332} dt = 0.927354 $ s \\~\\
  1513. $E[S_1_{class\_2}] = \int_{0}^{\frac{1}{\mu_{2\_clet}}} t \frac{\mu_{2\_clet} e^{-\mu_{2\_clet} t}}{0.6332} dt = \int_{0}^{\frac{1}{0.27}} t \frac{0.27 e^{-0.27 t}}{0.6332} dt = 1.545 $ s
  1514. \end{center}
  1515.  
  1516. A questo punto è possibile risolvere il sistema presentato al paragrafo \ref{system} con i seguenti parametri:\\
  1517. \begin{center}
  1518. $\lambda'_{1\_clet} = 6.00*0.6332 = 3.7992 $\\
  1519. $\lambda'_{2\_clet} = 6.25*0.6332 = 3.9575 $\\
  1520. $\mu'_{1\_clet} = \frac{1}{0.927354} = 1.0783 $\\
  1521. $\mu'_{2\_clet} = \frac{1}{1.5456} = 0.6470 $\\
  1522. \end{center}
  1523.  
  1524. \'E quindi è possibile ricavare i nuovi risultati analitici:\\
  1525.  
  1526. \begin{center}
  1527.  
  1528. %probabilità che il Cloudlet sia saturo
  1529. $P_{loss}\footnote{Indica la probabilità che il Cloudlet sia saturo} = 0.723346 $
  1530.  
  1531. %lambda_in_cloudlet totale
  1532. $\lambda'_{tot\_clet} = (1-P_{loss})*(0.6332*(\lambda'_{1\_clet}) + 0.6332*(\lambda'_{2\_clet})= 2.145922 $ tasks/s\\~\\
  1533.  
  1534. %lambda_in_cloud totale
  1535. $\lambda'_{tot\_cloud} = P_{loss}*((\lambda'_{1\_clet} * 0.6332) + (\lambda'_{2\_clet}* 0.6332)) + \lambda_{tot}*(0.3668) = 10.096728 $ tasks/s \\~\\
  1536.  
  1537. $ E[T_{clet}] = \frac{\lambda_{1\_in\_clet}}{\lambda_{clet}}*E[T_{1\_clet}] + \frac{\lambda_{2\_in\_clet}}{\lambda_{clet}}* E[T_{2\_clet}] = 1.23992848$ s\\~\\
  1538.  
  1539. $E[T_{1\_clet}] = E[S_1_{class\_1}] = 0.927354 $ s\\~\\
  1540.  
  1541. $E[T_{2\_clet}] = E[S_1_{class\_2}] = 1.545 $ s\\~\\
  1542.  
  1543. $E[T_{1\_cloud}] = (P(size > E[S])* \int_{1/\mu_{1\_cloud}}^{\infty} t \frac{\mu_{1\_cloud} e^{-\mu_{1\_cloud} t}}{0.3668} dt) + (P(size < E[S])* \int_{0}^{1/\mu_{1\_cloud}} t \frac{\mu_{1\_cloud} e^{-\mu_{1\_cloud} t}}{0.3668} dt)
  1544.  
  1545. = \int_{0}^{\frac{1}{0.25}} t \frac{0.25 e^{-0.25 t}}{0.3668} dt = 8.02354*0.3668 + (1.66924*0.6332) = $ s \\~\\
  1546.  
  1547.  
  1548. $E[T_{1\_cloud}] = P(size > E[S])(p_{class1}(tempo di risposta job grandi classe 1) + (p_{class2}(tempo di risposta job grandi classe 2)) + (P(size < E[S]))(P_{loss})(p_{class1}(tempo di risposta job piccoli classe 1) + (p_{class2}(tempo di risposta job piccoli classe 2))$
  1549.  
  1550.  
  1551. $E[T_{2\_cloud}] = $ s\\~\\
  1552. $E[T_{cloud}]= $ s\\~\\
  1553. $E[N_{clet}] = $
  1554. $E[N_{1\_cloud}] = 19.028272 $\\~\\
  1555. $E[N_{2\_cloud}] = 28.40906 $\\~\\
  1556. $E[N_{cloud}] = $\\~\\
  1557.  
  1558. \end{center}
  1559.  
  1560. TODO SPECIFICARE BENE COSA RAPPRESENTA PLOSS!!!!!!!
  1561. TODO SPECIFICARE BENE I LAMBDA
  1562.  
  1563. Bisogna specificare che $P_{loss}$ non è la probabilità di entrare nel Cloud. Quest'ultima può essere calcolata come
  1564.  
  1565. \begin{center}
  1566. $P(size > E[S]) + (P(size < E[S])*P_{loss} = 0.824794$
  1567. \end{center}
  1568.  
  1569. Lo pseudocodice è il seguente\\
  1570.  
  1571. \begin{minipage}{\linewidth}
  1572. \begin{lstlisting}[language=Python, caption=size based algorithm, label={dispatch2}]
  1573. if(event is an arrival){
  1574. if (totalJobsInCloudlet >= numberOfServers ||
  1575. (jobClass == 2 && operations > 1.0) ||
  1576. (jobClass == 1 && operations > 1.0)){
  1577. Cloud.processArrival(e);
  1578. }else{
  1579. Cloudlet.processArrival(e);
  1580. }
  1581. }
  1582. \end{lstlisting}
  1583. \end{minipage}
  1584.  
  1585. \subsubsection{Algoritmo alternativo 2: first class on Cloudlet}
  1586. Il terzo algoritmo che l'utente può scegliere, chiamato \textbf{first class on Cloudlet algorithm} si basa su un'idea molto semplice: i job di classe 1 godono di un tasso di servizio più elevato, quindi verranno serviti in meno tempo rispetto agli altri.
  1587. Lo pseudocodice è il seguente\\
  1588.  
  1589.  
  1590. \begin{minipage}{\linewidth}
  1591. \begin{lstlisting}[language=Java, caption=first class on Cloudlet algorithm, label={dispatch3}]
  1592. if(event is an arrival){
  1593. if(totalJobsInCloudlet >= numberOfServers || jobClass == 2){
  1594. Cloud.processArrival(e);
  1595. }else{
  1596. Cloudlet.processArrival(e);
  1597. }
  1598. }
  1599. \end{lstlisting}
  1600. \end{minipage}
  1601.  
  1602. Adottando questo algoritmo, cambia il modello analitico rispetto all'algoritmo standard. Infatti, poiché il Cloudlet accetta solo task di classe 1 la catena di Markov risulta mono-dimensionale, come visibile in figura:
  1603.  
  1604. \begin{center}
  1605. \begin{figure}[H]
  1606. \centering
  1607. \includegraphics[width=0.8\textwidth]{MM33.png}
  1608. \caption{Modello della rete}
  1609. \label{key}
  1610. \end{figure}
  1611. \end{center}
  1612.  
  1613. Pertanto, i nuovi risultati analitici sono:
  1614.  
  1615. \begin{center}
  1616.  
  1617. $P_{loss} = p_{class\_1}*p_3 + p_{class\_2} = 0.8985142 $\\~\\
  1618.  
  1619. $\lambda_{clet} = \lambda_1*(1-p_3) = 1,242932 $ tasks/s\\~\\
  1620.  
  1621. $\lambda_{cloud} = \lambda_2 + (\lambda_1 - \lambda_{clet}) = 11,007067 $ tasks/s\\~\\
  1622.  
  1623. $ E[T_{clet}] = E[T_{1\_clet}] = 1/\mu_{1clet}= 2,222222$ s\\~\\
  1624.  
  1625. $E[T_{1\_cloud}] = \frac{1}{\mu_{1\_cloud}} = 4,00000$ s \\~\\
  1626.  
  1627. $E[T_{2\_cloud}] = \frac{1}{\mu_{2\_cloud}} = 4.54545$ s\\~\\
  1628.  
  1629. $p_1 = $
  1630. $E[T_{cloud}]= \frac{\lambda_1 - \lambda_{clet}}{\lambda_{tot}} * E[T_{1\_cloud}] + \frac{\lambda_2}{\lambda_{tot}} * E[T_{2\_cloud}] = 4,309355$ s\\~\\
  1631. $E[N_{clet}] = E[N_{1_clet}] = \lambda_{clet}*E[T_{clet}] = 2.762071 $ tasks \\~\\
  1632. $E[N_{1\_cloud}] = (\lambda_1 - \lambda_{clet})*E[T_{1\_cloud}] = 19.028272 $ tasks \\~\\
  1633. $E[N_{2\_cloud}] = \lambda_2*E[T_{2\_cloud}] = 28.40906 $ tasks \\~\\
  1634. $E[N_{cloud}] = \lambda_{cloud}*E[T_{cloud}] = 47.433400 $ tasks \\~\\
  1635. \end{center}
  1636.  
  1637.  
  1638. Bisogna quindi notare come la probabilità di perdita sia pari alla probabilità che un job di qualsiasi classe non venga servito dal cloudlet. A seguito della risoluzione della catena di Markov, si trova che la probabilità di essere nello stato 3 (stato di saturazione del Cloudlet) è pari a 0.7928. A questo però bisogna aggiungere che tutti i job di classe 2 sono scartati a priori dal Controller, da qui la formula della $P_{loss}$ mostrata poco fa.
  1639.  
  1640.  
  1641.  
  1642.  
  1643.  
  1644.  
  1645. \subsubsection{Algoritmo alternativo 3: threshold-based algorithm}
  1646. L'ultimo algoritmo nasce da un problema osservato nel comportamento dell'algoritmo \textit{first class on cloudlet}: la scarsa utilizzazione del Cloudlet stesso. Per sfruttare al meglio quest'ultimo si è deciso quindi sia di non inviare più solo job di class 1 (con cui si era già notato un miglioramento nei tempi di risposta) sia di evitare di sovraccaricare il Cloudlet oltre una certa soglia (da qui il nome dell'algoritmo). In particolare, in caso di superamento della stessa, i task di classe 2 vengono inviati al Cloud, mentre i task di classe 1 possono comunque prendere servizio presso il Cloudlet. La motivazione alla base di questa scelta risiede nel fatto che i job di classe 1 godono di un tasso di servizio maggiore e pertanto possono essere completati in minor tempo, portando un vantaggio qualora il Cloudlet sia quasi saturo, incrementandone comunque l'utilizzazione inviando anche task di class 2.\\
  1647.  
  1648. Lo pseudocodice è il seguente\\
  1649.  
  1650. \begin{minipage}{\linewidth}
  1651. \begin{lstlisting}[language=Python, caption=first class on Cloudlet algorithm, label={dispatch3}]
  1652. if(event is an arrival){
  1653. if((totalJobsInCloudlet >= numberOfServers) ||
  1654. (totalJobsInCloudlet > soglia && jobClass == 2)){
  1655. Cloud.getInstance().processArrival(e);
  1656. }else{
  1657. Cloudlet.getInstance().processArrival(e);
  1658. }
  1659. }
  1660. \end{lstlisting}
  1661. \end{minipage}
  1662.  
  1663.  
  1664. Sono stati testati diversi valori di threshold per poter trovare quello che fornisse il minor tempo di risposta globale possibile, pur non avendo introdotto prelazione. Lo svantaggio di questo algoritmo è un peggioramento del tempo di risposta del Cloud, che viene sottoposto ad un carico maggiore rispetto all'algoritmo di default.
  1665.  
  1666. Si noti che impostando il valore soglia a 0 si torna al caso dell'algoritmo \textit{first class in Cloudlet}. Infatti non appena il Cloudlet non è vuoto tutti i task di classe 2 verranno inviati sul Cloud.
  1667.  
  1668. Si ricorda che per poter eseguire questo algoritmo è necessario impostare il parametro \texttt{THRESHOLD} alla soglia desiderata.
  1669.  
  1670. In conclusione, empiricamente è stato osservato che $14$ è il valore per cui si ottengono i risultati migliori. Non sono stati riportati i risultati analitici vista la complessità della Catena di Markov risultante: bidimensionale fintanto che la popolazione totale nel sistema è pari a THRESHOLD, monodimensionale (processo di nascita-morte) di soli task di classe 1 successivamente.
  1671.  
  1672.  
  1673. \subsubsection{Batch}
  1674. La tecnica dei Batch Means consente di eliminare il problema del bias iniziale nel calcolo dell'intervallo di stima. Per implementarla è stato seguito l'algoritmo del libro \textit{Discrete-Event Simulation:
  1675. a first course} di L. Leemis e S. Park. L'algoritmo prevede di dividere la sequenza di dati in input $x_1,x_2,.....x_n$ in \textit{k} batch di dimensione \textit{b} e di calcolare per ognuno di essi la media relativa alla statistica di interesse:
  1676.  
  1677. \begin{center}
  1678. $x_1,....x_b,x_{b+1},...,x_{2b},........,x_{n-b},...x_n$\\~\\
  1679. $\bar{x_j} = \frac{1}{b}\sum_{k=1}^b x_{j-1}_{b+i}$\\~\\
  1680. \end{center}
  1681.  
  1682. Poi si calcola la media $\bar{x}$ e la deviazione standard s delle medie dei batch $\bar{x_1},\bar{x_2},...,\bar{x_k}$. Scelto poi un livello di confidenza $1-\alpha$, si calcola il valore critico
  1683. $t^* = idfStudent(k-1,1-\frac{\alpha}{2})$ e si calcolano gli estremi dell'intervallo di confidenza:
  1684.  
  1685. \begin{center}
  1686. $\bar{x}\pm \frac{t^*s}{\sqrt{k-1}} $\\~\\
  1687. \end{center}
  1688.  
  1689. Va notato che la scelta della coppia (b,k) non influisce sul punto di stima ma solo sull'ampiezza dell'intervallo di confidenza.\\
  1690.  
  1691. Perchè questa tecnica elimina il problema del bias iniziale? Perchè le statistiche di ogni batch vengono inizializzate allo stato del sistema nel momento in cui le stime dei batch vengono azzerate. \\
  1692.  
  1693. Poiché il sistema in considerazione contiene un infinite server si può ritenere che il sistema raggiunga la stazionarietà, per questo motivo sono state realizzate statistiche \textit{infinite-horizon} applicando il metodo dei Batch Means. Si esegue quindi una long run e si partizionano i dati in input in batch di dimensione prefissata. La coppia di parametri (b,k) è stata scelta in modo tale che k = 64, così che la metodologia sia ancora più valida vista la notevole dimensione b dei singoli batch\footnote{Si ricorda che il parametro k è configurabile nel file \textit{config.properties} settando la variabile NUM\_BATCH}.
  1694. \subsubsection{Abilitare le operazioni}\label{operation_enabled}
  1695. Per quanto detto fino a questo punto il Job viene considerato come un oggetto avente come attributi la classe di appartenenza, il tempo di arrivo ed il tempo di completamento. Ogni volta che questo viene preso in carico da uno qualsiasi dei sottosistemi verrà generato un tempo di servizio che dipende unicamente dal tasso di servizio del sottosistema scelto. Questo è corretto ai fini della simulazione ma è sicuramente un comportamento distante da quello reale. In tal caso la size del Job sarebbe decisa solo nel momento del processamento e non sarebbe una proprietà del job stesso come invece dovrebbe essere. Abilitare le operazioni permette di dare alla simulazione un comportamento più simile al caso reale.
  1696.  
  1697. Una volta attivato questo flag, ad ogni Job generato viene associato un valore relativo al numero di operazioni richieste. Il tempo impiegato dal sistema per processare tutte le operazioni diventa quindi il nuovo tempo di servizio.
  1698.  
  1699. In questo modo il sistema ha un comportamento più realistico: ogni server ha un proprio rate di operazioni/secondo che rimane costante nel tempo e ciò che varia è la grandezza del job di volta in volta da servire.
  1700.  
  1701. \\
  1702.  
  1703. Abilitare le operazioni è ovviamente un approccio che porta a risultati corretti, gli stessi ottenibili con metodi standard. \`E interessante mostrare come questo sia vero andando ad esaminare l'implementazione dell'estrazione di un numero con distribuzione esponenziale.
  1704.  
  1705. Viene qui descritto il processo di generazione di un evento di tipo arrivo\\
  1706.  
  1707. \begin{minipage}{\linewidth}
  1708. \begin{lstlisting}[language=Java, caption=generazione di un evento di tipo arrivo, label={arrival}]
  1709. public Event generateArrival(){
  1710. double arrival = getArrival();
  1711. int jobClass = determineJobClass();
  1712. Job job;
  1713. if(OPERATIONS_ENABLED)
  1714. job = new Job(jobClass, arrival, getJobOperations());
  1715. else
  1716. job = new Job(jobClass, arrival, 0);
  1717. return new Event(0, job);
  1718. } \end{lstlisting}
  1719. \end{minipage}
  1720.  
  1721. la funzione \texttt{getJobOperations()} ritorna un valore da una distribuzione esponenziale con parametro 1.
  1722.  
  1723. Quando uno dei sistemi deve stabilire il tempo di servizio associato al job preso in esame, vengono richiamate le seguenti funzioni\\
  1724.  
  1725. \begin{minipage}{\linewidth}
  1726. \begin{lstlisting}[language=Java, caption=generazione di un evento di tipo arrivo, label={arrival}]
  1727. public double getServiceTime(int jobclass, double numberOfOperations){
  1728. if(OPERATIONS_ENABLED)
  1729. return getExpServiceTimePerOperation(jobclass, numberOfOperations);
  1730. else
  1731. return getServiceTimeWithoutOperations(jobclass);
  1732. }
  1733.  
  1734. private double getExpServiceTimePerOperation(int jobClass, double numberOfOperations){
  1735. if(jobClass == 1)
  1736. return (1/SYSTEM_RATE_1) * numberOfOperations;
  1737. else
  1738. return (1/SYSTEM_RATE_2) * numberOfOperations;
  1739. }
  1740.  
  1741. private double getServiceTimeWithoutOperations(int job_class){
  1742. double service_rate;
  1743. int stream;
  1744. if(job_class == 1) {
  1745. service_rate = SYSTEM_RATE_1;
  1746. stream = 2;
  1747. }
  1748. else {
  1749. service_rate = SYSTEM_RATE_2;
  1750. stream = 3;
  1751. }
  1752. return exponential(service_rate, stream);
  1753. }
  1754. \end{lstlisting}
  1755. \end{minipage}
  1756.  
  1757.  
  1758.  
  1759. A livello di codice, andando a guardare le librerie \texttt{RVGS} e \texttt{RNGS}, si ha che per generare un tempo di servizio con distribuzione esponenziale si deve chiamare\\
  1760.  
  1761.  
  1762. \begin{minipage}{\linewidth}
  1763. \begin{lstlisting}[language=Java, caption=exponential function, label={dispatch3}]
  1764. //funzione che richiede il valore
  1765. public double exponential(double rate){
  1766. return exponential(1/rate);
  1767. }
  1768.  
  1769. //funzione exponential in rvgs
  1770. public double exponential(double m)
  1771. /* =========================================================
  1772. * Returns an exponentially distributed positive real number.
  1773. * NOTE: use m > 0.0
  1774. * =========================================================
  1775. */
  1776. {
  1777. return (-m * Math.log(1.0 - rngs.random()));
  1778. }\end{lstlisting}
  1779. \end{minipage}
  1780.  
  1781. quindi, facendo particolare attenzione a quel fattore \texttt{-m} utilizzato dalla funzione \texttt{exponential} e ricordando come è stato generato il valore relativo al numero di operazioni, si capisce facilmente che
  1782. \begin{center}
  1783. \texttt{return exponential(1/SERVICE\_RATE)}\\
  1784. =\\
  1785. \texttt{return (1/SYSTEM\_RATE)*exponential(1)}\\
  1786. =\\
  1787. \texttt{return (1/SYSTEM\_RATE)*numberOfOperations}
  1788. \end{center}
  1789.  
  1790. Il risultato ottenuto è quindi lo stesso. Tuttavia i benefici sulla comprensione del codice sono molteplici.
  1791.  
  1792. Per prima cosa è certamente più naturale pensare che un job abbia un numero fisso di operazioni e che il tempo di servizio dipenda dalla velocità con cui il server riesce a processarle.
  1793.  
  1794. In più ci sono modifiche sostanziali per l'uso degli stream. Con l'approccio di default senza operazioni il RNG adotta uno stream diverso per ciascuna combinazione di classe del job e sistema da cui viene servito. Nel nostro caso la simulazione di base prevede 5 differenti stream. Abilitando le operazioni invece sarebbero necessari solo due stream, uno per gli arrivi e uno per l'estrazione del numero di operazioni richieste. \\
  1795.  
  1796.  
  1797. Dalla teoria si ha che\footnote{Per una semplice dimostrazione leggere pagina 2 delle note di Renato Feres, professore della Washington University in St. Louis, disponibili al seguente link \textit{https://www.math.wustl.edu/~feres/Math450Lect03.pdf}}
  1798. \begin{center}
  1799. Sia X una R.V. continua con PDF $f_X(x)$ e CDF $F_X(x)$ e sia $Y = aX + b$. Allora la PDF di Y è data da\\~\\
  1800. $f_Y(y) = |\frac{1}{a}|f_X(\frac{(y-b)}{a})$
  1801. \end{center}
  1802.  
  1803. Questo vuol dire che se $X$ è distribuita esponenzialmente con parametro 1 allora $Y = \frac{X}{\mu}$ è esponenzialmente distribuita con parametro $\frac{1}{\mu}$.
  1804.  
  1805.  
  1806.  
  1807.  
  1808.  
  1809. \subsection{Risultati generati}
  1810.  
  1811. \subsubsection{Popolazione media}
  1812.  
  1813. \begin{center}
  1814. \begin{tabular}{||c c c c||}
  1815. \hline
  1816. Misura & Analitico & Sperimentale & Errore \\ [0.5ex]
  1817. \hline\hline
  1818. $E[N]_{global}$ & 51.136112 j & 51.634704 j & 0.9750\% \\
  1819. \hline
  1820. $E[N]_{Clet}$ & 2.915702 j & 2.917707 j & 0.0687\% \\
  1821. \hline
  1822. $E[N]_{Cloud}$ & 48.220410 j & 48.716997 j & 1.0298\% \\
  1823. \hline
  1824. $E[N]_{1}$ & 23.147490 j & 23.390956 j & 1.0518\% \\
  1825. \hline
  1826. $E[N]_{2}$ & 27.988622 j & 28.243748 j & 0.9115\% \\
  1827. \hline
  1828. $E[N]_{Clet_1}$ & 1.065637 j & 1.068201 j & 0.2406\% \\
  1829. \hline
  1830. $E[N]_{Clet_2}$ & 1.850065 j & 1.849505 j & 0.0302\% \\
  1831. \hline
  1832. $E[N]_{Cloud_1}$ & 22.081853 j & 22.322755 j & 1.0906\% \\
  1833. \hline
  1834. $E[N]_{Cloud_2}$ & 26.138557 j & 26.394242 j & 0.9782\% \\
  1835. \hline
  1836. \end{tabular}
  1837. \end{center}\\
  1838.  
  1839. grafici sottostanti ottenuti dalla simulazione presentata nella tabella \ref{table:standard3}
  1840. \begin{center}
  1841. \begin{figure}[H]
  1842. \centering
  1843. \includegraphics[width=0.8\textwidth]{immagini/grafici/globalPopPerTime.png}
  1844. \caption{Arrivare alla stazionarietà - popolazione globale}
  1845. \label{fig:globalPopPertime}
  1846. \end{figure}
  1847. \end{center}
  1848.  
  1849. \begin{center}
  1850. \begin{figure}[H]
  1851. \centering
  1852. \includegraphics[width=0.8\textwidth]{immagini/grafici/cloudPopPerTime.png}
  1853. \caption{Arrivare alla stazionarietà - popolazione Cloud}
  1854. \label{fig:cloudPopPertime}
  1855. \end{figure}
  1856. \end{center}
  1857.  
  1858. \begin{center}
  1859. \begin{figure}[H]
  1860. \centering
  1861. \includegraphics[width=0.8\textwidth]{immagini/grafici/cloudletPopPerTime.png}
  1862. \caption{Arrivare alla stazionarietà - popolazione Cloudlet}
  1863. \label{fig:cletPopPertime}
  1864. \end{figure}
  1865. \end{center}
  1866.  
  1867. Invece per quanto riguarda la popolazione media in differenti run si ha che, utilizzando la run presente alla tabella \ref{table:fastMR}
  1868.  
  1869. \begin{center}
  1870. \begin{figure}[H]
  1871. \centering
  1872. \includegraphics[width=0.8\textwidth]{immagini/grafici/globalPopMultirun.png}
  1873. \caption{Arrivare alla stazionarietà - popolazione Cloudlet}
  1874. \label{fig:cletPopmr}
  1875. \end{figure}
  1876. \end{center}
  1877.  
  1878. \begin{center}
  1879. \begin{figure}[H]
  1880. \centering
  1881. \includegraphics[width=0.8\textwidth]{immagini/grafici/cloudletpopMultirun.png}
  1882. \caption{Arrivare alla stazionarietà - popolazione Cloudlet}
  1883. \label{fig:cletPopmr}
  1884. \end{figure}
  1885. \end{center}
  1886.  
  1887. \begin{center}
  1888. \begin{figure}[H]
  1889. \centering
  1890. \includegraphics[width=0.8\textwidth]{immagini/grafici/cloudPopMultirun.png}
  1891. \caption{Arrivare alla stazionarietà - popolazione Cloudlet}
  1892. \label{fig:cletPopmr}
  1893. \end{figure}
  1894. \end{center}
  1895.  
  1896.  
  1897.  
  1898. \begin{center}
  1899. \begin{tabular}{||c c||}
  1900. \hline
  1901. Misura & Sperimentale\\ [0.5ex]
  1902. \hline\hline
  1903. $E[N]_{global}$ & 44.108593 j\\
  1904. \hline
  1905. $E[N]_{Clet}$ & 19.007473 j\\
  1906. \hline
  1907. $E[N]_{Cloud}$ & 25.101120 j\\
  1908. \hline
  1909. $E[N]_{1}$ & 18.436802 j\\
  1910. \hline
  1911. $E[N]_{2}$ & 25.671791 j\\
  1912. \hline
  1913. $E[N]_{Clet_1}$ & 6.944089 j\\
  1914. \hline
  1915. $E[N]_{Clet_2}$ & 12.063384 j\\
  1916. \hline
  1917. $E[N]_{Cloud_1}$ & 11.492713 j\\
  1918. \hline
  1919. $E[N]_{Cloud_2}$ & 13.608408 j\\
  1920. \hline
  1921. \end{tabular}
  1922. \end{center}\\
  1923.  
  1924. \begin{center}
  1925. \begin{figure}[H]
  1926. \centering
  1927. \includegraphics[width=0.8\textwidth]{immagini/grafici/finite_horizon_pop.png}
  1928. \caption{Finite Horizon Response Time}
  1929. \label{fig:fhpop}
  1930. \end{figure}
  1931. \end{center}
  1932.  
  1933. \subsubsection{Throughput}
  1934.  
  1935. \begin{center}
  1936. \begin{tabular}{||c c c c||}
  1937. \hline
  1938. Misura & Analitico & Sperimentale & Errore \\ [0.5ex]
  1939. \hline\hline
  1940. $X_{global}$ & 12,25 & 12.250871 & 0.0071\% \\
  1941. \hline
  1942. $X_{Clet}$ & 0,97906 & 0.97769 & 0.1399\% \\
  1943. \hline
  1944. $X_{Cloud}$ & 11,27094 & 11.27317 & 0,0197\% \\
  1945. \hline
  1946. $X_{1\_global}$ & 6,00005 & 5.99864 & 0,0023\% \\
  1947. \hline
  1948. $X_{2\_global}$ & 6,24995 & 6.25222 & 0.0363\% \\
  1949. \hline
  1950. $X_{Clet_1}$ & 0,47954 & 0.47808 & 0.0030\% \\
  1951. \hline
  1952. $X_{Clet_2}$ & 0,49952 & 0.49960 & 0.0160\% \\
  1953. \hline
  1954. $X_{Cloud_1}$ & 5,5205 & 5.52055 & 0,0096\% \\
  1955. \hline
  1956. $X_{Cloud_2}$ & 5,75043 & 5.75262 & 0.0380\% \\
  1957. \hline
  1958. \end{tabular}
  1959. \end{center}\\
  1960.  
  1961. \begin{center}
  1962. \begin{tabular}{||c c||}
  1963. \hline
  1964. Misura & Sperimentale\\ [0.5ex]
  1965. \hline\hline
  1966. $X_{global}$ & 12.250878 \\
  1967. \hline
  1968. $X_{Clet}$ & 6.383127 \\
  1969. \hline
  1970. $X_{Cloud}$ & 5.867751 \\
  1971. \hline
  1972. $X_{1\_global}$ & 5.998646 \\
  1973. \hline
  1974. $X_{2\_global}$ & 6.252232 \\
  1975. \hline
  1976. $X_{Clet_1}$ & 3.125872 \\
  1977. \hline
  1978. $X_{Clet_2}$ & 3.257255 \\
  1979. \hline
  1980. $X_{Cloud_1}$ & 2.872775 \\
  1981. \hline
  1982. $X_{Cloud_2}$ & 2.994977 \\
  1983. \hline
  1984. \end{tabular}
  1985. \end{center}\\
  1986.  
  1987.  
  1988. \begin{center}
  1989. \begin{figure}[H]
  1990. \centering
  1991. \includegraphics[width=0.8\textwidth]{immagini/grafici/finite_horizon_th.png}
  1992. \caption{Finite Horizon Throughput}
  1993. \label{fig:fhrt}
  1994. \end{figure}
  1995. \end{center}
  1996.  
  1997.  
  1998. \newpage
  1999. \section{Test}
  2000. \textcolor{red}{INTRODUZIONE}
  2001.  
  2002.  
  2003. \subsection{Ambiente di Test}
  2004. In questa sezione non solo vengono mostrati gli strumenti a livello hardware e software con cui è stata implementata la simulazione, ma anche i risultati ottenuti a livello di performance. In fase di sviluppo è stata prestata molta cura nei riguardi dell'ottimizzazione generale della simulazione, perlopiù in termini di utilizzazione della RAM e tempo reale speso per ottenere risultati in output.\\
  2005. Per prima cosa viene mostrata una breve descrizione delle macchine e dei software utilizzati, successivamente sono riportate le performance ottenute.
  2006.  
  2007. Il codice della simulazione è stato realizzato in Java, utilizzando come IDE di sviluppo \textbf{Jetbrain Intellij} nelle seguenti versioni
  2008. \begin{itemize}
  2009. \item Intellij Ultimate Edition 2018.3.5
  2010. \item Intellij Ultimate Edition 2019.1.3
  2011. \item Intellij Community Edition 2019.1.3
  2012. \end{itemize}
  2013.  
  2014. Le uniche librerie esterne aggiuntive sono \textt{RNGS}, \textt{RVGS} e \textt{RVMS}.
  2015.  
  2016. Per lo sviluppo di grafici è stato utilizzato \textbf{Matlab R2019A}. L'utilizzo di una versione uguale o successiva a questa è necessaria per il run del livescript Matlab, per via della funzione \texttt{readmatrix} introdotta proprio con la release R2019A.
  2017.  
  2018. Per tutto ciò che riguarda la reportistica è stato usato il linguaggio Latex, sfruttando le funzionalità di \textbf{Overleaf} per la condivisione, scrittura simultanea ed esportazione. \\
  2019.  
  2020. Nella seguente tabella vengono mostrati i terminali su cui è stata sviluppata e testata la simulazione.
  2021.  
  2022. \begin{center}
  2023. \begin{tabular}{||c c c c c||}
  2024. \hline
  2025. Fisso/Portatile & Modello & CPU & RAM & OS \\ [0.5ex]
  2026. \hline\hline
  2027. P & HP Spectre & i7 7500U & 8 & W10 \\
  2028. \hline
  2029. P & Acer Aspire V & i7 4500U & 12 & W10 \\
  2030. \hline
  2031. P & Macbook Pro & i7 9th gen. & 16 & macOS Mojave \\
  2032. \hline
  2033. F & Assemblato & i5 7600K & 8 & W10 \\
  2034. \hline
  2035. \end{tabular}
  2036. \end{center}\\
  2037.  
  2038.  
  2039. \subsubsection{Performance della simulazione}
  2040. Una buona simulazione dovrebbe poter girare per un tempo indefinito su qualsiasi terminale. Per questo motivo è stata posta particolare attenzione al consumo in termini di RAM utilizzata.
  2041.  
  2042. Al fine di ottenere questa informazione, viene misurato il valore della RAM utilizzata prima dell'esecuzione e poco prima della terminazione della simulazione. Viene quindi mostrata all'utente la differenza di questi due valori.
  2043.  
  2044. In Figura \ref{fig:ramsim} viene mostrata l'utilizzazione della RAM al crescere del tempo di simulazione. I valori ottenuti riguardano il terminale Acer Aspire V ma gli altri terminali ottengono i medesimi risultati.
  2045.  
  2046. \begin{center}
  2047. \begin{figure}[H]
  2048. \centering
  2049. \includegraphics[width=0.7\textwidth]{immagini/grafici/ram_sim_time.png}
  2050. \caption{Utilizzazione della RAM al variare del tempo di simulazione}
  2051. \label{fig:ramsim}
  2052. \end{figure}
  2053. \end{center}
  2054.  
  2055. Dal grafico si può vedere come il consumo di RAM sia indipendente dal tempo di simulazione e nel 70\% dei casi sia inferiore a 44MB. Lo stesso comportamento si ritrova relazionando questo valore al tempo reale della simulazione, figura \ref{fig:ramreal}. Questo risultato è stato ottenuto ponendo particolare attenzione nel non salvare in memoria liste dalla crescita non controllata.
  2056.  
  2057. \begin{center}
  2058. \begin{figure}[H]
  2059. \centering
  2060. \includegraphics[width=0.7\textwidth]{immagini/grafici/ram_real_time.png}
  2061. \caption{RAM utilizzata al variare del tempo reale}
  2062. \label{fig:ramreal}
  2063. \end{figure}
  2064. \end{center}
  2065.  
  2066. \subsubsection{Tempo di Simulazione vs Real-Time}
  2067. \begin{center}
  2068. \begin{figure}[H]
  2069. \centering
  2070. \includegraphics[width=0.7\textwidth]{immagini/grafici/sim_time_real_time.png}
  2071. \caption{rapporto tra tempo di simulazione e tempo reale}
  2072. \label{fig:realsim}
  2073. \end{figure}
  2074. \end{center}
  2075.  
  2076. Per ripetere le simulazioni che hanno permesso di ottenere i grafici \ref{fig:ramsim}, \ref{fig:ramreal} e \ref{fig:realsim} vedere la tabella \ref{table:ramsim} presente nella appendice \ref{replicare_test}.
  2077.  
  2078.  
  2079.  
  2080. \subsection{Tecniche Utilizzate}
  2081. Brevemente si illustrano gli strumenti utilizzati per poter determinare i seguenti indici prestazionali:
  2082. \begin{itemize}
  2083. \item Tempo medio di risposta: tempo medio che intercorre tra l'ingresso e l'uscita dal sistema di un task
  2084. \item Throughput: numero medio di task completati nell'unità di tempo
  2085. \item Popolazione media: numero medio di richieste in servizio
  2086. \end{itemize}
  2087. Queste metriche sono stati calcolate sia globalmente (a livello di sistema) che per sottosistema, sia per classe.
  2088.  
  2089. \subsubsection{Welford's One-Pass Algorithm}
  2090. Per il calcolo delle medie è stato utilizzato l'algoritmo \textit{one-pass} di Welford, che presenta il vantaggio di impiegare un tempo \textit{O(n)} e di non richiedere una conoscenza preliminare sulla dimensione del campione \textit{n}. Si riporta in seguito l'algoritmo utilizzato:
  2091.  
  2092. \begin{center}
  2093. $\bar{x}_i = \bar{x}_{i-1} + \frac{1}{i} (x_i - \bar{x}_{i-1}) $ \\~\\
  2094. $v_i = v_{i-1} + \frac{i-1}{i} (x_i - \bar{x}_{i-1})^2 $
  2095. \end{center}
  2096.  
  2097. Dove $\bar{x}_i$ e $\frac{v_i}{i}$ sono rispettivamente la media e la varianza di \textit{i} campioni.
  2098. Dunque tramite tale algoritmo è stato possibile aggiornare in modo incrementale gli indici prestazionali.
  2099.  
  2100. \subsubsection{Batch Means e intervallo di confidenza}
  2101. La presenza di un Infinite-Server (il Cloud) fa presumere che il sistema sia stazionario, perciò si è scelto di realizzare statistiche di tipo Infinite-Horizon, note anche come steady-state statistics. \\
  2102. Statistiche di questo tipo sono prodotte simulando il funzionamento del sistema per un tempo effettivamente infinito ed hanno la peculiarit° di non essere influenzate dalle condizioni iniziali, poiché - essendo il tempo pressocché infinito - il sistema “perde memoria” dello stato iniziale. Viene quindi trascurato il bias iniziale.
  2103. Per generare le statistiche steady-state è stata utilizzata la tecnica dei Batch-Means. Questa consente di eliminare il problema del bias iniziale nel calcolo dell'intervallo di stima. Per implementarla è stato seguito l'algoritmo del libro \textit{Discrete-Event Simulation:
  2104. a first course} di L. Leemis e S. Park. L'algoritmo prevede di dividere la sequenza di dati in input $x_1,x_2,.....x_n$ in \textit{k} batch di dimensione \textit{b} e di calcolare per ognuno di essi la media relativa alla statistica di interesse:
  2105.  
  2106. \begin{center}
  2107. $x_1,....x_b,x_{b+1},...,x_{2b},........,x_{n-b},...x_n$\\~\\
  2108. $\bar{x_j} = \frac{1}{b}\sum_{k=1}^b x_{j-1}_{b+i}$\\~\\
  2109. \end{center}
  2110.  
  2111. Poi si calcola la media $\bar{x}$ e la deviazione standard s delle medie dei batch $\bar{x_1},\bar{x_2},...,\bar{x_k}$. Scelto poi un livello di confidenza $1-\alpha$, si calcola il valore critico
  2112. $t^* = idfStudent(k-1,1-\frac{\alpha}{2})$ e si calcolano gli estremi dell'intervallo di confidenza:
  2113.  
  2114. \begin{center}
  2115. $\bar{x}\pm \frac{t^*s}{\sqrt{k-1}} $\\~\\
  2116. \end{center}
  2117.  
  2118. Va notato che la scelta della coppia (b,k) non influisce sul punto di stima ma solo sull'ampiezza dell'intervallo di confidenza.\\
  2119.  
  2120. Perchè questa tecnica elimina il problema del bias iniziale? Perchè le statistiche di ogni batch vengono inizializzate allo stato del sistema nel momento in cui le stime dei batch vengono azzerate. \\
  2121.  
  2122. \'E stata quindi eseguita una long run e sono stati partizionati i dati in input in batch di dimensione prefissata. La coppia di parametri (b,k) è stata scelta in modo tale che k = 64, così che la metodologia sia ancora più valida vista la notevole dimensione b dei singoli batch\footnote{Si ricorda che il parametro k è configurabile nel file \textit{config.properties} settando la variabile NUM\_BATCH}.
  2123.  
  2124.  
  2125. \subsection{Risultati della simulazione}
  2126. In questa sezione vengono illustrati (riportando i relativi grafici) ed analizzati i risultati ottenuti dal simulatore, confrontandoli quando necessario con i risultati analitici ottenuti nel paragrafo Modello analitico e risultati.
  2127. Al fine di rendere più piacevole la lettura, i parametri con cui è stata generata ciascuna run, e quindi a ciascun risultato, sono illustrati nell'appendice \ref{replicare_test}.
  2128.  
  2129. Nel confronto tra i valori sperimentali (ottenuti senza l'utilizzo dei batch con una simulazione molto lunga) e quelli analitici, viene inoltre riportato l'errore percentuale, calcolato come
  2130.  
  2131. \begin{center}
  2132. $Errore_{perc} = \frac{|experimental\_value - accepted\_value|}{accepted\_value}$ x 100\%
  2133. \end{center}
  2134.  
  2135. Successivamente vengono presentati i valori ottenuti utilizzando i Batch, ponendo enfasi sugli intervalli di confidenza.
  2136.  
  2137. \subsubsection{Probabilità di perdita}
  2138. Sono qui mostrati i risultati relativi alla probabilità di perdita del Cloudlet, da cui è poi facilmente calcolabile il flusso effettivamente entrante nel Cloudlet.
  2139.  
  2140. Settando i parametri dell'esperimento come riportato nella tabella \ref{table:standard3_OP} dell'appendice \ref{replicare_test}, si ricavano i seguenti risultati:
  2141.  
  2142. \begin{center}
  2143. \begin{tabular}{||c c c c||}
  2144. \hline
  2145. Misura & Analitico & Sperimentale & Errore \\ [0.5ex]
  2146. \hline\hline
  2147. $P_{Clet}$ & 0.079923 & 0.079981 & 0.0757\% \\
  2148. \hline
  2149. $P_{Cloud}$ & 0.920077 & 0.920019 & 0.0063\% \\
  2150. \hline
  2151. $\lambda_{Clet}$ & 0.979057 tasks/s & 0.979767 tasks/s & 0.7257\% \\
  2152. \hline
  2153. $\lambda_{Cloud}$ & 11.270946 tasks/s & 11.270223 tasks/s & 0.0063\% \\
  2154. \hline
  2155. \end{tabular}
  2156. \end{center}
  2157.  
  2158. Come si vede dalla tabella, l'errore della simulazione in caso di long-run (dalla durata real-time inferiore a 12 secondi) è sempre inferiore all'1\%. Questa lievissima discrepanza può essere dovuta alle approssimazioni poco precise effettuate da Java.
  2159.  
  2160. In aggiunta, si riportano i dati ottenuti nel caso in cui il Cloudlet sia configurato con N=20 serventi:\\
  2161.  
  2162. \begin{center}
  2163. \begin{tabular}{||c c||}
  2164. \label{}
  2165. \hline
  2166. Misura & Sperimentale\\ [0.5ex]
  2167. \hline\hline
  2168. $P_{Clet}$ & 0.521278\\
  2169. \hline
  2170. $P_{Cloud}$ & 0.478723 \\
  2171. \hline
  2172. $\lambda_{Clet}$ & 6.385649 tasks/s \\
  2173. \hline
  2174. $\lambda_{Cloud}$ & 5.864350 tasks/s \\
  2175. \hline
  2176. \end{tabular}
  2177. \end{center}\\
  2178.  
  2179.  
  2180. Dai valori della tabella soprastante, si può apprezzare la diminuzione della probabilità di perdita visto il numero maggiore di serventi a disposizione del Cloudlet per poter processare i task in servizio.\\
  2181. \'E inoltre interessante notare come la probabilità che un Task sia assegnato al Cloud nel caso $N=20$ risenta dell'algoritmo di dispatching utilizzato, come possibile vedere nella Tabella Cambiando solamente le configurazioni relative a questo aspetto si ottengono i risultati della seguente tabella. Questo tipo di confronto risulterà di fondamentale importanza anche nei successivi sotto-paragrafi.
  2182.  
  2183. \begin{center}
  2184. \begin{tabular}{||c c||}
  2185. \hline
  2186. Algoritmo & Probabilità di entrare nel Cloud\\ [0.5ex]
  2187. \hline\hline
  2188. Standard & 0.478722\\
  2189. \hline
  2190. Size Based & 0.368462\\
  2191. \hline
  2192. First-class & 0.520981 \\
  2193. \hline
  2194. Treshold & 0.438809 \\
  2195. \hline
  2196. \end{tabular}
  2197. \end{center}
  2198.  
  2199.  
  2200.  
  2201. \subsubsection{Tempo di risposta}
  2202. Vengono qui illustrati i valori sperimentali riguardanti il tempo di risposta per classe e globale, sia per il sistema nella sua interezza sia per Cloudlet e Cloud.
  2203.  
  2204. Per dimostrare la bontà della simulazione, si riportano i risultati ottenuti tramite una long-run con la configurazione di default della simulazione, riportata nella tabella \ref{table:standard3}.
  2205.  
  2206. \begin{center}
  2207. \begin{tabular}{||c c c c||}
  2208. \hline
  2209. Misura & Analitico & Sperimentale & Errore \\ [0.5ex]
  2210. \hline\hline
  2211. $E[S]_{global}$ & 4.174377 s & 4.174335 s & 0.0010\% \\
  2212. \hline
  2213. $E[S]_{Clet}$ & 2.978080 s & 2.982218 s & 0.1389\% \\
  2214. \hline
  2215. $E[S]_{Cloud}$ & 4.278293 s & 4.277724 s & 0.0133\% \\
  2216. \hline
  2217. $E[S]_{1}$ & 3.857915 s & 3.858477 s & 0.0145\% \\
  2218. \hline
  2219. $E[S]_{2}$ & 4.478180 s & 4.477383 s & 0.0178\% \\
  2220. \hline
  2221. $E[S]_{Clet_1}$ & 2.222222 s & 2.226104 s & 0.1744\% \\
  2222. \hline
  2223. $E[S]_{Clet_2}$ & 3.703704 s & 3.705765 s & 0.0556\% \\
  2224. \hline
  2225. $E[S]_{Cloud_1}$ & 4.000000 s & 3.999842 s & 0.0040\% \\
  2226. \hline
  2227. $E[S]_{Cloud_2}$ & 4.545455 s & 4.544396 s & 0.0233\% \\
  2228. \hline
  2229. \end{tabular}
  2230. \end{center}
  2231.  
  2232.  
  2233. In seguito sono stati eseguiti i test anche per il Cloudlet con N = 20 serventi (ottenuti eseguendo la simulazione con la configurazione riportata nella tabella \ref{table:standard20}), come mostrati qui di seguito:
  2234.  
  2235. \begin{center}
  2236. \begin{tabular}{||c c||}
  2237. \hline
  2238. Misura & Sperimentale \\ [0.5ex]
  2239. \hline\hline
  2240. $E[S]_{global}$ & 3.600439 s\\
  2241. \hline
  2242. $E[S]_{Clet}$ & 2.977774 s\\
  2243. \hline
  2244. $E[S]_{Cloud}$ & 4.277793 s\\
  2245. \hline
  2246. $E[S]_{1}$ & 3.073385 s\\
  2247. \hline
  2248. $E[S]_{2}$ & 4.106117 s\\
  2249. \hline
  2250. $E[S]_{Clet_1}$ & 2.221204 s\\
  2251. \hline
  2252. $E[S]_{Clet_2}$ & 3.703826 s\\
  2253. \hline
  2254. $E[S]_{Cloud_1}$ & 4.000643 s\\
  2255. \hline
  2256. $E[S]_{Cloud_2}$ & 4.543635 s\\
  2257. \hline
  2258. \end{tabular}
  2259. \end{center}\\
  2260.  
  2261.  
  2262. Come si può vedere dai valori, sono rimasti invariati i tempi di risposta del Cloudlet e del Cloud, mentre è diminuito il tempo di risposta globale. Questo è dovuto al fatto che il Cloudlet, in questa configurazione, possiede più serventi e inoltre gode (per costruzione) di un tasso di servizio maggiore per i Task sia di classe 1 sia di classe 2.
  2263.  
  2264.  
  2265. \'E inoltre interessante confrontare la distribuzione esponenziale con quella iper-esponenziale del Cloudlet, inizialmente indicata dalla traccia e poi sostituita con una distribuzione esponenziale per poter effettuare più semplicemente l'analisi ed il testing del sistema. Come si può notare dalla figura \ref{fig:cletPopmr} le due distribuzioni presentano un andamento molto simile, di media uguale. Questo è concorde con il risultato atteso, dal momento in cui le due distribuzioni devono presentare lo stesso valore medio.
  2266.  
  2267. \begin{center}
  2268. \begin{figure}[H]
  2269. \centering
  2270. \includegraphics[width=0.8\textwidth]{immagini/grafici/expo-hyperexpo.png}
  2271. \caption{Exponential vs Hyper-exponential}
  2272. \label{fig:cletPopmr}
  2273. \end{figure}
  2274. \end{center}
  2275.  
  2276. A livello di sistema, si è poi voluto controllare l'effettivo raggiungimento di una condizione stazionaria del sistema, studiandone il comportamento transitorio. A tal fine, è stato preso spunto dall'esempio 8.4.1 presente nel Capitolo 8 del libro \textit{Discrete-evetn simulation: a first course}. Sono quindi state eseguite 20 repliche indipendenti con SEED iniziale \texttt{12345} e sono stati poi incrementati di volta in volta i task da processare, in particolare il numero di task eseguiti sono: 50, 100, 150, 200, 250, 300, 350, 400, 600, 1000, 1500, 2000, 3000, 5000. Come si vede in Figura \ref{fig:fhrt}
  2277.  
  2278. \begin{center}
  2279. \begin{figure}[H]
  2280. \centering
  2281. \includegraphics[width=0.8\textwidth]{immagini/grafici/finite_horizon_rt.png}
  2282. \caption{Finite Horizon Response Time}
  2283. \label{fig:fhrt}
  2284. \end{figure}
  2285. \end{center}
  2286.  
  2287. Come si può vedere dai grafici viene raggiunta la stazionarietà intorno ai 2000 tasks processati.\\
  2288. Avendo dimostrato la stazionarietà del sistema, si è poi proceduto ad effettuare le statistiche \textit{steady state} tramite il metodo dei Batch Means. In seguito si riportano i valori delle medie campionarie relative ai tempi di risposta ed i corrispettivi intervalli di confidenza:
  2289.  
  2290.  
  2291.  
  2292.  
  2293.  
  2294. \textcolor{red}{Un errore così lieve potrebbe essere dovuto alla scelta di un SEED particolarmente fortunato. Al fine di dimostrare come la generazione di numeri casuali non influenzi la correttezza del modello si riportano grafici in figure \ref{fig:rtCloudlet},\ref{fig:rtcloud} e \ref{fig:rtg}, che illustrano l'andamento dei tempi di risposta al variare del SEED iniziale. Per riprodurre l'esperimento è sufficiente seguire la configurazione presente nella tabella \ref{table:multi_run}. I risultati sono i seguenti}:
  2295.  
  2296. \begin{labeling}{Media sperimentale globale:----}
  2297. \item[Media analitica globale: ] 4.174377 j/s
  2298. \item[Media sperimentale globale: ] 4.173972 j/s
  2299. \item[Media analitica Cloudlet: ] 2.978080 j/s
  2300. \item[Media sperimentale Cloudlet: ] 2.978088 j/s
  2301. \item[Media analitica Cloud: ] 4.278293 j/s
  2302. \item[Media sperimentale Cloud: ] 4.277855 j/s
  2303. \end{labeling}
  2304.  
  2305. \begin{center}
  2306. \begin{figure}[H]
  2307. \centering
  2308. \includegraphics[width=0.8\textwidth]{immagini/grafici/global_response_staandard.png}
  2309. \caption{Response Time generale}
  2310. \label{fig:rtg}
  2311. \end{figure}
  2312. \end{center}
  2313.  
  2314. \begin{center}
  2315. \begin{figure}[H]
  2316. \centering
  2317. \includegraphics[width=0.8\textwidth]{immagini/grafici/cloudlet_response_staandard.png}
  2318. \caption{Response Time Cloudlet}
  2319. \label{fig:rtCloudlet}
  2320. \end{figure}
  2321. \end{center}
  2322.  
  2323. \begin{center}
  2324. \begin{figure}[H]
  2325. \centering
  2326. \includegraphics[width=0.8\textwidth]{immagini/grafici/cloud_response_staandard.png}
  2327. \caption{Response Time Cloud}
  2328. \label{fig:rtcloud}
  2329. \end{figure}
  2330. \end{center}
  2331.  
  2332. La simulazione risulta quindi estremamente robusta al variare del SEED iniziale scelto.\\
  2333.  
  2334.  
  2335.  
  2336. In merito agli algoritmi di dispatching, risulta di particolare importanza il confronto tra i diversi tempi di risposta. In figura \ref{table:comparisonDispatch} viene mostrata l'effettiva diminuzione del tempo di risposta globale applicando l'algoritmo \textit{First class in Cloudlet} e adottando un algoritmo con soglia rispetto all'algoritmo di default.
  2337.  
  2338. \begin{center}
  2339. \begin{figure}[H]
  2340. \centering
  2341. \includegraphics[width=0.8\textwidth]{immagini/grafici/comparison.png}
  2342. \caption{Confronto del tempo di risposta globale tra i differenti algoritmi di dispatching}
  2343. \label{fig:rtg}
  2344. \end{figure}
  2345. \end{center}
  2346.  
  2347. Si riportano quindi le medie dei tempi di risposta per i singoli algoritmi, ottenuta con la configurazione presentata nella tabella \ref{table:comparisonDispatch}:
  2348.  
  2349. \begin{center}
  2350. \begin{labeling}{First-Class----}
  2351. \item[Standard: ] 3.600516 j/s
  2352. \item[First-Class: ] 3.426126 j/s
  2353. \item[Treshold: ] 3.373777 j/s
  2354. \end{labeling}
  2355. \end{center}
  2356. \subsubsection{Popolazione media}
  2357. %
  2358. %
  2359. \subsubsection{Throughput}
  2360. \subsubsection{Gli algoritmi a confronto}
  2361.  
  2362. %transitorio per tempo di risposta globale, popolazione e throughput
  2363.  
  2364. %MISSING: grafico con istogrammi
  2365.  
  2366.  
  2367.  
  2368.  
  2369.  
  2370. \subsection{Intervalli di confidenza}
  2371. \textbf{Iterations = 3000000, Algoritmo 1, Batch = true, N = 3}\\
  2372.  
  2373.  
  2374. \begin{center}
  2375. \begin{tabular}{||c c c c||}
  2376. \hline
  2377. Misura & Analitico & Sperimentale & Intervallo di confidenza [0.5ex]
  2378. \hline
  2379. $E[N]_{global}$ & 51.136112 j & 51.133165 j & \pm 0.675516
  2380. \hline
  2381. $E[N]_{Clet}$ & 2.915702 j & 2.915805 j & \pm 0.002982
  2382. \hline
  2383. $E[N]_{Cloud}$ & 48.220410 j & 48.217359 j & \pm 0.674481
  2384. \hline
  2385. $E[N]_{1}$ & 23.147490 j & 23.135246 j & \pm 0.467684
  2386. \hline
  2387. $E[N]_{2}$ & 27.988622 j & 27.997919 j & \pm 0.510519
  2388. \hline
  2389. $E[N]_{Clet\_1}$ & 1.065637 j & 1.064221 j & \pm 0.077448
  2390. \hline
  2391. $E[N]_{Clet\_2}$ & 1.850065 j & 1.851584 j & \pm 0.078621
  2392. \hline
  2393. $E[N]_{Cloud\_1}$ & 22.081853 j & 22.071024 j & \pm 0.450362
  2394. \hline
  2395. $E[N]_{Cloud\_2}$ & 26.138557 j & 26.146335 j & \pm 0.479542
  2396. \hline
  2397. \end{tabular}
  2398. \end{center}
  2399.  
  2400.  
  2401.  
  2402. \begin{center}
  2403. \begin{tabular}{|c c|}
  2404. \hline
  2405. Misura & Sperimentale
  2406. \hline
  2407. $X_{glob}$ & 12.266818 \pm 0.031244
  2408. \hline
  2409. $X_{clet}$ & 0.984746 \pm 0.0075365
  2410. \hline
  2411. $X_{cloud}$ & 11.282072 \pm 0.025595
  2412. \hline
  2413. \end{tabular}
  2414. \end{center}
  2415.  
  2416.  
  2417. \newline
  2418. \textbf{Algoritmo 2, Iterations = 3000000, Operations_enabled = true, N = 3}
  2419. \begin{center}
  2420. \begin{tabular}{||c c c c||}
  2421. \hline
  2422. Misura & Analitico & Sperimentale & Intervallo di confidenza [0.5ex]
  2423. \hline\hline
  2424. $E[N]_{global}$ & 51.136112 j & 51.028552 j & \pm 0.664834
  2425. \hline
  2426. $E[N]_{Clet}$ & 2.488910000 j & 2.915805 j & \pm 0.010118
  2427. \hline
  2428. $E[N]_{Cloud}$ & 48.220410 j & 48.539642 j & \pm 0.662515
  2429. \hline
  2430. $E[N]_{1}$ & 23.147490 j & 22.893755 j & \pm 0.472253
  2431. \hline
  2432. $E[N]_{2}$ & 27.988622 j & 28.134797 j & \pm 0.478493
  2433. \hline
  2434. $E[N]_{Clet_1}$ & 1.065637 j & 1.380699 j & \pm 0.026945
  2435. \hline
  2436. $E[N]_{Clet_2}$ & 1.850065 j & 1.108211 j & \pm 0.027674
  2437. \hline
  2438. $E[N]_{Cloud_1}$ & 22.081853 j & 21.513056 j & \pm 0.466632
  2439. \hline
  2440. $E[N]_{Cloud_2}$ & 26.138557 j & 27.026586 j & \pm 0.475047
  2441. \hline
  2442. \end{tabular}
  2443. \end{center}
  2444.  
  2445.  
  2446. \begin{center}
  2447. \textbf{Tempi di risposta}
  2448. \begin{tabular}{||c c c||}
  2449. \hline
  2450. Misura & Analitico & Sperimentale \\ [0.5ex]
  2451. \hline\hline
  2452. $E[S]_{global}$ & 4.174377 s & 4.165065 s\\
  2453. \hline
  2454. $E[S]_{Clet}$ & 2.978080 s & 0.959334 s\\
  2455. \hline
  2456. $E[S]_{Cloud}$ & 4.278293 s & 5.026268 s\\
  2457. \hline
  2458. $E[S]_{1}$ & 3.857915 s & 3.817823 s \\
  2459. \hline
  2460. $E[S]_{2}$ & 4.478180 s & 4.497999 s \\
  2461. \hline
  2462. $E[S]_{Clet_1}$ & 2.222222 s & 0.928900 s\\
  2463. \hline
  2464. $E[S]_{Clet_2}$ & 3.703704 s & 1.000162 s\\
  2465. \hline
  2466. $E[S]_{Cloud_1}$ & 4.000000 s & 4.769828s\\
  2467. \hline
  2468. $E[S]_{Cloud_2}$ & 4.545455 s & 5.251011 s \\
  2469. \hline
  2470. \end{tabular}
  2471. \end{center}
  2472.  
  2473. \begin{center}
  2474. \begin{tabular}{|c c|}
  2475. \hline Misura & Sperimentale \\
  2476. \hline
  2477. $X_{glob}$ & 12.2668099 \pm 0.031252\\
  2478. \hline
  2479. $X_{clet}$ & 2.596327 \pm 0.005576\\
  2480. \hline
  2481. $X_{cloud}$ & 9.670482 \pm 0.028742\\
  2482. \hline
  2483. \end{tabular}
  2484. \end{center}
  2485.  
  2486.  
  2487. \textbf{Algoritmo 3, N = 3000000}
  2488. \begin{center}
  2489. \begin{tabular}{||c c c c||}
  2490. \hline
  2491. Misura & Analitico & Sperimentale & Intervallo di confidenza \\ [0.5ex]
  2492. \hline\hline
  2493. $E[N]_{global}$ & 51.136112 j & 50.175619 & \pm 0.662415 \\
  2494. \hline
  2495. $E[N]_{Clet}$ & 2.488910000 j & 2.762124 & \pm 0.0112929 \\
  2496. \hline
  2497. $E[N]_{Cloud}$ & 48.220410 j & 47.413495& \pm 0.658418\\
  2498. \hline
  2499. $E[N]_{1}$ & 23.147490 j & 21.789066 & \pm 0.470330\\
  2500. \hline
  2501. $E[N]_{2}$ & 27.988622 j & 28.386552 & \pm 0.480845 \\
  2502. \hline
  2503. $E[N]_{Clet_1}$ & 1.065637 j & 2.762124& \pm 0.011293\\
  2504. \hline
  2505. $E[N]_{Clet_2}$ & 1.850065 j & 0.0 & 0.0 \\
  2506. \hline
  2507. $E[N]_{Cloud_1}$ & 22.081853 j & 19.026942 & \pm 0.464261\\
  2508. \hline
  2509. $E[N]_{Cloud_2}$ & 26.138557 j & 28.386552 & \pm 0.480845\\
  2510. \hline
  2511. \end{tabular}
  2512. \end{center}\\
  2513.  
  2514. \textbf{Tempi di risposta}
  2515. \begin{center}
  2516. \begin{tabular}{||c c c||}
  2517. \hline
  2518. Misura & Analitico & Sperimentale \\ [0.5ex]
  2519. \hline\hline
  2520. $E[S]_{global}$ & 4.174377 s & 4.095425 s\\
  2521. \hline
  2522. $E[S]_{Clet}$ & 2.978080 s & 2.226081 s\\
  2523. \hline
  2524. $E[S]_{Cloud}$ & 4.278293 s & 4.306071 s\\
  2525. \hline
  2526. $E[S]_{1}$ & 3.857915 s & 3.633552 s \\
  2527. \hline
  2528. $E[S]_{2}$ & 4.478180 s & 4.538266 s \\
  2529. \hline
  2530. $E[S]_{Clet_1}$ & 2.222222 s & 2.226081 s\\
  2531. \hline
  2532. $E[S]_{Clet_2}$ & 3.703704 s & 0.0 s\\
  2533. \hline
  2534. $E[S]_{Cloud_1}$ & 4.000000 s & 4.000722s\\
  2535. \hline
  2536. $E[S]_{Cloud_2}$ & 4.545455 s & 4.538263 s \\
  2537. \hline
  2538. \end{tabular}
  2539. \end{center}
  2540.  
  2541. \begin{center}
  2542. \begin{tabular}{|c c|}
  2543. \hline Misura & Sperimentale
  2544. \hline
  2545. $X_{glob}$ & 12.266836 \pm 0.031247\\
  2546. \hline
  2547. $X_{clet}$ & 1.237997 \pm 0.016677\\
  2548. \hline
  2549. $X_{cloud}$ & 11.0288398 \pm 0.038428\\
  2550. \hline
  2551. \end{tabular}
  2552. \end{center}
  2553.  
  2554.  
  2555. \textbf{Algoritmo 4, Threshold = 14, N = 3000000. Server = 20}
  2556. \begin{center}
  2557. \begin{tabular}{||c c c c||}
  2558. \hline
  2559. Misura & Analitico & Sperimentale & Intervallo di confidenza \\ [0.5ex]
  2560. \hline\hline
  2561. $E[N]_{global}$ & 51.136112 j & 39.904198 & \pm 0.520649 \\
  2562. \hline
  2563. $E[N]_{Clet}$ & 2.762124 & 16.322569 & \pm 0.063066 \\
  2564. \hline
  2565. $E[N]_{Cloud}$ & 48.220410 j & 23.581629 & \pm 0.490581 \\
  2566. \hline
  2567. $E[N]_{1}$ & 23.147490 j & 12.406721 & \pm 0.215987 \\
  2568. \hline
  2569. $E[N]_{2}$ & 27.988622 j & 27.497477 & \pm 0.476256 \\
  2570. \hline
  2571. $E[N]_{Clet_1}$ & 1.065637 j & 12.406721 & \pm 0.215987 \\
  2572. \hline
  2573. $E[N]_{Clet_2}$ & 1.850065 j & 3.915848 & \pm 0.172357 \\
  2574. \hline
  2575. $E[N]_{Cloud_1}$ & 22.081853 j & 0.0 & 0.0 \\
  2576. \hline
  2577. $E[N]_{Cloud_2}$ & 26.138557 j & 23.581629 & \pm 0.490581\\
  2578. \hline
  2579. \end{tabular}
  2580. \end{center}\\
  2581.  
  2582. \textbf{Tempi di risposta}
  2583. \begin{center}
  2584. \begin{tabular}{||c c c||}
  2585. \hline
  2586. Misura & Analitico & Sperimentale \\ [0.5ex]
  2587. \hline\hline
  2588. $E[S]_{global}$ & 4.174377 s & 3.371953 s\\
  2589. \hline
  2590. $E[S]_{Clet}$ & 2.978080 s & 2.458442 s\\
  2591. \hline
  2592. $E[S]_{Cloud}$ & 4.278293 s & 4.539726 s\\
  2593. \hline
  2594. $E[S]_{1}$ & 3.857915 s & 2.223915 s \\
  2595. \hline
  2596. $E[S]_{2}$ & 4.478180 s & 4.395970 s \\
  2597. \hline
  2598. $E[S]_{Clet_1}$ & 2.222222 s & 2.223914 s\\
  2599. \hline
  2600. $E[S]_{Clet_2}$ & 3.703704 s & 3.692009 s\\
  2601. \hline
  2602. $E[S]_{Cloud_1}$ & 4.000000 s & 0.00s\\
  2603. \hline
  2604. $E[S]_{Cloud_2}$ & 4.545455 s & 4.539726 s \\
  2605. \hline
  2606. \end{tabular}
  2607. \end{center}
  2608.  
  2609. \begin{center}
  2610. \begin{tabular}{|c c|}
  2611. \hline Misura & Sperimentale \\
  2612. \hline
  2613. $X_{glob}$ & 12.266837 \pm 0.031247\\
  2614. \hline
  2615. $X_{clet}$ & 1.237997 \pm 0.016677\\
  2616. \hline
  2617. $X_{cloud}$ & 11.028840 \pm 0.038428\\
  2618. \hline
  2619. \end{tabular}
  2620. \end{center}
  2621.  
  2622.  
  2623. \begin{center}
  2624. \begin{tabular}{|c c|}
  2625. \hline Misura & Sperimentale \\
  2626. \hline
  2627. $X_{glob}$ & 11.846496 \pm 0.024971\\
  2628. \hline
  2629. $X_{clet}$ & 6.638604 \pm 0.013780\\
  2630. \hline
  2631. $X_{cloud}$ & 5.207892 \pm 0.025405\\
  2632. \hline
  2633. \end{tabular}
  2634. \end{center}
  2635.  
  2636. \newpage
  2637. \subsection{Sviluppi futuri}\label{sviluppi_futuri}
  2638. Nonostante la trattazione abbia risposto alle richieste presenti nella traccia del progetto, sono molte le aree di interesse da poter ancora approfondire. In questa sezione verranno forniti degli spunti per implementazioni future.\\
  2639.  
  2640. Un aspetto interessante da approfondire è relativo allo studio dell'utilizzazione dei singoli serventi. Nella simulazione descritta finora ogni task in arrivo viene inviato al primo servente libero, dove l'ordinamento è condizionato dall'ID di quest'ultimo. La conseguenza è sì l'ottenimento di risultati corretti ma uno squilibrio nella distribuzione del carico di lavoro. Questo comportamento si può notare su soli tre server, come illustrato in figura \ref{fig:server3}.
  2641.  
  2642. \begin{center}
  2643. \begin{figure}[H]
  2644. \centering
  2645. \includegraphics[width=0.7\textwidth]{immagini/grafici/serverStatus3.png}
  2646. \caption{Utilizzazione per 3 server}
  2647. \label{fig:server3}
  2648. \end{figure}
  2649. \end{center}
  2650.  
  2651. La non equa distribuzione del carico nei vari serventi è ancora più evidente all'aumentare del numero di server. In figura \ref{fig:server20} si può notare come il livello di utilizzazione cali drasticamente per i server con ID più alto: i server con ID piccoli (per costruzione) vengono selezionati per primi quando liberi. Altre tecniche di scheduling possono certamente mitigare questa situazione per cui sarebbe interessante - in una versione futura - sperimentare nuovi algoritmi di assegnazione dei task ai serventi dei sottosistemi e osservare come varia l'utilizzazione.
  2652.  
  2653. \begin{center}
  2654. \begin{figure}[H]
  2655. \centering
  2656. \includegraphics[width=0.7\textwidth]{immagini/grafici/serverStatus20.png}
  2657. \caption{Utilizzazione per 20 server}
  2658. \label{fig:server20}
  2659. \end{figure}
  2660. \end{center}
  2661.  
  2662. Un ulteriore sviluppo futuro riguarda gli algoritmi di dispatching. In questo progetto non è mai stata utilizzata la prelazione, sarebbe quindi interessante introdurla. Dalla teoria sono infatti noti i vantaggi di quest'ultima in termini di riduzione dei tempi di risposta globali.
  2663.  
  2664. Infine si potrebbe creare una Demo di simulazione del sistema tramite il software di simulazione Arena. Questo infatti consente all'utente di costruire un modello sperimentale posizionando moduli (di processi o logici), uniti tramite connettori che servono per specificare il flusso delle entità.
  2665. \textcolor{red}{FAR PARTIRE IL MULTIRUN DALLO STESSO STREAM INVECE CHE DA SEED DIVERSO, IN MODO DA EVITARE SOVRAPPOSIZIONI}
  2666. \newpage
  2667. \begin{appendices}
  2668. \section{Replicare i test} \label{replicare_test}
  2669.  
  2670. Vengono qui riportate le informazioni necessarie alla corretta replicazione dei test presentati all'interno della relazione.
  2671.  
  2672. Nelle tabelle presentate le colonne seguono la seguente corrispondenza:
  2673. \begin{labeling}{hyper----}
  2674. \item[seed ] SEED
  2675. \item[algo. ] ALGORITHM
  2676. \item[hyper. ] HYPEREXPO\_ENABLED
  2677. \item[ops. ] OPERATIONS\_ENABLED
  2678. \item[N ] N
  2679. \item[batch ] BATCH
  2680. \item[m.r. ] MULTI\_RUN
  2681. \item[run ] RUNS
  2682. \item[iter. ] ITERATIONS
  2683. \end{labeling}
  2684.  
  2685. I valori corrispondenti ai tassi di arrivo e servizio non sono riportati in quanto assumono sempre i valori richiesti dalla traccia.
  2686.  
  2687. \begin{table}[h!]
  2688. \centering
  2689. \begin{tabular}{|c c c c c c c c c|}
  2690. \hline
  2691. seed & algo. & hyper. & ops. & N & batch & m.r. & run & iter. \\ [0.5ex]
  2692. \hline\hline
  2693. 12345 & 1 & FALSE & FALSE & 3 & TRUE & FALSE & - & 10000000\\
  2694. \hline
  2695. \end{tabular}
  2696. \caption{simulazione standard con N=3}
  2697. \label{table:standard3}
  2698. \end{table}
  2699.  
  2700. \begin{table}[h!]
  2701. \centering
  2702. \begin{tabular}{|c c c c c c c c c|}
  2703. \hline
  2704. seed & algo. & hyper. & ops. & N & batch & m.r. & run & iter. \\ [0.5ex]
  2705. \hline\hline
  2706. 12345 & 1 & FALSE & TRUE & 3 & TRUE & FALSE & - & 10000000\\
  2707. \hline
  2708. \end{tabular}
  2709. \caption{simulazione standard con N=3 e OPERATIONS}
  2710. \label{table:standard3_OP}
  2711. \end{table}
  2712.  
  2713. \begin{table}[h!]
  2714. \centering
  2715. \begin{tabular}{|c c c c c c c c c|}
  2716. \hline
  2717. seed & algo. & hyper. & ops. & N & batch & m.r. & run & iter. \\ [0.5ex]
  2718. \hline\hline
  2719. 12345 & 1 & FALSE & FALSE & 20 & TRUE & FALSE & - & 10000000\\
  2720. \hline
  2721. \end{tabular}
  2722. \caption{simulazione standard con N=20}
  2723. \label{table:standard20}
  2724. \end{table}
  2725.  
  2726. \begin{table}[h!]
  2727. \centering
  2728. \begin{tabular}{|c c c c c c c c c|}
  2729. \hline
  2730. seed & algo. & hyper. & ops. & N & batch & m.r. & run & iter. \\ [0.5ex]
  2731. \hline\hline
  2732. 12345 & 1 & FALSE & TRUE & 3 & TRUE & TRUE & 30 & 1000000\\
  2733. \hline
  2734. 12345 & 3 & FALSE & TRUE & 3 & TRUE & TRUE & 30 & 1000000\\
  2735. \hline
  2736. 12345 & 4(14) & FALSE & TRUE & 3 & TRUE & TRUE & 30 & 1000000\\
  2737. \hline
  2738. \end{tabular}
  2739. \caption{Comparazione tra algoritmi di dispatching}
  2740. \label{table:comparisonDispatch}
  2741. \end{table}
  2742.  
  2743.  
  2744. \begin{table}[h!]
  2745. \centering
  2746. \begin{tabular}{|c c c c c c c c c|}
  2747. \hline
  2748. seed & algo. & hyper. & ops. & N & batch & m.r. & run & iter. \\ [0.5ex]
  2749. \hline\hline
  2750. 12345 & 1 & FALSE & FALSE & 3 & FALSE & TRUE & 50 & 10000000\\
  2751. \hline
  2752. \end{tabular}
  2753. \caption{simulazione con Multi-Run}
  2754. \label{table:multi_run}
  2755. \end{table}
  2756.  
  2757. \begin{table}[h!]
  2758. \centering
  2759. \begin{tabular}{|c c c c c c c c c|}
  2760. \hline
  2761. seed & algo. & hyper. & ops. & N & batch & m.r. & run & iter. \\ [0.5ex]
  2762. \hline\hline
  2763. 12345 & 1 & FALSE & TRUE & 3 & TRUE & TRUE & 30 & 1000000\\
  2764. \hline
  2765. \end{tabular}
  2766. \caption{simulazione veloce con Multi-Run}
  2767. \label{table:fastMR}
  2768. \end{table}
  2769.  
  2770. \begin{table}[h!]
  2771. \centering
  2772. \begin{tabular}{|c c c c c c c c c|}
  2773. \hline
  2774. seed & algo. & hyper. & ops. & N & batch & m.r. & run & iter. \\ [0.5ex]
  2775. \hline\hline
  2776. 987654321 & 1 & FALSE & FALSE & 3 & TRUE & FALSE & - & *\\
  2777. \hline
  2778. \end{tabular}
  2779. \caption{simulazione per performance del sistema}
  2780. \label{table:ramsim}
  2781. \end{table}
  2782.  
  2783. \noindent *\\
  2784. La simulazione è stata eseguita con molteplici volte con le seguenti iterazioni:
  2785.  
  2786. \begin{multicols}{3}
  2787. \begin{itemize}
  2788. \item 100000
  2789. \item 200000
  2790. \item 300000
  2791. \item 400000
  2792. \item 500000
  2793. \item 600000
  2794. \item 700000
  2795. \item 800000
  2796. \item 900000
  2797. \item 1000000
  2798. \item 1100000
  2799. \item 1200000
  2800. \item 1300000
  2801. \item 1400000
  2802. \item 1500000
  2803. \item 1600000
  2804. \item 1700000
  2805. \item 1800000
  2806. \item 1900000
  2807. \item 2000000
  2808. \item 3000000
  2809. \item 4000000
  2810. \item 5000000
  2811. \item 6000000
  2812. \item 7000000
  2813. \item 8000000
  2814. \item 9000000
  2815. \item 10000000
  2816. \item 11000000
  2817. \item 12000000
  2818. \item 13000000
  2819. \item 14000000
  2820. \item 15000000
  2821. \item 16000000
  2822. \item 17000000
  2823. \item 18000000
  2824. \end{itemize}
  2825. \end{multicols}
  2826.  
  2827.  
  2828. \end{appendices}
  2829.  
  2830.  
  2831. \newpage
  2832. \begin{thebibliography}{9}
  2833. \bibitem{spectrum}
  2834. %n. cognome, n2. cognome.
  2835. %\textit{titolo paper}
  2836. %editore, anno
  2837. %disponibile al link
  2838. %\texttt{link}
  2839. H. Takagi, B. H. Walke.
  2840. \textit{Spectrum Requirement Planning in Wireless Communications: Model and Metholody for IMT-Advanced}
  2841. John Wiley, 2008
  2842.  
  2843. \bibitem{verify}
  2844. R. G. Sargent.
  2845. \textit{Verifying and Validating Simulation Models}
  2846. Syracuse University (NY), 1994
  2847.  
  2848. \bibitem{book1}
  2849. L.Leemis, S. Park.
  2850. \textit{Discrete-Event simulation: a first course}
  2851. The college of William and Mary (Williamsburg), 1994
  2852.  
  2853. \bibitem{verify}
  2854. R. G. Sargent.
  2855. \textit{Verifying and Validating Simulation Models}
  2856. Syracuse University (NY), 1994
  2857.  
  2858. \bibitem{hyperexpo}
  2859. P.J. Smith, A. Firag, P.A. Dmochowski, M. Shafi.
  2860. \textit{Analysis of the M/M/N/N Queue with two types of arrival process: Applications to future mobile raadio systems}
  2861. Yuri Sotskov, 2011
  2862.  
  2863. \end{thebibliography}
  2864.  
  2865.  
  2866. \newpage
  2867. \section{TODO}
  2868.  
  2869. \begin{enumerate}
  2870. \item Modello delle specifiche da integrare e correggere
  2871. \item Modificare Figura 6 (ordine crescente)
  2872. \item Modello computazionale run
  2873. \item Analisi (a parole) algoritmo threshold
  2874. \item Tutti i test!!!!!!
  2875. \item Rileggere tutto una volta
  2876. \item PULIRE IL CODICE! TOGLIERE LE VARIANZE, COMMENTARE ECC.
  2877. \end{enumerate}
  2878.  
  2879.  
  2880. SCALETTA CAPITOLI:
  2881. \begin{enumerate}
  2882. \item Introduzione
  2883. \item Modello concettuale [Risultati analitici]
  2884. \item Modello delle specifiche
  2885. \item Modello computazionale
  2886. \item Verifica
  2887. \item Validazione
  2888. \item Test [I]
  2889. \item Sviluppi futuri
  2890.  
  2891. \end{enumerate}
  2892.  
  2893.  
  2894. \end{document}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement