Networking -> embedded systems -> Network embedded systems
Deitel, Choffines - Operating Systems, per ripassare
Mitchell Oldhamm, ... Advanced Linux Programming, scaricabile gratis.
Modalità
Hardware recente è in grado di supportare il parallelismo, mentre storicamente i sistemi operativi sono pensati per la condivisione delle risorse di un solo processore.
Il cambiamento storico è stato dal vax780 che ha introdotto un SoC,
E poi c'è il dark silicon
Anche per quello l'evoluzione sta al momento nel creare meccanismi di memoria e di caching in grado di permettere il funzionamento contemporaneo di molti core (~50)
Sistemi di gestione dinamica dele risorse Come barbecue non gesticono i processi in modo agnostico ma danno priorità in base alle condizioni (es: utilizzo in batteria) La gestione viene fatta a livello userspace con uno strato intermedio, in modo che sia indipendente dal kernel o sistema operativo.
Per coordinare molti core non si usa un bus ma una Network on Chip (16 core in sù)
è lo strato che permette di mappare le funzioni del sistema operativo su un particolare tipo di hardware.
Il kernel sceglie il processo da mandare in esecuzione Quando un processo richiede un servizio di sistema tramite una SVC Viene fornita la funzione richiesta nel contesto del processo.
Il processo può lasciare l'esecuzione
3 stati:
I processi in attesa sono differenziati da quelli pronti per evitare che un proceso singolo monopolizzi il processore, e faccia andare gli altri in starvation.
Nei sistemi con preemption si può togliere il processo in esecuzione dal processore Nei sistemi senza, il processo tiene il processore fino alla fine del quanto di tempo o fino a che si sospende volontariamente.
Le interruzioni possono essere nestate, e in quel caso non si sa quando finiranno di eseguirsi. Questo può creare problemi nei sistemi embedded in cui è necessario garantire un tempo di risposta rapido.
Gli interrupt possono essere mascherabili quando non possono essere eseguiti altri interrupt, in modo da creare una sezione atomica, non interrompibile.
Ci sono interruzioni che possono essere non mascherabili perchè cruciali, ad esempio spegnimento in caso di batterie scariche.
Viene usato per capire se un processo è bloccato, ad esempio facendo un timer che va resettato periodicamente. Se il timer non viene resettato e scade, viene attivato un interrupt che accende un led ad esempio. Collegare il watchdog al reset del sistema non è una delle soluzioni migliori (es: applicazioni critiche) Il watchdog implica un hardware esterno perchè il processore in quel caso è bloccato.
Per il quanto di tempo viene usato uno dei timer programmabili hardware del PC (RTC) Facendo un quanto di tempo troppo piccolo ho un parallelismo più spinto ma aumenta l'overhead per il context switching Il problema in questo caso è il mixed-workflow in cui è importante che il sistema rimanga interattivo ed è anche importante terminare i processi lunghi.
Fino a 8 anni fa il kernel linux era monolitico (non interrompibile) mentre ora è preemptable (interrompibile) e in questo modo è più difficile da gestire ma è più interattivo.
Nei sistemi embedded non esiste, perchè serve avere un sistema predicibile. Anche i questo caso i processi che subiscono swap-in (ritorno in memoria da swap) finiscono in uno stato in attesa, e non pronto, per evitare la starvation dei processi
Esiste una distinzione tra Ready to run in memory e Preempted
Ultimamente in linux si sta tentando di caricare le cose non tutte insieme ma quelle essenziali prima in modo che il sistema risulti già usabile