Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D La Corte in Rete
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Domenico Cotroneo » 23.Esercitazione: Inteprocess Communication e Shared Memory


Interprocess Communication

Comunicazione tra processi mediante strutture dati rese disponibili dal kernel

  • Memoria condivisa (SHM : shared memory segments)
  • Semafori (SEM: semaphore arrays)
  • Code di messaggi (MSG: queues)

Oggetti (o risorse) IPC

IPC keys

Ogni risorsa IPC è identificata da un valore univoco nel sistema, denominata chiave (IPC key).

Un IPC key può essere:

  • “cablata” nel codice (problemi di consistenza);
  • generata dal SO mediante la system call.

key_t ftok(char * path, char id)

Restituisce una chiave ottenuta cobinando:

  • l’inode number e il minor device number del file indicato;
  • il carattere indicato come secondo argomento.

Esempio :

mykey= ftok (".",'a');

Primitive comuni

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:

  • verificare lo stato di una risorsa;
  • cambiare lo stato di una risorsa;
  • rimuovere una risorsa.

Le strutture create sono permanenti: la loro eliminazione richiede l’invocazione di un’apposita chiamata di sistema.

Primitiva get

int ...get (key_t key, ..., int flag);
key: indentificatore chiave dell’oggetto:

  • valore intero arbitrario oppure ottenuto tramite ftok();
  • IPC_PRIVATE (0), costante usata per creare una nuova entry privata.

flag: indica la modalità di creazione e dei permessi di accesso, in OR (|).

  • IPC_CREAT (): crea una nuova entry se la chiave non esiste.
  • IPC_EXCL (): utilizzata con IPC_CREAT, crea una nuova entry ad uso esclusivo da parte del processo (ritorna un errore se l’entry già esiste).
  • Permessi relativi all’accesso, tramite codifica ottale (rwx rwx rwx).

Primitiva get

La creazione di un oggetto IPC causa anche:

  • l’inizializzazione di una struttura dati, diversa per i vari tipi di oggetto (…id_ds), contenente:
  • una struttura di permessi ipc_perm:

ushort cuid, cgid; // creator user & group id
ushort uid, gid; // owner user & group id
ushort mode; // r/w permissions

  • PID dell’ultimo processo che l’ha modificata
  • tempi dell’ultimo accesso o modifica

Primitiva ctl

int ...ctl (int desc, ..., int cmd, ...);
desc: indica il descrittore della risorsa;
cmd: specifica del comando da eseguire:

  • IPC_RMID: rimozione della risorsa indicata;
  • IPC_STAT: richiede informazioni statistiche sulla risorsa indicata;
  • IPC_SET: richiede al sistema la modifica di un sottoinsieme degli attributi della risorsa (es. permessi di accesso).

ipcs e ipcrm

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>:
    •  rimuove una data struttura, noto il suo identificatore;
    •  utilizzabile qualora i processi non abbiano rimosso le strutture allocate (es. in caso di terminazione anomala).

Memoria condivisa

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.

Memoria condivisa

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.


Memoria condivisa: Utilizzo

  • Creazione della SHM
  • Collegamento alla SHM
  • Uso della SHM
  • Scollegamento della SHM
  • Eliminazione della SHM

Modalità di condivisione

Due modalità

  1. richiesta esplicita: se un processo vuole usare una SHM esistente e ne conosce la chiave, può richiederla esplicitamente;
  2. tramite fork: un processo può “collegarsi” la SHM, dopodichè generare tramite fork i figli, i quali avranno automaticamente una copia del descrittore della SHM.

Note

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> 

Creazione

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.

Esempio

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.

Collegamento

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.

Operazione di controllo

int shmctl(int ds_shm, int cmd, struct shmid_ds * buff)

  • Invoca l’esecuzione di un comando su una SHM;
  • ds_shm: descrittore della memoria condivisa su cui si vuole operare;
  • cmd: specifica del comando da eseguire;
  • IPC_STAT, IPC_SET;
  • IPC_RMID: marca da eliminare, rimuove solo quando non vi sono più processi attaccati;
  •  SHM_LOCK: impedisce che il segmento venga swappato o paginato;
  • buff: puntatore ad una struttura di tipo shmid_ds con eventuali parametri per i comandi IPC_STAT e IPC_SET;
  •  restituisce -1 in caso di fallimento.

Operazione di controllo

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 */
};

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion

Fatal error: Call to undefined function federicaDebug() in /usr/local/apache/htdocs/html/footer.php on line 93