Continuiamo la nostra serie di articoli dedicati ai sistemi operativi parlando dei processi: uno dei concetti alla base di questi.
Un processo è un termine più generale rispetto a Job visto nella lezione precedente: una serie di definizioni associate a questo termine sono:
- Un programma in esecuzione,
- Un istanza di un programma in esecuzione,
- L’entità che può essere assegnata ed eseguita da un processore,
Uno dei primi strumenti resi disponibili ai programmatori di sistema è stato l’ interrupt: ogni processo infatti poteva essere sospeso per qualche motivo come ad esempio l’accesso ad un dispositivo di I/O.
Il processore salva il contesto del Job (ad esempio il program counter ed altri registri) e salta alla routine per gestire il corrispondente Interrupt che risolverà l’interrupt e ripristinerà il Job interrotto.
A parole è molto facile: difficile però era riuscire a gestire tutti i possibili interrupt che potevano nascere, contando solamente che in un determinato momento potevano girare più Job (relativamente) contemporaneamente sulla macchina.
I programmatori hanno così creato dei metodi ad hoc per riuscire a gestire in maniera generale gli interrupts di cui non si conosce bene la causa, che devono comunque essere distinti dagli errori di tipo Software ed Hardware.
Le cause di interrupts più difficili da gestire sono:
- Sincronizzazione Impropria: Avviene quando una routine viene sospesa e deve aspettare un evento da qualche parte nel sistema. Ad esempio può succedere se avviando una procedura di I/O, si mette in attesa di un segnale che può essere perso e duplicato.
- Fallimento della mutua esclusione: Deve esistere una routine che blocchi l’accesso da un Job ad un file che è già in uso da un’altro processo (anche se il file è in uno spazio condiviso e quindi accessibile ad entrambi).
- Programmi Non determinati: E’ possibile che due programmi si sovrascrivino l’ un l’altro creando degli effetti imprevedibili.
- Deadlocks: Sono incroci versione software. Due processi si aspettano l’un l’altro all’ infinito.
Per risolvere tutti i nostri problemi, abbiamo bisogno di un metodo sistematico per controllare i vari programmi eseguiti sul processore.
Il concetto di processo ci viene in aiuto. Vediamo quindi cosa intendiamo col termine processo:
- Un programma eseguibile
- I dati necessari al programma (variabili, buffers etc)
- Il contesto di esecuzione del programma.
Il contesto di esecuzione, o stato del processo, è un registro interno che permette all’ SO di supervisionare e controllare i processi.
Queste informazioni sono staccate dal processo perchè il SO ha informazioni a cui il processo stesso non può accedere. Dentro allo stato del processo, sono compresi:
- Il contenuto dei registri del processore
- La priorità del processo stabilita dal SO
- Lo stato del processo se per esempio stà aspettando un evento come I/O.
Il Sistema Operativo ha una lista di processi, che sono tutti puntatori alla memoria del rispettivo processo.
Una volta che un processo A deve essere messo in esecuzione, il Sistema Operativo cambia il PC (Program Counter – registro che punta alla prossima istruzione da eseguire) nell’ indirizzo di A.
In questo senso, il processo può essere considerato una vera e propria struttura dati: esso ci fornisce infatti gli strumenti per creare potenti tecniche che ci assicurano coordinazione e cooperazione fra i processi.