PROCESSI PROCESSO E lunit di lavoro allinterno del









![UNIX #include <stdio. h> #include <unistd. h> int main(int argc, char *argv[]) { int UNIX #include <stdio. h> #include <unistd. h> int main(int argc, char *argv[]) { int](https://slidetodoc.com/presentation_image/53a8737b153fcacc260bd699b9e4f2b9/image-10.jpg)
![UNIX Padre #include <stdio. h> #include <unistd. h> int main(int argc, char *argv[]) { UNIX Padre #include <stdio. h> #include <unistd. h> int main(int argc, char *argv[]) {](https://slidetodoc.com/presentation_image/53a8737b153fcacc260bd699b9e4f2b9/image-11.jpg)
![UNIX Figlio Padre #include <stdio. h> #include <unistd. h> int main(int argc, char *argv[]) UNIX Figlio Padre #include <stdio. h> #include <unistd. h> int main(int argc, char *argv[])](https://slidetodoc.com/presentation_image/53a8737b153fcacc260bd699b9e4f2b9/image-12.jpg)









- Slides: 21

PROCESSI

PROCESSO E’ l’unità di lavoro all’interno del Computer E’ programma in esecuzione e comprende l’attività Corrente: • Sezione del codice (code section) • Program counter • Registri • Stack • Sezione Dati • Heap

Modello PROCESSO Single flusso di controllo delle operazioni (THREAD) Il processo può eseguire una operazione alla volta

Ciclo di Vita Processo NEW END READY RUN WAIT Time Slice = 100 ms

IDENTIFICAZIONE PROCESSO PROCESS CONTROL BLOCK (PCB) • Stato del Processo • Program Counter • Registri CPU • Info Scheduling • Info Gestione Memoria • Info Accounting • Info I/O

Schedulatore PROCESSO Componente del SO che decide quale processo Mandare in esecuzione Code di Schedulazione (Job queue, ready queue, wait queue)

Bilanciamento PROCESSI Processi: I/O-bound o CPU-bound Long Term Scheduler Short Term Scheduler

Context Switching Il contesto di un processo è contenuto nella PCB Rallentamento del sistema (10 ms)

Operazioni sui Processi Creazione (system call) Creatore: Processo Padre Creato: Processo Figlio Risorse condivise Risorse indipendenti Esecuzione: Concorrente o sequenziale Indirizzamento: Figlio=Padre o Figlio ≠ Padre
![UNIX include stdio h include unistd h int mainint argc char argv int UNIX #include <stdio. h> #include <unistd. h> int main(int argc, char *argv[]) { int](https://slidetodoc.com/presentation_image/53a8737b153fcacc260bd699b9e4f2b9/image-10.jpg)
UNIX #include <stdio. h> #include <unistd. h> int main(int argc, char *argv[]) { int pid; /* creazione nuovo processo */ pid=fork(); if (pid < 0) {/* errore */ printf(stderr, ”Errore Fork”); exit(-1); } else if (pid == 0) { /* processo figlio */} execlp(“/bin/ls”, ”ls”, NULL); } else {/* processo padre */} wait(NULL); exit(0) } }
![UNIX Padre include stdio h include unistd h int mainint argc char argv UNIX Padre #include <stdio. h> #include <unistd. h> int main(int argc, char *argv[]) {](https://slidetodoc.com/presentation_image/53a8737b153fcacc260bd699b9e4f2b9/image-11.jpg)
UNIX Padre #include <stdio. h> #include <unistd. h> int main(int argc, char *argv[]) { int pid; /* creazione nuovo processo */ pid=fork(); if (pid < 0) {/* errore */ printf(stderr, ”Errore Fork”); exit(-1); } else if (pid == 0) { /* processo figlio */} execlp(“/bin/ls”, ”ls”, NULL); } else {/* processo padre */} wait(NULL); exit(0) } }
![UNIX Figlio Padre include stdio h include unistd h int mainint argc char argv UNIX Figlio Padre #include <stdio. h> #include <unistd. h> int main(int argc, char *argv[])](https://slidetodoc.com/presentation_image/53a8737b153fcacc260bd699b9e4f2b9/image-12.jpg)
UNIX Figlio Padre #include <stdio. h> #include <unistd. h> int main(int argc, char *argv[]) { int pid; /* creazione nuovo processo */ pid=fork(); if (pid < 0) {/* errore */ printf(stderr, ”Errore Fork”); exit(-1); } else if (pid == 0) { /* processo figlio */} execlp(“/bin/ls”, ”ls”, NULL); } else {/* processo padre */} wait(NULL); exit(0) } }

Operazioni sui Processi Terminazione (system call) Processo Padre ABORT(pid) Processo Figlio EXIT(num) Morte del Padre ? Terminazione a cascata o Assegnazione init (UNIX)

Processi Cooperanti • Condivisione Informazioni • Velocizzare Calcolo • Modularità • Convenienza Produttore - Consumatore

Processi Cooperanti Produttore BUFFER Sincronizzazione (IPC) (shared memory, message passing ) Consumatore

Message Passing Send(message) , Receive(message) A ------------ canale B • Comunicazione diretta o indiretta • Comunicazione sincrona o asincrona • Bufferizzazione automatica o esplicita

Comunicazione diretta Dati A (mittente) e B (destin. ) due processi Send(B, message) , Receive(A, message) Canale di comunicazione: • Automatico con i nomi dei processi • una connessione associata a due processi • due processi hanno 1 ed 1 sola connessione Simmetrico: sia il mittente/destinatario deve usare il nome del processo destinatario/mittente Asimmetrico: send(B, message) receive(&id, message)

Comunicazione indiretta Comunicazione avviene attraverso MAILBOX o PORTE Send(MBX, message) , Receive(MBX, message), (Create e Delete) Canale di comunicazione: • Mailbox Condivisa (muore con il creatore) • una connessione associata a più di due processi • due processi possono avere più connessioni P 1 (mittente) e P 2, P 3 (receive) Connessione solo con 2 processi, solo 1 processo fa receive, Arbitrario.

Comunicazione Sincrona, Asincrona Dati A (mittente) e B (destin. ) due processi Send() , Receive() Bloccante, non Bloccante Bufferizzazione (zero, limitata, illimitata)

Mac OS X Creazione Processo: MBX_Kern, MBX_Ntfy msg_send() , msg_receive() Creazione MBX: port_allocate() (send e receive) coda (8 msg) modalità FIFO msg: header e dati (variabili) send invia anche la mbx coda piena?

Windows XP Local Procedure Call (LPC) Porte di connessione (object) e Porte di comunicazioni Object visibili a tutti i processi 1. 2. 3. 4. Client apre un object Client invia richiesta di connessione Server crea 2 porte private e invia id al client Client e Server usano i due id: send, callback e receive Short msg (256 byte) o section object (indir. Send con short msg)