Estratto del documento

Sistemi operativi

Davide Pirrò
March 2023

Introduzione

Un sistema operativo è una componente software di un sistema informativo che serve per dare servizi alle applicazioni che girano sul sistema. Gli scopi principali di un sistema operativo sono infatti:

  • Gestione della memoria centrale
  • Gestione di thread e processi
  • Gestione delle periferiche
  • Gestione degli utenti
  • Gestione della rete
  • Gestione della memoria di massa

Il sistema operativo fornisce delle funzioni standard che le applicazioni possono chiamare, unificando così l'interfaccia di accesso alle risorse, con enormi benefici per le applicazioni, che non devono scrivere i driver per ogni periferica esistente. Permettono inoltre l'accesso al computer da più utenti.

Cenni di architettura

I processori moderni sono formati da più core, ma per semplicità ammettiamo di avere una CPU con solo un core. L'architettura di un computer moderno differisce dalla classica architettura di Von-Neumann per diversi aspetti. I componenti principali sono:

  • La CPU
  • La memoria centrale
  • Le periferiche
  • Il chipset (che contiene cose come il DMA controller e l'Interrupt Controller)
  • Il bus (che è a sua volta diviso in address bus, data bus e control bus)

La CPU è l'unità di calcolo centrale, che ha il compito di effettuare le operazioni e di controllare il sistema. Contiene una sua parte di memoria interna detta cache, e dei registri, che servono a conservare i dati e le istruzioni che devono essere elaborate nel brevissimo termine. Inoltre, è internamente divisa in Control Unit (serve a gestire le operazioni, contiene il PC e altri registri speciali e decodifica le istruzioni) e la ALU (Aritmetic Logic Unit, esegue materialmente le istruzioni di calcolo).

La memoria centrale (memoria RAM) è la memoria che serve per conservare dati e istruzioni durante l'esecuzione di un programma. Le periferiche possono essere di input, di output, di memoria di massa, o schede di elaborazione esterne (coprocessori, schede grafiche). Il chipset, presente sulla scheda madre, ha il compito di gestire la comunicazione attraverso le varie componenti, per mezzo dei bus, insiemi di "fili" atti a portare i dati da una componente all'altra.

Nei primi computer non era presente il DMA (Direct Memory Access) controller. Questa componente del chipset serve a garantire l'accesso alla memoria centrale da parte delle periferiche senza impegnare il processore. Le operazioni di scrittura e lettura infatti possono essere molto lente. La DMA ha due fili che vanno ad ogni periferica a cui è collegata, e alla CPU. Quando una periferica vuole accedere alla memoria, accende il filo chiamato HOLD. Quando il DMA può dare l'accesso alla memoria, accende invece il filo HLDA della periferica.

Il DMA controller ha molto senso se la cache della CPU è sufficientemente grande a garantire alla CPU istruzioni da eseguire nel mentre che la memoria è occupata da un'altra periferica. L'Interrupt controller serve per gestire le comunicazioni dalle periferiche alla CPU. Anziché avere svariati cavi che collegano CPU e periferiche da controllare periodicamente (polling), l'interrupt controller blocca il flusso di esecuzione della CPU quando riceve un evento dalle periferiche. L'esecuzione passa quindi a una Interrupt Handling Routine, una funzione che serve a gestire l'interrupt nel modo più appropriato, per poi ripassare il flusso di esecuzione delle operazioni al processo che era in esecuzione prima dell'interrupt.

Notiamo che, essendoci solo un bus, la comunicazione avviene tra due utilizzatori per volta. Il data bus ha 64 bit nei processori moderni (questo è ciò che indica il numero di bit del processore), mentre l'address bus ha circa 40 bit. Alcuni di questi vengono usati per indicare l'indirizzo di memoria che si vuole avere, altri invece servono per selezionare la periferica con cui si sta comunicando. Ogni periferica infatti avrà poi un address decoder che stabilisce se essa è quella richiesta (accendendo un filo chiamato CS) o meno.

Multitasking

Per poter avere, su un singolo processore, più processi o thread che avvengono eseguiti in maniera concorrente, bisogna saper gestire il multitasking. Esso può essere collaborativo o non collaborativo.

Multitasking collaborativo

Nel multitasking collaborativo, la gestione dei thread avviene per eventi. Esiste una coda dove vengono inseriti vari eventi che possono essere creati attraverso interrupt (nella maggior parte dei casi) e che vengono presi di volta in volta per essere eseguiti. Ogni evento infatti, oltre ad avere il PID del processo a cui appartiene (o il TID nel caso dei thread), ha anche assegnata una funzione winproc, ovvero una funzione che viene chiamata quando l'evento è preso dalla coda di eventi. In questo modo vengono gestiti i vari processi che vengono eseguiti man mano che gli eventi vengono creati e chiamati.

I vantaggi del multitasking collaborativo sono:

  • Facilità di implementazione
  • Comodo per task I/O bound

mentre esistono anche alcuni svantaggi:

  • Funzioni winproc che vanno in loop o durano molto bloccano l'intero flusso di esecuzione di ogni altro processo
  • Nei sistemi con più core, i core multipli non vengono sfruttati

Ad oggi si è evoluto nella programmazione asincrona ed è utilizzata per esempio per gestire gli eventi Java o JavaScript.

Multitasking non collaborativo

Nel multitasking non collaborativo ad ogni processo (o thread) viene assegnata un timeslice, ovvero una finestra temporale nella quale può essere eseguito. Questo meccanismo fa sì che a rotazione tutti i processi possano venire eseguiti, con inoltre la possibilità di assegnare diverse priorità di esecuzione. I processi possono essere in tre stati:

  • Ready: sono i processi pronti per essere eseguiti; vengono inseriti in una coda FIFO per essere presi ed eseguiti. I processi che stanno molto tempo ready sono processi CPU bound.
  • Wait: i processi sono in attesa di un evento delle periferiche che li riporti in stato di ready. I processi che sono per molto tempo in stato di wait sono detti I/O bound.
  • Running: il processo è eseguito in questo momento. Un processo può entrare in stato di running quando viene preso dalla coda di ready (cioè è il suo turno per essere eseguito) e può uscire dallo stato di running quando scade il timer ad esso assegnato (attraverso un interrupt) oppure quando effettua chiamate bloccanti alle periferiche (nel qual caso entra nello stato di wait).

Quando un processo deve essere eseguito viene chiamata prima una funzione load, che carica lo stato del processo al termine della precedente esecuzione nei registri della CPU, mentre quando la sua esecuzione si blocca viene chiamata una funzione save, che salva lo stato attuale dei registri e di tutte le risorse da esso utilizzate in memoria.

Multitasking non collaborativo in Windows

L'implementazione del multitasking collaborativo nel sistema operativo Windows è effettuata...

Anteprima
Vedrai una selezione di 4 pagine su 12
Appunti di Sistemi operativi Pag. 1 Appunti di Sistemi operativi Pag. 2
Anteprima di 4 pagg. su 12.
Scarica il documento per vederlo tutto.
Appunti di Sistemi operativi Pag. 6
Anteprima di 4 pagg. su 12.
Scarica il documento per vederlo tutto.
Appunti di Sistemi operativi Pag. 11
1 su 12
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher DavideT55 di informazioni apprese con la frequenza delle lezioni di Sistemi operativi e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università della Calabria o del prof Ianni Giovambattista.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community