1 / 10

Comunicarea intre procese UNIX folosind zone comune de memorie (shared memory)

Comunicarea intre procese UNIX folosind zone comune de memorie (shared memory). Autor: Radu Mihai Ionut.

kynton
Download Presentation

Comunicarea intre procese UNIX folosind zone comune de memorie (shared memory)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Comunicarea intre procese UNIX folosind zone comune de memorie (shared memory) Autor: Radu Mihai Ionut

  2. 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.

  3. Memoria 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.

  4. Procese 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

  5. 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ă.   

  6. Functii utile 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.

  7. 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.

  8. 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

  9. 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ă

  10. 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

More Related