Transcript Prezentare1
Referatul cuprinde o mica ilustrare a conceptului de
memorie partajata, ce este un proces, comunicare
intre procese cu ajutorul memoriei partajate, cateva
functii utile folosite in lucrul cu memorie partajata.
Din punct de vedere al partii fizice a calculatorului memoria partajata se refera
la un bloc mare de memorie de acces aleator care poate fii accesata de mai
multe procesoare intr-un sistem multiprocesor.
Exista probleme cu sistemele de memorie partajata care pot interveni atunci
cand mai multe procesoare au nevoie de acces rapid la memorie si de obicei la
memoria cache.
Pot aparea urmatoarelele doua complicatii:
-conectarea procesor memorie ajunge la limita. Computerelele cu
memorie partajata nu pot sa tina pasul multe din ele avand doar 10 procesoare
-coerenta cache: cand un cache este reinnoit cu infomatie care poate
fii utilizata de celelalte procesoare schimbarea necesita sa fie reflectata
celorlalte procesoare, altfel celelalte procesoare vor lucra cu date incoerente.
Din punct de vedere al partii de programare a calculatorului memoria partajata
este o metoda de comunicare intre procese, o modalitate de a schimba date
intre programe care ruleaza in acelasi timp.
Un proces va crea o zona in RAM pe care un alt process o poate accesa. Din
moment ce ambele procese pot accesa zona de memorie partajata, ca o zona
de memorie normala, acesta este un mijloc foarte rapid de comunicatie.
Un proces UNIX este o entitate care executa o bucata de cod data, are
propriile executii, propriul set de pagini de memorie, propriul tabel pentru
descriptori de fisiere si un unic ID de proces.
Procesele nu se confunda cu programul, care este fişierul executat de proces.
Pe un sistem multitasking mai multe procese pot executa acelaşi program
concurent şi fiecare proces se poate autotransforma pentru a executa un
program anume.
Un proces consta din trei segmente: segmentul de instrucţiuni, segmentul de
date utilizator şi segmentul de date sistem. Programul este folosit pentru a
iniţializa primele doua segmente, după care nu mai exista nici o legătura intre
procesul şi programul pe care-l executa. Datele sistem ale unui proces includ
informaţii ca directorul curent, descriptori de fişiere deschise, cai implicite,
tipul terminalului, timp CPU, etc
Principiul comunicarii prin zone de memorie
consta in urmatoarelele:
- Un proces creează o zonă de memorie comună. ID acestui
proces va fi trecut în informaţiile structurii de date ataşate.
- Procesul creator asociază zonei de memorie comună o
cheie numerică, pe care toate procesele care comunică între
ele trebuie să o cunoască. Intern, zona de memorie comună
este recunoscută printr-un identificator, shmid.
-Procesul creator fixează drepturile de acces ale altor
procese la zonă respectivă de memorie.
Pentru ca un proces (inclusiv cel creator) să poată
scrie sau citi în/din zona comună, el trebuie să şi-o ataşeze
la spaţiul virtual de adrese. În urma ataşării, se obţine adresa
zonei de memorie comună.
Crearea si deschiderea unui segment de memorie partajata se realizeaza
cu ajutorul apelului sistem shmget. El are o structura de urmatoarea forma:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget (key_t cheie, int dim, int ind);
Apelul returneaza in shmid un identificator al segmentului nou creat, care
este local procesului. Daca apelul esueaza in crearea segmentului de memorie
partajata, este intoarsa valoarea -1, iar eroarea va fi documentata in variabila
globala errno.
Parametri:
- cheie este de tipul key_t, dependent de implementare, dar de obicei un long.
- dim este cel care specifica dimensiunea in octeti a segmentului de memorie
partajata care se doreste a fi creat.
- ind, specifica drepturile de acces la segment.
Pentru a atasa segmentul de memorie la proces exista apelul shmat (attach
shared memory). Interfaţa funcţiei este următoarea:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
char *shmat( int shmid, void *adr_mem, int ind);
Returnează pointerul la zona de memorie comună în caz de succes, (-1) în caz de
eroare.
Parametri:
-shmid reprezintă ID zonei de memorie comună obţinut prin apelul funcţiei shmget;
- adr_mem este un parametru care, în funcţie de valorile sale, fixează adresa de
ataşare a zonei de memorie comună la segmentul de date al procesului apelant.
-ind indică modul de determinare a adresei de ataşare (SHM_RND) şi accesul la
zona comună: protejată la scriere (SHM_RDONLY) sau nu.
O alta functie folosita foarte des si intalnita totodata in lucrul cu zone de
memorie partajate este shmctl. Apelul ei poate elibera segmentele alocate si
poate scrie sau citi structurile de control.
int shmctl (int shmid, int cmd, struct shmid_ds *buf);
Întoarce 0 în caz de succes, sau -1 în caz de insucces.
Parametri :
shmid - un ID obtinut în urma unui apel shmget
cmd:
- IPC_SET - setează uid/gid pentru proprietar si câmpul
shm_perms.mode
- IPC_RMID - segmentul e marcat pentru stergere, dar e sters numai
la ultimul detach
-IPC_STAT - structura shmid_ds e copiată în bufferul alocat de user
buf - folosit pentru citirea (cu IPC_STAT) sau scrierea (cu IPC_SET) a
informatiei
Erori :
EACCES – Nu ai permisie pentru accesul cerut
EFAULT – buferul nu este accesibil.
EINVAL - shmid < 0 sau nefolosit.
EIDRM – identificator distrus
Limitări :
SHMMNI : 4096; numărul maxim de segmente partajate în întregul
sistem
SHMMAX : 4M; dimensiunea maximă a unui segment de memorie
partajată, în octeți
SHMMIN : 1 octet; dimensiunea minimă a unui segment de
memorie partajată; practic este egală cu PAGE_SIZE
SHMALL : dimensiunea maximă a memoriilor partajate în sistem
SHMLBA : PAGE_SIZE; segment low boundary address multiple;
aliniat la pagină
Concluzii
Folosirea memoriei partajate ofera o metoda eleganta si rapida
de comunicatie intre doua procese care acceseaza in comun o zona de
memorie interna. Aceasta zona poate fi folosita de oricare dintre
procesele din sistem care ii cunosc cheia.
Din pacate memoria partajata nu este disponibila in orice
implementare de Unix System V pentru ca numai anumite configuratii
hardware permit acest lucru.
Programarea defectoasa a accesului la memoria partajata a mai
multor procese poate duce usor la blocaje.
Memoria partajata este una din cele mai rapide metode de
comunicatie intre procese.
Bibliografie:
[1]http://www.cs.pub.ro/~so/index.php?section=Laboratoare&file=06.%20IPC%20(2)
#Memorie_partajat.C4.83
[2] http://www.ecst.csuchico.edu/~beej/guide/ipc/shmem.html
[3]http://en.wikipedia.org/wiki/Shared_memory
[4] http://www.cs.cf.ac.uk/Dave/C/node27.html
[5] http://fscked.org/writings/SHM/shm.html
[6] http://users.utcluj.ro/~somodi/so2/lab1314.html