Sistemi operativi: tre pezzi facili. Parte 1: Introduzione (traduzione)

Introduzione ai sistemi operativi

Ehi Habr! Vorrei presentare alla vostra attenzione una serie di articoli-traduzioni di una letteratura interessante secondo me: OSTEP. Questo materiale discute in modo abbastanza approfondito il lavoro dei sistemi operativi simili a Unix, vale a dire il lavoro con processi, vari pianificatori, memoria e altri componenti simili che compongono un sistema operativo moderno. Puoi vedere l'originale di tutti i materiali qui qui. Si prega di notare che la traduzione è stata fatta in modo non professionale (abbastanza liberamente), ma spero di aver mantenuto il significato generale.

Il lavoro di laboratorio su questo argomento può essere trovato qui:
- originale: pages.cs.wisc.edu/~remzi/OSTEP/Compiti/compiti.html
- originale: github.com/remzi-arpacidusseau/ostep-code
- il mio adattamento personale: github.com/bykvaadm/OS/tree/master/ostep

Puoi anche dare un'occhiata al mio canale su telegramma =)

Funzionamento del programma

Cosa succede quando un programma è in esecuzione? Un programma in esecuzione fa una cosa semplice: esegue le istruzioni. Ogni secondo, milioni e forse anche miliardi di istruzioni vengono recuperate dal processore dalla RAM, a sua volta le decodifica (riconosce ad esempio a quale tipo appartengono queste istruzioni) e le esegue. Questo potrebbe essere l'aggiunta di due numeri, l'accesso alla memoria, il controllo di una condizione, il passaggio a una funzione e così via. Dopo l'esecuzione di un'istruzione, il processore procede all'esecuzione di un'altra. E così, istruzione dopo istruzione, vengono eseguite fino alla fine del programma.
Questo esempio è naturalmente considerato semplificato: infatti, per velocizzare il processore, l'hardware moderno consente di eseguire istruzioni a turno, calcolare possibili risultati, eseguire istruzioni contemporaneamente e trucchi simili.

Modello di calcolo di Von Neumann

La forma semplificata di lavoro da noi descritta è simile al modello di calcolo di Von Neumann. Von Neumann è uno dei pionieri dei sistemi informatici, è anche uno degli autori della teoria dei giochi. Mentre il programma è in esecuzione, si verificano una serie di altri eventi, molti altri processi e operazioni logiche di terze parti, il cui scopo principale è semplificare l'avvio, il funzionamento e la manutenzione del sistema.
Esiste un insieme di software responsabile di rendere i programmi facili da eseguire (o addirittura di consentire l'esecuzione di più programmi contemporaneamente), che consente ai programmi di condividere la stessa memoria e di comunicare con dispositivi diversi. Un tale insieme di software (software) è essenzialmente chiamato sistema operativo e i suoi compiti includono il monitoraggio del corretto ed efficiente funzionamento del sistema, oltre a garantire la facilità di gestione di questo sistema.

Sistema operativo

Un sistema operativo, abbreviato in OS, è un insieme di programmi correlati progettati per gestire le risorse del computer e organizzare l'interazione dell'utente con un computer..
Il sistema operativo raggiunge la sua efficacia in primo luogo, attraverso la tecnica più importante: la tecnica virtualizzazione. Il sistema operativo interagisce con una risorsa fisica (processore, memoria, disco, ecc.) e la trasforma in una forma più generale, più potente e più facile da usare di se stessa. Pertanto, per una comprensione generale, puoi confrontare molto approssimativamente il sistema operativo con una macchina virtuale.
Per consentire agli utenti di impartire comandi al sistema operativo e quindi utilizzare le capacità della macchina virtuale (come l'esecuzione di un programma, l'allocazione della memoria, l'accesso a un file e così via), il sistema operativo fornisce alcune interfacce chiamate API (interfaccia di programmazione dell'applicazione) e a cui è possibile effettuare chiamate (chiamata). Un tipico sistema operativo consente di effettuare centinaia di chiamate di sistema.
Infine, poiché la virtualizzazione consente l'esecuzione di più programmi (condividendo così la CPU) e l'accesso simultaneo alle loro istruzioni e dati (condividendo così la memoria) e l'accesso ai dischi (condividendo così i dispositivi di I/O). ), il sistema operativo è anche chiamato gestore delle risorse. Ogni processore, disco e memoria è una risorsa del sistema, e quindi uno dei ruoli del sistema operativo diventa il compito di gestire queste risorse, farlo in modo efficiente, onesto o viceversa, a seconda dell'attività per cui questo sistema operativo è progettato.

Virtualizzazione della CPU

Si consideri il seguente programma:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Sistemi operativi: tre pezzi facili. Parte 1: Introduzione (traduzione)

Non esegue alcuna azione speciale, infatti, tutto ciò che fa è chiamare una funzione girare(), il cui compito è scorrere il controllo del tempo e tornare dopo che è trascorso un secondo. Pertanto, ripete all'infinito la stringa che l'utente ha passato come argomento.
Eseguiamo questo programma e passiamogli il carattere "A" come argomento. Il risultato non è particolarmente interessante: il sistema esegue semplicemente un programma che visualizza periodicamente il carattere "A".
Ora proviamo l'opzione quando molte istanze dello stesso programma sono in esecuzione, ma emettono lettere diverse per renderlo più chiaro. In questo caso, il risultato sarà leggermente diverso. Nonostante il fatto che abbiamo un processore, il programma viene eseguito contemporaneamente. Come succede? Ma si scopre che il sistema operativo, non senza l'aiuto delle capacità hardware, crea un'illusione. L'illusione che il sistema abbia più processori virtuali, trasformando un singolo processore fisico in un numero teoricamente infinito e consentendo quindi l'esecuzione simultanea di programmi apparentemente. Questa illusione si chiama Virtualizzazione della CPU.
Questa immagine solleva molte domande, ad esempio, se più programmi vogliono essere eseguiti contemporaneamente, quale verrà avviato? Le "politiche" del sistema operativo sono responsabili di questa domanda. I criteri vengono utilizzati in molti punti del sistema operativo e rispondono a domande come questa e sono i meccanismi di base implementati dal sistema operativo. Da qui il ruolo del sistema operativo come gestore delle risorse.

Virtualizzazione della memoria

Ora diamo un'occhiata alla memoria. Il modello fisico della memoria nei sistemi moderni è rappresentato come un array di byte.. Per leggere dalla memoria, è necessario specificare indirizzo di cellaper accedervi. Per scrivere o aggiornare i dati è necessario specificare anche il dato e l'indirizzo della cella dove scriverlo.
L'accesso alla memoria è costante durante l'esecuzione del programma. Un programma memorizza l'intera struttura dei dati in memoria e vi accede eseguendo varie istruzioni. Le istruzioni, nel frattempo, sono anche memorizzate in memoria, quindi vi si accede anche per ogni richiesta per l'istruzione successiva.

chiamata malloc()

Si consideri il seguente programma, che alloca una regione di memoria utilizzando la chiamata malloc () (https://youtu.be/jnlKRnoT1m0):

Sistemi operativi: tre pezzi facili. Parte 1: Introduzione (traduzione)

Il programma fa diverse cose. Prima alloca un po' di memoria (riga 7), quindi stampa l'indirizzo della cella allocata (riga 9), scrive zero nel primo slot della memoria allocata. Successivamente, il programma entra in un ciclo in cui incrementa il valore memorizzato in memoria all'indirizzo nella variabile "p". Stampa anche l'ID del processo stesso. L'ID processo è univoco per ogni processo in esecuzione. Dopo aver lanciato diverse copie, ci imbatteremo in un risultato interessante: nel primo caso, se non fai nulla e esegui solo diverse copie, gli indirizzi saranno diversi. Ma questo non rientra nella nostra teoria! Esatto, poiché le distribuzioni moderne hanno la randomizzazione della memoria abilitata per impostazione predefinita. Se è disabilitato, otteniamo il risultato atteso: gli indirizzi di memoria di due programmi in esecuzione contemporaneamente corrisponderanno.

Sistemi operativi: tre pezzi facili. Parte 1: Introduzione (traduzione)

Di conseguenza, risulta che due programmi indipendenti funzionano con i propri spazi di indirizzi privati, che a loro volta sono mappati dal sistema operativo nella memoria fisica. Pertanto, l'uso degli indirizzi di memoria all'interno di un programma non influirà in alcun modo sugli altri e ogni programma sembra avere il proprio pezzo di memoria fisica, interamente datogli. La realtà, tuttavia, è che la memoria fisica è una risorsa condivisa gestita dal sistema operativo.

Consistenza

Un altro degli argomenti importanti all'interno dei sistemi operativi è - consistenza. Questo termine viene utilizzato quando si parla di problemi nel sistema che possono verificarsi quando si lavora con più cose contemporaneamente all'interno dello stesso programma. I problemi di coerenza sorgono anche all'interno del sistema operativo stesso. Nei precedenti esempi di virtualizzazione della memoria e del processore, ci siamo resi conto che il sistema operativo gestisce molte cose contemporaneamente: avvia il primo processo, quindi il secondo e così via. Come si è scoperto, questo comportamento può portare ad alcuni problemi. Quindi, ad esempio, i moderni programmi multi-thread incontrano tali difficoltà.

Si consideri il seguente programma:

Sistemi operativi: tre pezzi facili. Parte 1: Introduzione (traduzione)

Il programma nella funzione principale crea due thread utilizzando la chiamata pthread_create(). In questo esempio, un thread può essere pensato come una funzione in esecuzione nello stesso spazio di memoria insieme ad altre funzioni, con chiaramente più di una funzione in esecuzione contemporaneamente. In questo esempio, ogni thread avvia ed esegue la funzione worker() che a sua volta incrementa semplicemente la variabile,.

Eseguiamo questo programma con un argomento di 1000. Come avrai intuito, il risultato dovrebbe essere 2000 perché ogni thread ha incrementato la variabile 1000 volte. Tuttavia, tutto non è così semplice. Proviamo a eseguire il programma con un ordine di grandezza in più di ripetizioni.

Sistemi operativi: tre pezzi facili. Parte 1: Introduzione (traduzione)

Inserendo un numero, ad esempio 100000, ci aspettiamo di vedere l'output come il numero 200000. Tuttavia, se eseguiamo il numero 100000 più volte, non solo non vedremo la risposta corretta, ma otterremo anche diverse risposte errate. La risposta sta nel fatto che per aumentare il numero sono necessarie tre operazioni: estrarre il numero dalla memoria, incrementare e quindi riscrivere il numero. Poiché tutte queste istruzioni non vengono eseguite atomicamente (tutte allo stesso tempo), possono accadere cose strane come questa. Questo problema è chiamato in programmazione condizione di gara. Quando forze sconosciute in un momento sconosciuto possono influenzare le prestazioni di qualsiasi tua operazione.

Fonte: habr.com

Aggiungi un commento