Essere un sistema operativo è un lavoro decisamente impegnativo. Un sistema operativo moderno svolge numerose operazioni quando dialoga con la CPU per gestire l’esecuzione dei processi e fornire un’interfaccia utente.
Tra le principali attività svolte dal sistema operativo vi sono la gestione dei processi (avvio, allocazione delle risorse, pianificazione dell’esecuzione e terminazione dei processi), delle risorse (memoria, CPU, dispositivi di I/O e spazio su disco), della memoria, dell’I/O (operazioni di input e output legate ai processi), degli interrupt hardware e software (quando si verifica un interrupt, il sistema operativo decide come gestire l’evento e interrompere o sospendere l’esecuzione dei processi coinvolti), dell’utente e dell’interfaccia, dei file e del file system, della rete e della connettività, della sicurezza e dell’autenticazione. delle funzionalità di risparmio energetico.
Un gioco online vi trasforma (virtualmente) in un sistema operativo
Immaginate un videogioco in cui assumete le vesti di un sistema operativo. Dovete gestire i core della CPU, i processi, le pagine di memoria ed, eventualmente, anche il file di paging o “di paginazione”. Dovete accertarvi che nessun processo rimanga in esecuzione più del necessario e scambiare le pagine di memoria quando opportuno. L’obiettivo è evitare di far arrabbiare l’utente mostrando un comportamento inaccettabile dal punto di vista delle prestazioni.
Abbiamo cercato di fornire, in un altro articolo, una visione sui principali dettagli della CPU mettendone in evidenza i principali meccanismi. Il gioco sviluppato da Pier‑Luc Brault e compilato in WebAssembly così da funzionare da browser Web, ha secondo noi un importante valore educativo, anche se l’autore non è propriamente d’accordo.
In realtà, il lavoro svolto da Brault aiuta a comprendere i “rudimenti” del funzionamento di un sistema operativo con particolare riferimento, per esempio, ai meccanismi di process scheduling.
Con l’espressione process scheduling si indica proprio la gestione dell’esecuzione dei processi da parte del sistema operativo: quando si hanno più processi in esecuzione contemporaneamente, va stabilito l’ordine con cui questi processi sono eseguiti sulla CPU. In un ambiente multitasking, in cui più processi competono per l’accesso alla CPU, il process scheduling è responsabile di decidere quale processo deve essere eseguito in un determinato momento. La decisione è assunta in base a una serie di algoritmi e strategie, il cui obiettivo principale è massimizzare l’efficienza dell’uso della CPU e garantire una buona esperienza utente.
Come essere un buon sistema operativo
Nel gioco You’re the OS, si è chiamati a gestire i processi in esecuzione, la memoria e gli eventi I/O. Nella parte superiore della schermata (in alto a sinistra), sono mostrati i core della CPU; al di sotto i processi che si trovano nello stato idle ovvero “in attesa”.
Cliccando su un processo e quindi sul PID (Process ID) corrispondente, un processo in idle può essere assegnato a una delle CPU disponibili. Allo stesso modo, un processo precedentemente caricato lato CPU, può essere poi rimosso. Via via che il tempo passa, ciascun processo transita attraverso 6 stati: quando un processo rimane in idle per troppo tempo, in attesa di essere gestito da una CPU, tendenzialmente è arrestato forzosamente dall’utente che non tollera più un’ulteriore attesa.
Nella normalità delle cose, un processo dovrebbe essere terminato in maniera canonica perché ha finito di svolgere le operazioni che si era prefisso di eseguire: in questo caso basta cliccare sul suo PID per rimuoverlo dalla CPU.
Gli eventi I/O, la gestione della memoria e lo swapping su disco
Talvolta un processo può restare “appeso” (mostra l’icona di una clessidra) perché è in attesa di un evento di I/O. Ovviamente, i processi in questo stadio tendono a bloccare la CPU: è quindi opportuno rimuoverli. Cliccando sulla barra che informa sugli eventi I/O disponibili, è possibile girarli ai rispettivi PID e sgravare la CPU proseguendo con il resto del lavoro.
E la memoria? Ciascun processo che viene eseguito, crea e utilizza delle pagine di memoria. Quelle in uso sono evidenziate con il colore bianco nel gioco all’interno dell’area Memory Pages in RAM mentre quelle in grigio corrispondono alle pagine di memoria disponibili. Nel caso in cui la memoria RAM fisicamente disponibile cominciasse a scarseggiare, è possibile attivare il meccanismo della paginazione: cliccando sulle varie pagine, si possono spostare i loro contenuti tra la RAM e il disco (e viceversa).
Poiché i processi in esecuzione possono utilizzare soltanto le informazioni conservate in RAM, quando esse sono conservate sul disco per via dell’attivazione della paginazione, le pagine corrispondenti lampeggiano in blu invitando a spostarle nuovamente nella memoria volatile. Astenendosi dall’effettuare lo swapping tra disco e RAM, il processo diverrà ingestibile e sarà arrestato.
Allorquando l’ipotetico utente, insoddisfatto del comportamento del sistema operativo, arrestasse i processi caricati sulla macchina per 10 volte, il gioco termina. Si presuppone infatti che il lavoro non sia stato svolto correttamente è che il sistema operativo sia stato riavviato.
Quali differenze ci sono nel gioco rispetto al reale funzionamento di un sistema operativo
Brault sottolinea che quello disponibile online è principalmente un gioco e come tale è concepito per dare priorità alla giocabilità piuttosto che al realismo.
Il primo aspetto degno di nota è che, ovviamente, non ci si aspetta che il giocatore abbia la velocità di un vero computer. Molti dettagli sono tecnicamente sbagliati: i processi via via caricati, ad esempio, usano molte meno pagine di memoria di quanto farebbero i tipici processi reali.
Inoltre, nel gioco elaborato da Brault si avviano sempre nuovi processi, praticamente all’infinito. Si tratta semplicemente di una meccanica di gioco per rendere le attività sempre più complesse da gestire. All’atto pratico, nessun utente continuerebbe ad avviare forsennatamente nuove applicazioni obbligando il sistema operativo ad agire con un numero crescente di PID.