Comunicazione tra processi mediante strutture dati rese disponibili dal kernel
Oggetti (o risorse) IPC
Ogni risorsa IPC è identificata da un valore univoco nel sistema, denominata chiave (IPC key).
Un IPC key può essere:
key_t ftok(char * path, char id)
Restituisce una chiave ottenuta cobinando:
Esempio :
mykey= ftok (".",'a');
La primitiva get utilizza la IPC key, ed opportuni parametri, per restituire al processo un descrittore della risorsa.
Se la risorsa non esiste viene creata.
La primitiva ctl (control), permette, dato un descrittore, di:
Le strutture create sono permanenti: la loro eliminazione richiede l’invocazione di un’apposita chiamata di sistema.
int ...get (key_t key, ..., int flag);
key
: indentificatore chiave dell’oggetto:
flag
: indica la modalità di creazione e dei permessi di accesso, in OR (|).
La creazione di un oggetto IPC causa anche:
ushort cuid, cgid; // creator user & group id
ushort uid, gid; // owner user & group id
ushort mode; // r/w permissions
int ...ctl (int desc, ..., int cmd, ...);
desc
: indica il descrittore della risorsa;
cmd
: specifica del comando da eseguire:
Comandi eseguibili da shell (in /usr/bin/)
ipcs <-m|-s|-q>
: visualizza tutte le strutture allocate (o solo shm, sem,msg) mostrandone anche l’identificatore e l’utente proprietario;ipcrm <shm|sem|msg> <IPC_ID>
:
I processi Unix (a differenza dei thread) non possono condividere la memoria.
Neanche i processi “parenti”: il figlio infatti eredita una copia dei dati del padre.
Se i due processi modificano quei dati dopo la fork, ognuno modifica la propria copia.
Una memoria condivisa (SHM) è una porzione di memoria accessibile da più processi.
Su di essa un processo può scrivere dati che possono essere letti da un qualsiasi processo abbia i permessi per accedervi.
Due modalità
Letture e scritture su di una memoria condivisa non necessitano di particolari chiamate a sistema: può essere scritta e letta come una qualsiasi variabile facente parte dello spazio di indirizzamento del processo.
La massima porzione di memoria condivisa che può essere letta/scritta da un processo dipende dalle istruzioni di linguaggio macchina (relazioni con la taglia del BUS dati).
Header da includere: <sys/shm.h>
,<sys/ipc.h>
int shmget(key_t key, int size, int flag)
key
: chiave per identificare la SHM in maniera univoca nel sistema;size
: dimensione in byte della memoria condivisa;flag
: intero che specifica la modalità di creazione e dei permessi di accesso (IPC_CREAT, IPC_EXCL, permessi).Restituisce un identificatore numerico per la memoria in caso di successo (descrittore), -1 in caso di fallimento.
key_t chiave = 40;
int ds_shm;
ds_shm = shmget(chiave, 1024,IPC_CREAT | IPC_EXCL | 0664);
Crea un segmento di memoria condivisa con chiave 40 e dimensione 1k.
Restituisce errore se tale chiave già esiste.
Solo l’utente ed il gruppo proprietari hanno permessi di accesso RW, mentre gli altri hanno solo accesso in lettura.
void* shmat(int shmid, const void *shmaddr, int flag)
Collega il segmento di memoria allo spazio di indirizzamento del chiamante.
shmid
: identificatore del segmento di memoria;shmaddr
: indirizzo dell’area di memoria del processo chiamante al quale collegare il segmento di memoria condivisa. Se 0, un valore opportuno viene automaticamente scelto;flag
: opzioni (IPC_RDONLY per collegare in sola lettura).Restituisce l’indirizzo del segmento collegato, -1 in caso di fallimento.
int shmctl(int ds_shm, int cmd, struct shmid_ds * buff)
ds_shm
: descrittore della memoria condivisa su cui si vuole operare;cmd
: specifica del comando da eseguire;IPC_RMID
: marca da eliminare, rimuove solo quando non vi sono più processi attaccati;buff
: puntatore ad una struttura di tipo shmid_ds con eventuali parametri per i comandi IPC_STAT e IPC_SET;shmid_ds
è definito nell’header <sys/shm.h>
struct shmid_ds {
struct ipc_perm shm_perm; /* permessi */
size_t shm_segsz; /* dim del segm. in bytes */
__time_t shm_atime; /* tempo ultimo shmat() */
__time_t shm_dtime; /* tempo ultimo shmdt() */
__time_t shm_ctime; /* tempo ultimo shmctl() */
__pid_t shm_cpid; /* pid del creatore */
__pid_t shm_lpid; /* pid del'ultimo operatore */
shmatt_t shm_nattch;/* # di attach. correnti */
};
1. Introduzione ai Sistemi Operativi
5. Scheduling nei sistemi mono-processore
6. Threads, SMP
8. Scheduling Multiprocessore e Real-Time
9. Gestione dei processi nei sistemi operativi Unix/Linux e Window...
10. Introduzione alla Programmazione Concorrente
11. Sincronizzazione nel modello ad ambiente globale
12. Problemi di cooperazione nel modello ad ambiente globale
14. Sincronizzazione nel modello ad ambiente locale
15. Deadlock
16. Programmazione Multithread
18. Memoria Virtuale
20. Il File System
21. Primitive di sincronizzazione nel kernel Linux
22. Esercitazione: System call per la gestione dei processi
23. Esercitazione: Inteprocess Communication e Shared Memory
24. Esercitazione: System Call per la gestione dei semafori in Linu...
25. Esercitazione: Problema dei Produttori e dei Consumatori
26. Posix Threads