<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://so.v2.cs.unibo.it/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Francesco97</id>
	<title>Sistemi Operativi - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://so.v2.cs.unibo.it/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Francesco97"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/Francesco97"/>
	<updated>2026-05-10T02:50:43Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Lezioni_Anno_Accademico_2017/18_II_semestre&amp;diff=2161</id>
		<title>Lezioni Anno Accademico 2017/18 II semestre</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Lezioni_Anno_Accademico_2017/18_II_semestre&amp;diff=2161"/>
		<updated>2018-03-08T15:16:00Z</updated>

		<summary type="html">&lt;p&gt;Francesco97: /* Lezione del 7 marzo 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Lezione del 28 febbraio 2018 ==&lt;br /&gt;
Inizia oggi la seconda parte del corso di Sistemi Operativi che si terrà dal 28/02/18 al 25/05/18.&amp;lt;br&amp;gt;&lt;br /&gt;
Le lezioni si svolgeranno, il mercoledì e il giovedì, in aula E1. Il venerdì invece ci sposteremo in M1.&amp;lt;br&amp;gt;&lt;br /&gt;
La suddivisione degli argomenti trattati sarà: '''mercoledì''' teoria, '''giovedì''' tendenzialmente parte progettuale (potrebbe iniziare con un po' di teoria) e '''venerdì''', data la scarsa dotazione dell'aula assegnataci, verranno svolti esercizi scritti in preparazione all'esame.&lt;br /&gt;
&lt;br /&gt;
Nel corso della lezione ci siamo chiesti, riprendendo un po' il filo logico delle lezioni dello scorso semestre, quali siano i servizi che ci aspettiamo da un sistema operativo.&amp;lt;br&amp;gt;&lt;br /&gt;
Questa volta, tuttavia, non li analizzeremo dal punto di vista dell'utilizzatore, ma da un punto di vista interno al sistema stesso.&amp;lt;br&amp;gt;&lt;br /&gt;
I servizi elencati sono stati:&lt;br /&gt;
* Scheduling (Gestione CPU)&lt;br /&gt;
* Gestione dei processi&lt;br /&gt;
* Gestione della memoria primaria&lt;br /&gt;
* Gestione dei device di I/O&lt;br /&gt;
* Gestione della memoria secondaria&lt;br /&gt;
* Filesystem&lt;br /&gt;
* Networking&lt;br /&gt;
* Protezione&lt;br /&gt;
* Shell&lt;br /&gt;
&lt;br /&gt;
Come in tutta l'informatica spesso succede, la complessità di questi servizi viene gestita tramite la creazione di livelli di astrazione. &amp;lt;br&amp;gt;&lt;br /&gt;
Il livello zero di astrazione, quello più basso, sarà l''''hardware''' che noi dovremo considerare come un linguaggio (l'ISA del processore).&amp;lt;br&amp;gt;&lt;br /&gt;
Seguito poi da due blocchi:&lt;br /&gt;
* '''Kernel'''&lt;br /&gt;
* '''Utente'''&lt;br /&gt;
&lt;br /&gt;
Cosa va incluso nel kernel di un S.O.? Cosa nella parte utente? Meglio massimizzare o minimizzare le operazioni nello livello kernel?&amp;lt;br&amp;gt; '''KERNEL MONOLITICO''' O '''MICRO-KERNEL'''?&lt;br /&gt;
&lt;br /&gt;
I kernel monolitici (tipo Linux) hanno il vantaggio di essere leggermente più performanti, mentre i microkernel (che presentano più livelli di astrazione) sono molto più flessibili e facili da manutenere.&lt;br /&gt;
Ad esempio, nei microkernel un bug non obbliga necessariamente a riavviare la macchina perché è possibile riavviare il singolo &amp;quot;modulo&amp;quot; che presenta l'errore.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 1 marzo 2018 ==&lt;br /&gt;
La lezione tace come concordato con gli studenti.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 2 marzo 2018 ==&lt;br /&gt;
La lezione tace causa chiusura dell'intero Ateneo per condizioni climatiche avverse.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 7 marzo 2018 ==&lt;br /&gt;
Tutto incomincia dal boot, ossia, è nella fase di boot che si carica il kernel. Una volta caricato, il kernel ha davanti una gradissima diversità di modelli hardware, ma come utilizzare tutti questi dispositivi hardware? Una prima soluzione sarebbe quella di includere nel kernel tutti i relativi device driver, tuttavia il kernel diventerbbe davvero corposo, a meno che non si crei un kernel ad hoc per una specifica macchina. Un'altra soluzione (quella comunemente adottata) utilizza i moduli. I moduli vengono caricati dal kernel all'occorrenza senza essere inseriti direttamente in esso (non è quindi necessaria la ricompilazione).&lt;br /&gt;
Tuttavia con quest'ultima soluzione si viene a creare un dilemma, ovvero:&amp;lt;br&amp;gt;&lt;br /&gt;
Chi carica i moduli? Il kernel.&amp;lt;br&amp;gt;&lt;br /&gt;
Chi carica il kernel? Il boot tramite moduli.&lt;br /&gt;
&lt;br /&gt;
In verità non esiste solo il kernel ma anche un filesystem che contiene i moduli chiamato &amp;quot;init.rd&amp;quot; (inutile se il kernel è configurato per una specifica macchina).&lt;br /&gt;
Arrivati a questo punto ci si chiede: come si compila un kernel? Prima di tutto occorrono i sorgenti (quelli di linux sono reperibili su https://www.kernel.org). Una volta scaricati, si deve configurare il file “.config” che sostanzialmente descrive le specifiche del kernel. Questo file lo si può configurare a mano o tramite il “menuconfig” che dovrà essere prima di tutto opportunatamente compilato. All'interno del menuconfig tra le altre cose c'è una lista di tutti i device driver supportati e possono essere spuntati con:  * (driver inserito nel kernel) o M (creazione del relativo modulo). Una volta configurato il “.config” non resta che compilare il kernel per la macchina ospite o per una specifica architettura. Ad esempio:&lt;br /&gt;
&lt;br /&gt;
wget link_of_kernel_source #scarica i sorgenti&amp;lt;br&amp;gt;&lt;br /&gt;
tar xf source_compressed_file # decomprime i relativi sorgenti, in questo caso dal file.tar.xz&amp;lt;br&amp;gt;&lt;br /&gt;
cd linux #entra nella directory dei sorgenti&amp;lt;br&amp;gt;&lt;br /&gt;
(Di regola esiste già un .config standard ma per configurarlo)&amp;lt;br&amp;gt;&lt;br /&gt;
make menuconfig&amp;lt;br&amp;gt;&lt;br /&gt;
make #compila il kernel per la macchina ospite&amp;lt;br&amp;gt;&lt;br /&gt;
(make -arch=armhf, compila secondo l'architettura dei processori armhf)&amp;lt;br&amp;gt;&lt;br /&gt;
( make -j n, compila il kernel per la macchina ospite utilizzando i suoi n-1 core)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una volta compilato l'immagine del kernel si troverà in arch/nome_architettura/boot/bzImage.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ora si ricordi la differenza tra processo e thread: Il processo è l'entità titolare delle risorse, mentre il thread è la componente sequenziale dell'elaborazione.&lt;br /&gt;
Nei sistemi monothread il concetto di thread si sovrappone al concetto di processo ma in linea generale un processo può avere anche più di un thread. Ma quali sono le caratteristiche principali dei processi e dei thread?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
       &amp;lt;th&amp;gt;Processo (PCB)&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Thread (TCB)&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
       &amp;lt;th&amp;gt;ID (self, parent,child etc)&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
       &amp;lt;th&amp;gt;Info sulla memoria (puntatore alla tabella dei segmenti)&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Stato del processore&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
       &amp;lt;th&amp;gt;File aperti&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Stato: Ready, Running,Block&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
       &amp;lt;th&amp;gt;Ownership&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Puntatori&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
       &amp;lt;th&amp;gt;Interprocess comunication&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;     &lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
       &amp;lt;th&amp;gt;Informazioni sull'accounting &amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;                          &lt;br /&gt;
&lt;br /&gt;
Modo Kernel e Modo User&amp;lt;br&amp;gt;&lt;br /&gt;
Si definisce Mode Switch il passaggio da Kernel Mode a User Mode e viceversa (esiste tale differenza per motivi di sicurrenzza). Attenzione però a non confondere la kernel mode con i permessi di root (root è l'utente con più permessi in assoluto ma è comunque gestito in user mode).&lt;br /&gt;
Si definisce Context Switch il passaggio di processi. Ad esempio un processo A in user mode si ferma e passa il controllo al trap che tramite lo scheduler chiama un altro processo.&lt;br /&gt;
Da qui si capische che è lo scheduler a decidere il prossimo processo da mandare avanti (tramite la Ready Queue). Un tipico scheduler è lo scheduler FIFO non preemptive (ossia è il processo in esecuzione a decidere quando fermarsi e far proseguire l'esecuzione degli altri processi) per sistemi batch.&lt;br /&gt;
I thread posso essere creati sia in modo kernel che in modo user.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 8 marzo 2018 ==&lt;br /&gt;
== Lezione del 9 marzo 2018 ==&lt;br /&gt;
== Lezione del 14 marzo 2018 ==&lt;br /&gt;
== Lezione del 15 marzo 2018 ==&lt;br /&gt;
== Lezione del 16 marzo 2018 ==&lt;br /&gt;
== Lezione del 21 marzo 2018 ==&lt;br /&gt;
== Lezione del 22 marzo 2018 ==&lt;br /&gt;
== Lezione del 23 marzo 2018 ==&lt;br /&gt;
== Lezione del 28 marzo 2018 ==&lt;br /&gt;
== Lezione del 29 marzo 2018 ==&lt;br /&gt;
== Lezione del 30 marzo 2018 ==&lt;/div&gt;</summary>
		<author><name>Francesco97</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Lezioni_Anno_Accademico_2017/18_II_semestre&amp;diff=2155</id>
		<title>Lezioni Anno Accademico 2017/18 II semestre</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Lezioni_Anno_Accademico_2017/18_II_semestre&amp;diff=2155"/>
		<updated>2018-03-08T11:14:14Z</updated>

		<summary type="html">&lt;p&gt;Francesco97: /* Lezione del 7 marzo 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Lezione del 28 febbraio 2018 ==&lt;br /&gt;
Inizia oggi la seconda parte del corso di Sistemi Operativi che si terrà dal 28/02/18 al 25/05/18.&amp;lt;br&amp;gt;&lt;br /&gt;
Le lezioni si svolgeranno, il mercoledì e il giovedì, in aula E1. Il venerdì invece ci sposteremo in M1.&amp;lt;br&amp;gt;&lt;br /&gt;
La suddivisione degli argomenti trattati sarà: '''mercoledì''' teoria, '''giovedì''' tendenzialmente parte progettuale (potrebbe iniziare con un po' di teoria) e '''venerdì''', data la scarsa dotazione dell'aula assegnataci, verranno svolti esercizi scritti in preparazione all'esame.&lt;br /&gt;
&lt;br /&gt;
Nel corso della lezione ci siamo chiesti, riprendendo un po' il filo logico delle lezioni dello scorso semestre, quali siano i servizi che ci aspettiamo da un sistema operativo.&amp;lt;br&amp;gt;&lt;br /&gt;
Questa volta, tuttavia, non li analizzeremo dal punto di vista dell'utilizzatore, ma da un punto di vista interno al sistema stesso.&amp;lt;br&amp;gt;&lt;br /&gt;
I servizi elencati sono stati:&lt;br /&gt;
* Scheduling (Gestione CPU)&lt;br /&gt;
* Gestione dei processi&lt;br /&gt;
* Gestione della memoria primaria&lt;br /&gt;
* Gestione dei device di I/O&lt;br /&gt;
* Gestione della memoria secondaria&lt;br /&gt;
* Filesystem&lt;br /&gt;
* Networking&lt;br /&gt;
* Protezione&lt;br /&gt;
* Shell&lt;br /&gt;
&lt;br /&gt;
Come in tutta l'informatica spesso succede, la complessità di questi servizi viene gestita tramite la creazione di livelli di astrazione. &amp;lt;br&amp;gt;&lt;br /&gt;
Il livello zero di astrazione, quello più basso, sarà l''''hardware''' che noi dovremo considerare come un linguaggio (l'ISA del processore).&amp;lt;br&amp;gt;&lt;br /&gt;
Seguito poi da due blocchi:&lt;br /&gt;
* '''Kernel'''&lt;br /&gt;
* '''Utente'''&lt;br /&gt;
&lt;br /&gt;
Cosa va incluso nel kernel di un S.O.? Cosa nella parte utente? Meglio massimizzare o minimizzare le operazioni nello livello kernel?&amp;lt;br&amp;gt; '''KERNEL MONOLITICO''' O '''MICRO-KERNEL'''?&lt;br /&gt;
&lt;br /&gt;
I kernel monolitici (tipo Linux) hanno il vantaggio di essere leggermente più performanti, mentre i microkernel (che presentano più livelli di astrazione) sono molto più flessibili e facili da manutenere.&lt;br /&gt;
Ad esempio, nei microkernel un bug non obbliga necessariamente a riavviare la macchina perché è possibile riavviare il singolo &amp;quot;modulo&amp;quot; che presenta l'errore.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 1 marzo 2018 ==&lt;br /&gt;
La lezione tace come concordato con gli studenti.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 2 marzo 2018 ==&lt;br /&gt;
La lezione tace causa chiusura dell'intero Ateneo per condizioni climatiche avverse.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 7 marzo 2018 ==&lt;br /&gt;
Tutto incomincia dal boot (e in principio fu il boot), nello specifico è nella fase di boot che si carica il kernel. Una volta caricato il kernel ha davanti una gradissima diversità di modelli hardware, ma come utilizzare tutti questi dispositivi hardware? Una prima soluzione sarebbe quella di includere nel kernel tutti i relativi device driver, tutta via il kernel diventerbbe davvero corposo (a meno che non si crei un kernel ad hoc per una specifica macchina). Un'altra soluzione (praticamente quella comunemente utilizzata) utilizza i moduli. I moduli vengono caricati dal kernel all'occorrenza senza essere inseriti direttamente in esso (senza ogni volta doverlo ricompilare).&lt;br /&gt;
Tuttavia con quest'ultima soluzione si viene a creare un dilemma, ovvero:&lt;br /&gt;
Chi carica i moduli? [il kernel]&lt;br /&gt;
Chi carica il kernel? [boot tramite moduli]&lt;br /&gt;
In verità non esiste solo il kernel ma anche un filesystem che contiene i moduli chiamato init.rd (diventa inutile se il kernel è configurato per una specifica macchina).&lt;br /&gt;
Arrivati a questo punto ci si chiede come si compila un kernel? Prima di tutto occorrono i sorgenti (es: i sorgenti del kernel linux sono reperibili in www.kernel.org). Una volta scaricato ed entrato nella relativa cartella si deve configurare il file “.config” che sostanzialmente descrive le specifiche del kernel. Questo file lo si può configurare a mano o tramite il “menuconfig” che dovrà essere prima di tutto opportunatamente compilato. All'interno del menuconfig tra le altre cose c'è una lista di tutti i device driver supportati e possono essere spuntati con:  * (driver inserito nel kernel) o M (creazione del relativo modulo). Una volta configurato il “.config” non resta che compilare effettivamente il kernel con la possibilità di compilarlo per la macchina ospite o per una specifica architettura. es:&lt;br /&gt;
&lt;br /&gt;
wget link_of_kernel_source #scarica i sorgenti&lt;br /&gt;
tar xf source_compressed_file # decomprime i relativi sorgenti, in questo caso dal file.tar.xz&lt;br /&gt;
cd linux #entra nella directory dei sorgenti&lt;br /&gt;
#Di regola esiste già un .config standard ma per configurarlo&lt;br /&gt;
make menuconfig&lt;br /&gt;
make #compila il kernel per la macchina ospite&lt;br /&gt;
# make -arch=armhf, compila seconda l'architettura dei processori armhf&lt;br /&gt;
#make -j n , compila il kernel per la macchina ospite utilizzando i suoi n-1 core.&lt;br /&gt;
&lt;br /&gt;
Una volta compilato l'immagine del kernel si troverà in arch/nome_architettura/boot/bzImage.&lt;br /&gt;
&lt;br /&gt;
Ora si ricordi la differenza tra processo e thread:&lt;br /&gt;
-processo=entità titolare delle risorse;&lt;br /&gt;
-thread=componente sequenziale dell'elaborazione.&lt;br /&gt;
Nei sistemi monothread il concetto di thread si sovrappone al concetto di processo ma in linea generale un processo può avere anche più di un thread. Ma quali sono le caratteristiche principali dei processi e dei thread.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;Processo (PCB) &amp;lt;/th&amp;gt;                                    &amp;lt;th&amp;gt; Thread (TCB)&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&lt;br /&gt;
ID (self, parent,child etc)                   &amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&lt;br /&gt;
Info sulla memoria (puntatore alla tabella dei segmenti)&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Stato del processore&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;                             &lt;br /&gt;
File aperti&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;                      Stato: Ready, Running,Block&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&lt;br /&gt;
Ownership&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;                                  Puntatori&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&lt;br /&gt;
Interprocess comunication &amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;     &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;           &lt;br /&gt;
Informazioni sull'accounting  &amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;                          &lt;br /&gt;
&lt;br /&gt;
Modo Kernel e modo user&lt;br /&gt;
Si definisce Mode switch il passaggio da Kernel mode a user mode e viceversa (esiste tale differenza per motivi di sicurrenzza). Attenzione però da non confondere la kernel mod con i permessi di root (root è solo un utente con più permessi in assoluto ma è gestito tramite user mode).&lt;br /&gt;
Si definisce Context switch il passaggio di processi. Esempio: un processo A in usermode si ferma e passa il controllo al trap che tramite lo scheduler chiama un altro processo.&lt;br /&gt;
Da qui si capische che  è lo scheduler a decidere il prossimo processo da mandare avanti (tramite la Ready Queue). Un tipico scheduler è lo scheduler FIFO per sistemi batch con processi no preamptive (il processo si può chiudere per sua volontà).&lt;br /&gt;
I thread posso essere creati sia in modo kernel e sia in modo user.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 8 marzo 2018 ==&lt;br /&gt;
== Lezione del 9 marzo 2018 ==&lt;br /&gt;
== Lezione del 14 marzo 2018 ==&lt;br /&gt;
== Lezione del 15 marzo 2018 ==&lt;br /&gt;
== Lezione del 16 marzo 2018 ==&lt;br /&gt;
== Lezione del 21 marzo 2018 ==&lt;br /&gt;
== Lezione del 22 marzo 2018 ==&lt;br /&gt;
== Lezione del 23 marzo 2018 ==&lt;br /&gt;
== Lezione del 28 marzo 2018 ==&lt;br /&gt;
== Lezione del 29 marzo 2018 ==&lt;br /&gt;
== Lezione del 30 marzo 2018 ==&lt;/div&gt;</summary>
		<author><name>Francesco97</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Lezioni_Anno_Accademico_2017/18_II_semestre&amp;diff=2154</id>
		<title>Lezioni Anno Accademico 2017/18 II semestre</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Lezioni_Anno_Accademico_2017/18_II_semestre&amp;diff=2154"/>
		<updated>2018-03-08T11:12:45Z</updated>

		<summary type="html">&lt;p&gt;Francesco97: /* Lezione del 7 marzo 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Lezione del 28 febbraio 2018 ==&lt;br /&gt;
Inizia oggi la seconda parte del corso di Sistemi Operativi che si terrà dal 28/02/18 al 25/05/18.&amp;lt;br&amp;gt;&lt;br /&gt;
Le lezioni si svolgeranno, il mercoledì e il giovedì, in aula E1. Il venerdì invece ci sposteremo in M1.&amp;lt;br&amp;gt;&lt;br /&gt;
La suddivisione degli argomenti trattati sarà: '''mercoledì''' teoria, '''giovedì''' tendenzialmente parte progettuale (potrebbe iniziare con un po' di teoria) e '''venerdì''', data la scarsa dotazione dell'aula assegnataci, verranno svolti esercizi scritti in preparazione all'esame.&lt;br /&gt;
&lt;br /&gt;
Nel corso della lezione ci siamo chiesti, riprendendo un po' il filo logico delle lezioni dello scorso semestre, quali siano i servizi che ci aspettiamo da un sistema operativo.&amp;lt;br&amp;gt;&lt;br /&gt;
Questa volta, tuttavia, non li analizzeremo dal punto di vista dell'utilizzatore, ma da un punto di vista interno al sistema stesso.&amp;lt;br&amp;gt;&lt;br /&gt;
I servizi elencati sono stati:&lt;br /&gt;
* Scheduling (Gestione CPU)&lt;br /&gt;
* Gestione dei processi&lt;br /&gt;
* Gestione della memoria primaria&lt;br /&gt;
* Gestione dei device di I/O&lt;br /&gt;
* Gestione della memoria secondaria&lt;br /&gt;
* Filesystem&lt;br /&gt;
* Networking&lt;br /&gt;
* Protezione&lt;br /&gt;
* Shell&lt;br /&gt;
&lt;br /&gt;
Come in tutta l'informatica spesso succede, la complessità di questi servizi viene gestita tramite la creazione di livelli di astrazione. &amp;lt;br&amp;gt;&lt;br /&gt;
Il livello zero di astrazione, quello più basso, sarà l''''hardware''' che noi dovremo considerare come un linguaggio (l'ISA del processore).&amp;lt;br&amp;gt;&lt;br /&gt;
Seguito poi da due blocchi:&lt;br /&gt;
* '''Kernel'''&lt;br /&gt;
* '''Utente'''&lt;br /&gt;
&lt;br /&gt;
Cosa va incluso nel kernel di un S.O.? Cosa nella parte utente? Meglio massimizzare o minimizzare le operazioni nello livello kernel?&amp;lt;br&amp;gt; '''KERNEL MONOLITICO''' O '''MICRO-KERNEL'''?&lt;br /&gt;
&lt;br /&gt;
I kernel monolitici (tipo Linux) hanno il vantaggio di essere leggermente più performanti, mentre i microkernel (che presentano più livelli di astrazione) sono molto più flessibili e facili da manutenere.&lt;br /&gt;
Ad esempio, nei microkernel un bug non obbliga necessariamente a riavviare la macchina perché è possibile riavviare il singolo &amp;quot;modulo&amp;quot; che presenta l'errore.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 1 marzo 2018 ==&lt;br /&gt;
La lezione tace come concordato con gli studenti.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 2 marzo 2018 ==&lt;br /&gt;
La lezione tace causa chiusura dell'intero Ateneo per condizioni climatiche avverse.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 7 marzo 2018 ==&lt;br /&gt;
Tutto incomincia dal boot (e in principio fu il boot), nello specifico è nella fase di boot che si carica il kernel. Una volta caricato il kernel ha davanti una gradissima diversità di modelli hardware, ma come utilizzare tutti questi dispositivi hardware? Una prima soluzione sarebbe quella di includere nel kernel tutti i relativi device driver, tutta via il kernel diventerbbe davvero corposo (a meno che non si crei un kernel ad hoc per una specifica macchina). Un'altra soluzione (praticamente quella comunemente utilizzata) utilizza i moduli. I moduli vengono caricati dal kernel all'occorrenza senza essere inseriti direttamente in esso (senza ogni volta doverlo ricompilare).&lt;br /&gt;
Tuttavia con quest'ultima soluzione si viene a creare un dilemma, ovvero:&lt;br /&gt;
Chi carica i moduli? [il kernel]&lt;br /&gt;
Chi carica il kernel? [boot tramite moduli]&lt;br /&gt;
In verità non esiste solo il kernel ma anche un filesystem che contiene i moduli chiamato init.rd (diventa inutile se il kernel è configurato per una specifica macchina).&lt;br /&gt;
Arrivati a questo punto ci si chiede come si compila un kernel? Prima di tutto occorrono i sorgenti (es: i sorgenti del kernel linux sono reperibili in www.kernel.org). Una volta scaricato ed entrato nella relativa cartella si deve configurare il file “.config” che sostanzialmente descrive le specifiche del kernel. Questo file lo si può configurare a mano o tramite il “menuconfig” che dovrà essere prima di tutto opportunatamente compilato. All'interno del menuconfig tra le altre cose c'è una lista di tutti i device driver supportati e possono essere spuntati con:  * (driver inserito nel kernel) o M (creazione del relativo modulo). Una volta configurato il “.config” non resta che compilare effettivamente il kernel con la possibilità di compilarlo per la macchina ospite o per una specifica architettura. es:&lt;br /&gt;
&lt;br /&gt;
wget link_of_kernel_source #scarica i sorgenti&lt;br /&gt;
tar xf source_compressed_file # decomprime i relativi sorgenti, in questo caso dal file.tar.xz&lt;br /&gt;
cd linux #entra nella directory dei sorgenti&lt;br /&gt;
#Di regola esiste già un .config standard ma per configurarlo&lt;br /&gt;
make menuconfig&lt;br /&gt;
make #compila il kernel per la macchina ospite&lt;br /&gt;
# make -arch=armhf, compila seconda l'architettura dei processori armhf&lt;br /&gt;
#make -j n , compila il kernel per la macchina ospite utilizzando i suoi n-1 core&lt;br /&gt;
&lt;br /&gt;
Una volta compilato l'immagine del kernel si troverà in arch/nome_architettura/boot/bzImage.&lt;br /&gt;
&lt;br /&gt;
Ora si ricordi la differenza tra processo e thread:&lt;br /&gt;
-processo=entità titolare delle risorse;&lt;br /&gt;
-thread=componente sequenziale dell'elaborazione.&lt;br /&gt;
Nei sistemi monothread il concetto di thread si sovrappone al concetto di processo ma in linea generale un processo può avere anche più di un thread. Ma quali sono le caratteristiche principali dei processi e dei thread.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;Processo (PCB) &amp;lt;/th&amp;gt;                                    &amp;lt;th&amp;gt; Thread (TCB)&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&lt;br /&gt;
ID (self, parent,child etc)                   &amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&lt;br /&gt;
Info sulla memoria (puntatore alla tabella dei segmenti)&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Stato del processore&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;                             &lt;br /&gt;
File aperti&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;                      Stato: Ready, Running,Block&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&lt;br /&gt;
Ownership&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;                                  Puntatori&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&lt;br /&gt;
Interprocess comunication &amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;     &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;           &lt;br /&gt;
Informazioni sull'accounting  &amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;                          &lt;br /&gt;
&lt;br /&gt;
Modo Kernel e modo user&lt;br /&gt;
Si definisce Mode switch il passaggio da Kernel mode a user mode e viceversa (esiste tale differenza per motivi di sicurrenzza). Attenzione però da non confondere la kernel mod con i permessi di root (root è solo un utente con più permessi in assoluto ma è gestito tramite user mode).&lt;br /&gt;
Si definisce Context switch il passaggio di processi. Esempio: un processo A in usermode si ferma e passa il controllo al trap che tramite lo scheduler chiama un altro processo.&lt;br /&gt;
Da qui si capische che  è lo scheduler a decidere il prossimo processo da mandare avanti (tramite la Ready Queue). Un tipico scheduler è lo scheduler FIFO per sistemi batch con processi no preamptive (il processo si può chiudere per sua volontà).&lt;br /&gt;
I thread posso essere creati sia in modo kernel e sia in modo user.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 8 marzo 2018 ==&lt;br /&gt;
== Lezione del 9 marzo 2018 ==&lt;br /&gt;
== Lezione del 14 marzo 2018 ==&lt;br /&gt;
== Lezione del 15 marzo 2018 ==&lt;br /&gt;
== Lezione del 16 marzo 2018 ==&lt;br /&gt;
== Lezione del 21 marzo 2018 ==&lt;br /&gt;
== Lezione del 22 marzo 2018 ==&lt;br /&gt;
== Lezione del 23 marzo 2018 ==&lt;br /&gt;
== Lezione del 28 marzo 2018 ==&lt;br /&gt;
== Lezione del 29 marzo 2018 ==&lt;br /&gt;
== Lezione del 30 marzo 2018 ==&lt;/div&gt;</summary>
		<author><name>Francesco97</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Lezioni_Anno_Accademico_2017/18_II_semestre&amp;diff=2153</id>
		<title>Lezioni Anno Accademico 2017/18 II semestre</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Lezioni_Anno_Accademico_2017/18_II_semestre&amp;diff=2153"/>
		<updated>2018-03-08T11:10:36Z</updated>

		<summary type="html">&lt;p&gt;Francesco97: /* Lezione del 7 marzo 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Lezione del 28 febbraio 2018 ==&lt;br /&gt;
Inizia oggi la seconda parte del corso di Sistemi Operativi che si terrà dal 28/02/18 al 25/05/18.&amp;lt;br&amp;gt;&lt;br /&gt;
Le lezioni si svolgeranno, il mercoledì e il giovedì, in aula E1. Il venerdì invece ci sposteremo in M1.&amp;lt;br&amp;gt;&lt;br /&gt;
La suddivisione degli argomenti trattati sarà: '''mercoledì''' teoria, '''giovedì''' tendenzialmente parte progettuale (potrebbe iniziare con un po' di teoria) e '''venerdì''', data la scarsa dotazione dell'aula assegnataci, verranno svolti esercizi scritti in preparazione all'esame.&lt;br /&gt;
&lt;br /&gt;
Nel corso della lezione ci siamo chiesti, riprendendo un po' il filo logico delle lezioni dello scorso semestre, quali siano i servizi che ci aspettiamo da un sistema operativo.&amp;lt;br&amp;gt;&lt;br /&gt;
Questa volta, tuttavia, non li analizzeremo dal punto di vista dell'utilizzatore, ma da un punto di vista interno al sistema stesso.&amp;lt;br&amp;gt;&lt;br /&gt;
I servizi elencati sono stati:&lt;br /&gt;
* Scheduling (Gestione CPU)&lt;br /&gt;
* Gestione dei processi&lt;br /&gt;
* Gestione della memoria primaria&lt;br /&gt;
* Gestione dei device di I/O&lt;br /&gt;
* Gestione della memoria secondaria&lt;br /&gt;
* Filesystem&lt;br /&gt;
* Networking&lt;br /&gt;
* Protezione&lt;br /&gt;
* Shell&lt;br /&gt;
&lt;br /&gt;
Come in tutta l'informatica spesso succede, la complessità di questi servizi viene gestita tramite la creazione di livelli di astrazione. &amp;lt;br&amp;gt;&lt;br /&gt;
Il livello zero di astrazione, quello più basso, sarà l''''hardware''' che noi dovremo considerare come un linguaggio (l'ISA del processore).&amp;lt;br&amp;gt;&lt;br /&gt;
Seguito poi da due blocchi:&lt;br /&gt;
* '''Kernel'''&lt;br /&gt;
* '''Utente'''&lt;br /&gt;
&lt;br /&gt;
Cosa va incluso nel kernel di un S.O.? Cosa nella parte utente? Meglio massimizzare o minimizzare le operazioni nello livello kernel?&amp;lt;br&amp;gt; '''KERNEL MONOLITICO''' O '''MICRO-KERNEL'''?&lt;br /&gt;
&lt;br /&gt;
I kernel monolitici (tipo Linux) hanno il vantaggio di essere leggermente più performanti, mentre i microkernel (che presentano più livelli di astrazione) sono molto più flessibili e facili da manutenere.&lt;br /&gt;
Ad esempio, nei microkernel un bug non obbliga necessariamente a riavviare la macchina perché è possibile riavviare il singolo &amp;quot;modulo&amp;quot; che presenta l'errore.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 1 marzo 2018 ==&lt;br /&gt;
La lezione tace come concordato con gli studenti.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 2 marzo 2018 ==&lt;br /&gt;
La lezione tace causa chiusura dell'intero Ateneo per condizioni climatiche avverse.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 7 marzo 2018 ==&lt;br /&gt;
Tutto incomincia dal boot (e in principio fu il boot), nello specifico è nella fase di boot che si carica il kernel. Una volta caricato il kernel ha davanti una gradissima diversità di modelli hardware, ma come utilizzare tutti questi dispositivi hardware? Una prima soluzione sarebbe quella di includere nel kernel tutti i relativi device driver, tutta via il kernel diventerbbe davvero corposo (a meno che non si crei un kernel ad hoc per una specifica macchina). Un'altra soluzione (praticamente quella comunemente utilizzata) utilizza i moduli. I moduli vengono caricati dal kernel all'occorrenza senza essere inseriti direttamente in esso (senza ogni volta doverlo ricompilare).&lt;br /&gt;
Tuttavia con quest'ultima soluzione si viene a creare un dilemma, ovvero:&lt;br /&gt;
Chi carica i moduli? [il kernel]&lt;br /&gt;
Chi carica il kernel? [boot tramite moduli]&lt;br /&gt;
In verità non esiste solo il kernel ma anche un filesystem che contiene i moduli chiamato init.rd (diventa inutile se il kernel è configurato per una specifica macchina).&lt;br /&gt;
Arrivati a questo punto ci si chiede come si compila un kernel? Prima di tutto occorrono i sorgenti (es: i sorgenti del kernel linux sono reperibili in www.kernel.org). Una volta scaricato ed entrato nella relativa cartella si deve configurare il file “.config” che sostanzialmente descrive le specifiche del kernel. Questo file lo si può configurare a mano o tramite il “menuconfig” che dovrà essere prima di tutto opportunatamente compilato. All'interno del menuconfig tra le altre cose c'è una lista di tutti i device driver supportati e possono essere spuntati con:  * (driver inserito nel kernel) o M (creazione del relativo modulo). Una volta configurato il “.config” non resta che compilare effettivamente il kernel con la possibilità di compilarlo per la macchina ospite o per una specifica architettura. es:&lt;br /&gt;
&lt;br /&gt;
wget link_of_kernel_source #scarica i sorgenti&lt;br /&gt;
tar xf source_compressed_file # decomprime i relativi sorgenti, in questo caso dal file.tar.xz&lt;br /&gt;
cd linux #entra nella directory dei sorgenti&lt;br /&gt;
#Di regola esiste già un .config standard ma per configurarlo&lt;br /&gt;
make menuconfig&lt;br /&gt;
make #compila il kernel per la macchina ospite&lt;br /&gt;
# make -arch=armhf, compila seconda l'architettura dei processori armhf&lt;br /&gt;
#make -j n , compila il kernel per la macchina ospite utilizzando i suoi n-1 core&lt;br /&gt;
&lt;br /&gt;
Una volta compilato l'immagine del kernel si troverà in arch/nome_architettura/boot/bzImage.&lt;br /&gt;
&lt;br /&gt;
Ora si ricordi la differenza tra processo e thread:&lt;br /&gt;
-processo=entità titolare delle risorse;&lt;br /&gt;
-thread=componente sequenziale dell'elaborazione.&lt;br /&gt;
Nei sistemi monothread il concetto di thread si sovrappone al concetto di processo ma in linea generale un processo può avere anche più di un thread. Ma quali sono le caratteristiche principali dei processi e dei thread.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;Processo (PCB) &amp;lt;/th&amp;gt;                                    &amp;lt;th&amp;gt; Thread (TCB)&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&lt;br /&gt;
ID (self, parent,child etc)                   &amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&lt;br /&gt;
Info sulla memoria (puntatore alla tabella dei segmenti)&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Stato del processore&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;                             &lt;br /&gt;
File aperti&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;                      Stato: Ready, Running,Block&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&lt;br /&gt;
Ownership&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;                                  Puntatori&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&lt;br /&gt;
Interprocess comunication &amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;     &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;           &lt;br /&gt;
Informazioni sull'accounting  &amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;                            &lt;br /&gt;
&lt;br /&gt;
Modo Kernel e modo user&lt;br /&gt;
Si definisce Mode switch il passaggio da Kernel mode a user mode e viceversa (esiste tale differenza per motivi di sicurrenzza). Attenzione però da non confondere la kernel mod con i permessi di root (root è solo un utente con più permessi in assoluto ma è gestito tramite user mode).&lt;br /&gt;
Si definisce Context switch il passaggio di processi. Esempio: un processo A in usermode si ferma e passa il controllo al trap che tramite lo scheduler chiama un altro processo.&lt;br /&gt;
Da qui si capische che  è lo scheduler a decidere il prossimo processo da mandare avanti (tramite la Ready Queue). Un tipico scheduler è lo scheduler FIFO per sistemi batch con processi no preamptive (il processo si può chiudere per sua volontà).&lt;br /&gt;
I thread posso essere creati sia in modo kernel e sia in modo user.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 8 marzo 2018 ==&lt;br /&gt;
== Lezione del 9 marzo 2018 ==&lt;br /&gt;
== Lezione del 14 marzo 2018 ==&lt;br /&gt;
== Lezione del 15 marzo 2018 ==&lt;br /&gt;
== Lezione del 16 marzo 2018 ==&lt;br /&gt;
== Lezione del 21 marzo 2018 ==&lt;br /&gt;
== Lezione del 22 marzo 2018 ==&lt;br /&gt;
== Lezione del 23 marzo 2018 ==&lt;br /&gt;
== Lezione del 28 marzo 2018 ==&lt;br /&gt;
== Lezione del 29 marzo 2018 ==&lt;br /&gt;
== Lezione del 30 marzo 2018 ==&lt;/div&gt;</summary>
		<author><name>Francesco97</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Lezioni_Anno_Accademico_2017/18_II_semestre&amp;diff=2151</id>
		<title>Lezioni Anno Accademico 2017/18 II semestre</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Lezioni_Anno_Accademico_2017/18_II_semestre&amp;diff=2151"/>
		<updated>2018-03-08T10:00:26Z</updated>

		<summary type="html">&lt;p&gt;Francesco97: /* Lezione del 7 marzo 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Lezione del 28 febbraio 2018 ==&lt;br /&gt;
Inizia oggi la seconda parte del corso di Sistemi Operativi che si terrà dal 28/02/18 al 25/05/18.&amp;lt;br&amp;gt;&lt;br /&gt;
Le lezioni si svolgeranno, il mercoledì e il giovedì, in aula E1. Il venerdì invece ci sposteremo in M1.&amp;lt;br&amp;gt;&lt;br /&gt;
La suddivisione degli argomenti trattati sarà: '''mercoledì''' teoria, '''giovedì''' tendenzialmente parte progettuale (potrebbe iniziare con un po' di teoria) e '''venerdì''', data la scarsa dotazione dell'aula assegnataci, verranno svolti esercizi scritti in preparazione all'esame.&lt;br /&gt;
&lt;br /&gt;
Nel corso della lezione ci siamo chiesti, riprendendo un po' il filo logico delle lezioni dello scorso semestre, quali siano i servizi che ci aspettiamo da un sistema operativo.&amp;lt;br&amp;gt;&lt;br /&gt;
Questa volta, tuttavia, non li analizzeremo dal punto di vista dell'utilizzatore, ma da un punto di vista interno al sistema stesso.&amp;lt;br&amp;gt;&lt;br /&gt;
I servizi elencati sono stati:&lt;br /&gt;
* Scheduling (Gestione CPU)&lt;br /&gt;
* Gestione dei processi&lt;br /&gt;
* Gestione della memoria primaria&lt;br /&gt;
* Gestione dei device di I/O&lt;br /&gt;
* Gestione della memoria secondaria&lt;br /&gt;
* Filesystem&lt;br /&gt;
* Networking&lt;br /&gt;
* Protezione&lt;br /&gt;
* Shell&lt;br /&gt;
&lt;br /&gt;
Come in tutta l'informatica spesso succede, la complessità di questi servizi viene gestita tramite la creazione di livelli di astrazione. &amp;lt;br&amp;gt;&lt;br /&gt;
Il livello zero di astrazione, quello più basso, sarà l''''hardware''' che noi dovremo considerare come un linguaggio (l'ISA del processore).&amp;lt;br&amp;gt;&lt;br /&gt;
Seguito poi da due blocchi:&lt;br /&gt;
* '''Kernel'''&lt;br /&gt;
* '''Utente'''&lt;br /&gt;
&lt;br /&gt;
Cosa va incluso nel kernel di un S.O.? Cosa nella parte utente? Meglio massimizzare o minimizzare le operazioni nello livello kernel?&amp;lt;br&amp;gt; '''KERNEL MONOLITICO''' O '''MICRO-KERNEL'''?&lt;br /&gt;
&lt;br /&gt;
I kernel monolitici (tipo Linux) hanno il vantaggio di essere leggermente più performanti, mentre i microkernel (che presentano più livelli di astrazione) sono molto più flessibili e facili da manutenere.&lt;br /&gt;
Ad esempio, nei microkernel un bug non obbliga necessariamente a riavviare la macchina perché è possibile riavviare il singolo &amp;quot;modulo&amp;quot; che presenta l'errore.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 1 marzo 2018 ==&lt;br /&gt;
La lezione tace come concordato con gli studenti.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 2 marzo 2018 ==&lt;br /&gt;
La lezione tace causa chiusura dell'intero Ateneo per condizioni climatiche avverse.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 7 marzo 2018 ==&lt;br /&gt;
Tutto incomincia dal boot (e in principio fu il boot), nello specifico è nella fase di boot che si carica il kernel. Una volta caricato il kernel ha davanti una gradissima diversità di modelli hardware, ma come utilizzare tutti questi dispositivi hardware? Una prima soluzione sarebbe quella di includere nel kernel tutti i relativi device driver, tutta via il kernel diventerbbe davvero corposo (a meno che non si crei un kernel ad hoc per una specifica macchina). Un'altra soluzione (praticamente quella comunemente utilizzata) utilizza i moduli. I moduli vengono caricati dal kernel all'occorrenza senza essere inseriti direttamente in esso (senza ogni volta doverlo ricompilare).&lt;br /&gt;
Tuttavia con quest'ultima soluzione si viene a creare un dilemma, ovvero:&lt;br /&gt;
Chi carica i moduli? [il kernel]&lt;br /&gt;
Chi carica il kernel? [boot tramite moduli]&lt;br /&gt;
In verità non esiste solo il kernel ma anche un filesystem che contiene i moduli chiamato init.rd (diventa inutile se il kernel e configurato per una specifica macchina).&lt;br /&gt;
Arrivati a questo punto ci si chiede come si compila un kernel? Prima di tutto occorrono i sorgenti (es: i sorgenti del kernel linux sono reperibili in www.kernel.org). Una volta scaricato ed entrato nella relativa cartella si deve configurare il file “.config” che sostanzialmente descrive le specifiche del kernel. Questo file lo si può configurare a mano o tramite il “menuconfig” che dovrà essere prima di tutto opportunatamente compilato. All'interno del menuconfig tra le altre cose c'è una lista di tutti i device driver supportati e possono essere spuntati con:  * (driver inserito nel kernel) o M (creazione del relativo modulo). Una volta configurato il “.config” non resta che compilare effettivamente il kernel con la possibilità di compilarlo per la macchina ospite o per una specifica architettura. es:&lt;br /&gt;
&lt;br /&gt;
wget link_of_kernel_source #scarica i sorgenti&lt;br /&gt;
tar xf source_compressed_file # decomprime i relativi sorgenti, in questo caso dal file.tar.xz&lt;br /&gt;
cd linux #entra nella directory dei sorgenti&lt;br /&gt;
#Di regola esiste già un .config standard ma per configurarlo&lt;br /&gt;
make menuconfig&lt;br /&gt;
make #compila il kernel per la macchina ospite&lt;br /&gt;
# make -arch=armhf, compila seconda l'architettura dei processori armhf&lt;br /&gt;
#make -j n , compila il kernel per la macchina ospite utilizzando i suoi n-1 core&lt;br /&gt;
&lt;br /&gt;
Una volta compilato l'immagine del kernel si troverà in arch/nome_architettura/boot/bzImage.&lt;br /&gt;
&lt;br /&gt;
Ora si ricordi la differenza tra processo e thread:&lt;br /&gt;
-processo=entità titolare delle risorse;&lt;br /&gt;
-thread=componente sequenziale dell'elaborazione.&lt;br /&gt;
Nei sistemi monothread il concetto di thread si sovrappone al concetto di processo ma in linea generale un processo può avere anche più di un thread. Ma quali sono le caratteristiche principali dei processi e dei thread.&lt;br /&gt;
&lt;br /&gt;
__________________________________________________________________________________&amp;lt;br&amp;gt;&lt;br /&gt;
Processo                                      | Thread&amp;lt;br&amp;gt;&lt;br /&gt;
__________________________________________________________________________________&amp;lt;br&amp;gt;&lt;br /&gt;
ID (self, parent,child etc)                   | ID&amp;lt;br&amp;gt;&lt;br /&gt;
Info sulla memoria (puntatore alla tabella    | Stato del processore&amp;lt;br&amp;gt;&lt;br /&gt;
dei segmenti)                                 |&amp;lt;br&amp;gt;&lt;br /&gt;
File aperti                                   | Stato: Ready, Running,Block&amp;lt;br&amp;gt;&lt;br /&gt;
Ownership                                     | Puntatori&amp;lt;br&amp;gt;&lt;br /&gt;
Interprocess comunication                     |&amp;lt;br&amp;gt;&lt;br /&gt;
Informazioni sull'accounting                  |&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modo Kernel e modo user&lt;br /&gt;
Si definisce Mode switch il passaggio da Kernel mode a user mode e viceversa (esiste tale differenza per motivi di sicurrenzza). Attenzione però da non confondere la kernel mod con i permessi di root (root è solo un utente con più permessi in assoluto ma è gestito tramite user mode).&lt;br /&gt;
Si definisce Context switch il passaggio di processi. Esempio: un processo A in usermode si ferma e passa il controllo al trap che tramite lo scheduler chiama un altro processo.&lt;br /&gt;
Da qui si capische che  è lo scheduler a decidere il prossimo processo da mandare avanti (tramite la Ready Queue). Un tipico scheduler è lo scheduler FIFO per sistemi batch con processi no preamptive (il processo si può chiudere per sua volontà).&lt;br /&gt;
I thread posso essere creati sia in modo kernel e sia in modo user.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 8 marzo 2018 ==&lt;br /&gt;
== Lezione del 9 marzo 2018 ==&lt;br /&gt;
== Lezione del 14 marzo 2018 ==&lt;br /&gt;
== Lezione del 15 marzo 2018 ==&lt;br /&gt;
== Lezione del 16 marzo 2018 ==&lt;br /&gt;
== Lezione del 21 marzo 2018 ==&lt;br /&gt;
== Lezione del 22 marzo 2018 ==&lt;br /&gt;
== Lezione del 23 marzo 2018 ==&lt;br /&gt;
== Lezione del 28 marzo 2018 ==&lt;br /&gt;
== Lezione del 29 marzo 2018 ==&lt;br /&gt;
== Lezione del 30 marzo 2018 ==&lt;/div&gt;</summary>
		<author><name>Francesco97</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Lezioni_Anno_Accademico_2017/18_II_semestre&amp;diff=2150</id>
		<title>Lezioni Anno Accademico 2017/18 II semestre</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Lezioni_Anno_Accademico_2017/18_II_semestre&amp;diff=2150"/>
		<updated>2018-03-08T09:25:31Z</updated>

		<summary type="html">&lt;p&gt;Francesco97: /* Lezione del 7 marzo 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Lezione del 28 febbraio 2018 ==&lt;br /&gt;
Inizia oggi la seconda parte del corso di Sistemi Operativi che si terrà dal 28/02/18 al 25/05/18.&amp;lt;br&amp;gt;&lt;br /&gt;
Le lezioni si svolgeranno, il mercoledì e il giovedì, in aula E1. Il venerdì invece ci sposteremo in M1.&amp;lt;br&amp;gt;&lt;br /&gt;
La suddivisione degli argomenti trattati sarà: '''mercoledì''' teoria, '''giovedì''' tendenzialmente parte progettuale (potrebbe iniziare con un po' di teoria) e '''venerdì''', data la scarsa dotazione dell'aula assegnataci, verranno svolti esercizi scritti in preparazione all'esame.&lt;br /&gt;
&lt;br /&gt;
Nel corso della lezione ci siamo chiesti, riprendendo un po' il filo logico delle lezioni dello scorso semestre, quali siano i servizi che ci aspettiamo da un sistema operativo.&amp;lt;br&amp;gt;&lt;br /&gt;
Questa volta, tuttavia, non li analizzeremo dal punto di vista dell'utilizzatore, ma da un punto di vista interno al sistema stesso.&amp;lt;br&amp;gt;&lt;br /&gt;
I servizi elencati sono stati:&lt;br /&gt;
* Scheduling (Gestione CPU)&lt;br /&gt;
* Gestione dei processi&lt;br /&gt;
* Gestione della memoria primaria&lt;br /&gt;
* Gestione dei device di I/O&lt;br /&gt;
* Gestione della memoria secondaria&lt;br /&gt;
* Filesystem&lt;br /&gt;
* Networking&lt;br /&gt;
* Protezione&lt;br /&gt;
* Shell&lt;br /&gt;
&lt;br /&gt;
Come in tutta l'informatica spesso succede, la complessità di questi servizi viene gestita tramite la creazione di livelli di astrazione. &amp;lt;br&amp;gt;&lt;br /&gt;
Il livello zero di astrazione, quello più basso, sarà l''''hardware''' che noi dovremo considerare come un linguaggio (l'ISA del processore).&amp;lt;br&amp;gt;&lt;br /&gt;
Seguito poi da due blocchi:&lt;br /&gt;
* '''Kernel'''&lt;br /&gt;
* '''Utente'''&lt;br /&gt;
&lt;br /&gt;
Cosa va incluso nel kernel di un S.O.? Cosa nella parte utente? Meglio massimizzare o minimizzare le operazioni nello livello kernel?&amp;lt;br&amp;gt; '''KERNEL MONOLITICO''' O '''MICRO-KERNEL'''?&lt;br /&gt;
&lt;br /&gt;
I kernel monolitici (tipo Linux) hanno il vantaggio di essere leggermente più performanti, mentre i microkernel (che presentano più livelli di astrazione) sono molto più flessibili e facili da manutenere.&lt;br /&gt;
Ad esempio, nei microkernel un bug non obbliga necessariamente a riavviare la macchina perché è possibile riavviare il singolo &amp;quot;modulo&amp;quot; che presenta l'errore.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 1 marzo 2018 ==&lt;br /&gt;
La lezione tace come concordato con gli studenti.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 2 marzo 2018 ==&lt;br /&gt;
La lezione tace causa chiusura dell'intero Ateneo per condizioni climatiche avverse.&lt;br /&gt;
&lt;br /&gt;
== Lezione del 7 marzo 2018 ==&lt;br /&gt;
Tutto incomincia dal boot (e in principio fu il boot), nello specifico è nella fase di boot che si carica il kernel. Una volta caricato il kernel ha davanti una gradissima diversità di modelli hardware, ma come utilizzare tutti questi dispositivi hardware? Una prima soluzione sarebbe quella di includere nel kernel tutti i relativi device driver, tutta via il kernel diventerbbe davvero corposo (a meno che non si crei un kernel ad hoc per una specifica macchina). Un'altra soluzione (praticamente quella comunemente utilizzata) utilizza i moduli. I moduli vengono caricati dal kernel all'occorrenza senza essere inseriti direttamente in esso (senza ogni volta doverlo ricompilare).&lt;br /&gt;
Tuttavia con quest'ultima soluzione si viene a creare un dilemma, ovvero:&lt;br /&gt;
Chi carica i moduli? [il kernel]&lt;br /&gt;
Chi carica il kernel? [boot tramite moduli]&lt;br /&gt;
In verità non esiste solo il kernel ma anche un filesystem che contiene i moduli chiamato init.rd (diventa inutile se il kernel e configurato per una specifica macchina).&lt;br /&gt;
Arrivati a questo punto ci si chiede come si compila un kernel? Prima di tutto occorrono i sorgenti (es: i sorgenti del kernel linux sono reperibili in www.kernel.org). Una volta scaricato ed entrato nella relativa cartella si deve configurare il file “.config” che sostanzialmente descrive le specifiche del kernel. Questo file lo si può configurare a mano o tramite il “menuconfig” che dovrà essere prima di tutto opportunatamente compilato. All'interno del menuconfig tra le altre cose c'è una lista di tutti i device driver supportati e possono essere spuntati con:  * (driver inserito nel kernel) o M (creazione del relativo modulo). Una volta configurato il “.config” non resta che compilare effettivamente il kernel con la possibilità di compilarlo per la macchina ospite o per una specifica architettura. es:&lt;br /&gt;
&lt;br /&gt;
wget link_of_kernel_source #scarica i sorgenti&lt;br /&gt;
tar xf source_compressed_file # decomprime i relativi sorgenti, in questo caso dal file.tar.xz&lt;br /&gt;
cd linux #entra nella directory dei sorgenti&lt;br /&gt;
#Di regola esiste già un .config standard ma per configurarlo&lt;br /&gt;
make menuconfig&lt;br /&gt;
make #compila il kernel per la macchina ospite&lt;br /&gt;
# make -arch=armhf, compila seconda l'architettura dei processori armhf&lt;br /&gt;
#make -j n , compila il kernel per la macchina ospite utilizzando i suoi n-1 core&lt;br /&gt;
&lt;br /&gt;
Una volta compilato l'immagine del kernel si troverà in arch/nome_architettura/boot/bzImage.&lt;br /&gt;
&lt;br /&gt;
Ora si ricordi la differenza tra processo e thread:&lt;br /&gt;
-processo=entità titolare delle risorse;&lt;br /&gt;
-thread=componente sequenziale dell'elaborazione.&lt;br /&gt;
Nei sistemi monothread il concetto di thread si sovrappone al concetto di processo ma in linea generale un processo può avere anche più di un thread. Ma quali sono le caratteristiche principali dei processi e dei thread.&lt;br /&gt;
&lt;br /&gt;
__________________________________________________________________________________&amp;lt;br&amp;gt;&lt;br /&gt;
Processo                                      | Thread&amp;lt;br&amp;gt;&lt;br /&gt;
__________________________________________________________________________________&amp;lt;br&amp;gt;&lt;br /&gt;
ID (self, parent,child etc)                   | ID&amp;lt;br&amp;gt;&lt;br /&gt;
Info sulla memoria (puntatore alla tabella    | Stato del processore&amp;lt;br&amp;gt;&lt;br /&gt;
dei segmenti)                                 |&lt;br /&gt;
File aperti                                   | Stato: Ready, Running,Block&amp;lt;br&amp;gt;&lt;br /&gt;
Ownership                                     | Puntatori&amp;lt;br&amp;gt;&lt;br /&gt;
Interprocess comunication                     |&amp;lt;br&amp;gt;&lt;br /&gt;
Informazioni sull'accounting                  |&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Lezione del 8 marzo 2018 ==&lt;br /&gt;
== Lezione del 9 marzo 2018 ==&lt;br /&gt;
== Lezione del 14 marzo 2018 ==&lt;br /&gt;
== Lezione del 15 marzo 2018 ==&lt;br /&gt;
== Lezione del 16 marzo 2018 ==&lt;br /&gt;
== Lezione del 21 marzo 2018 ==&lt;br /&gt;
== Lezione del 22 marzo 2018 ==&lt;br /&gt;
== Lezione del 23 marzo 2018 ==&lt;br /&gt;
== Lezione del 28 marzo 2018 ==&lt;br /&gt;
== Lezione del 29 marzo 2018 ==&lt;br /&gt;
== Lezione del 30 marzo 2018 ==&lt;/div&gt;</summary>
		<author><name>Francesco97</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Sezioni_Critiche_in_C&amp;diff=2032</id>
		<title>Sezioni Critiche in C</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Sezioni_Critiche_in_C&amp;diff=2032"/>
		<updated>2017-10-12T21:54:24Z</updated>

		<summary type="html">&lt;p&gt;Francesco97: /* Dekker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tutti questi esempi hanno NPROC thread che svolgono un loop MAX volte sommando 1 ad ogni iterazione ad una variabile globale condivisa val.&lt;br /&gt;
&lt;br /&gt;
Se tutto va bene il risultato finale deve essere NPROC*MAX.&lt;br /&gt;
&lt;br /&gt;
== Dekker ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include&amp;lt;sched.h&amp;gt;&lt;br /&gt;
#include&amp;lt;pthread.h&amp;gt;&lt;br /&gt;
#include&amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAX 400&lt;br /&gt;
#define STEP 10&lt;br /&gt;
#define NPROC 2&lt;br /&gt;
&lt;br /&gt;
volatile long val = 0;&lt;br /&gt;
int need[NPROC];&lt;br /&gt;
int turn;&lt;br /&gt;
&lt;br /&gt;
void *codet(void *arg) {&lt;br /&gt;
  uintptr_t id = (uintptr_t) arg;&lt;br /&gt;
  int count;&lt;br /&gt;
  long tmp;&lt;br /&gt;
  for (count=0; count  &amp;lt; MAX; count++) {&lt;br /&gt;
    /* enter */&lt;br /&gt;
    need[id] = 1;&lt;br /&gt;
    while (need[1 - id]) {&lt;br /&gt;
      if (turn != id) {&lt;br /&gt;
        need[id] = 0;&lt;br /&gt;
        while (turn != id)&lt;br /&gt;
          sched_yield();&lt;br /&gt;
        need[id] = 1;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    /* /enter */&lt;br /&gt;
    tmp = val;&lt;br /&gt;
    //usleep(rand() % 2);&lt;br /&gt;
    val = tmp + 1;&lt;br /&gt;
    if (count % STEP == 0)&lt;br /&gt;
      printf(&amp;quot;%d %ld\n&amp;quot;,id,val);&lt;br /&gt;
    /* exit */&lt;br /&gt;
    turn = 1 - id;&lt;br /&gt;
    need[id] = 0;&lt;br /&gt;
    /* /exit */&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
  uintptr_t i;&lt;br /&gt;
  pthread_t t[NPROC];&lt;br /&gt;
  srand(time(NULL));&lt;br /&gt;
  for (i=0; i&amp;lt;NPROC; i++)&lt;br /&gt;
    pthread_create(&amp;amp;t[i], NULL, codet, (void *) i);&lt;br /&gt;
  for (i=0; i&amp;lt;NPROC; i++)&lt;br /&gt;
    pthread_join(t[i], NULL);&lt;br /&gt;
  printf(&amp;quot;%ld %d\n&amp;quot;,val,NPROC*MAX);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Francesco97</name></author>
	</entry>
</feed>