Teme:Utilizare IPC

Termen de predare : Vineri, 17 Aprilie 2009, 23:59 = Enunt = Sa se implementeze un protocol simplu client - server folosind mecanisme IPC. Serverul intretine o tabela de dispersie (hashtable), continand cuvinte, in care se fac inserari si stergeri comandate de mesajele primite de la clienti.

Clientii sunt comandati prin argumentele primite in linia de comanda la lansarea in executie:

./client a vincent a test r vincent

va trimite serverului, in ordine, mesajele: adauga in hashtable cuvantul "vincent", adauga cuvantul "test", sterge cuvantul "vincent".

Lista completa de comenzi pe care le poate primi clientul este:
 * a S: trimite serverului mesajul de adaugare in hashtable a cuvantului S;
 * r S: trimite serverului mesajul de eliminare din hashtable a cuvantului S;
 * c: trimite serverului mesajul de golire a continutului tabelei (clear);
 * s m: clientul face sleep pentru m milisecunde;
 * p: clientul afiseaza la standard output continutul tabelei (formatul este precizat mai jos);
 * e: clientul ii spune serverului sa isi incheie executia.

Exemple:

./client a test a count a foobar r count r test s 1000 p

./client a foo a bar s 1000 e

Formatul de afisare
Afisarea tabelei se va face dupa chei: cate un "bucket" pe linie, in ordinea crescatoare a cheii (valorii hash, valoarea de dispersie), cu cuvintele din acesta separate prin spatiu.

Prin bucket se intelege structura de date (lista sau tablou) care retine elementele cu aceeasi cheie (valoare returnata de functia de dispersie).

De exemplu pentru o tabla ce contine cuvinte in doar 2 din bucket-uri, afisarea va fi:

doctor gachet starry night

= Precizari generale =


 * Valorile introduse in hashtable sunt cuvinte [A-Za-z].
 * Un tablou nu poate contine duplicate.
 * Constantele relevante pentru tablou si datele de intrare sunt definite in hash.h
 * Inserarea intr-un tablou (bucket) se face la finalul acestuia.
 * Functia de hash ce trebuie folosita (in intreaga tema) este definita in hash.c.
 * Clientii trebuie sa execute comenzile in ordine, asa cum au fost primite in linia de comanda.
 * Pentru comunicatia client-server se vor folosi cozi de mesaje (MailSlots in Windows).
 * Pot exista mai multi clienti care comunica simultan cu serverul. Operatiile pe care le face serverul trebuie sa respecte ordinea temporala data de primirea mesajelor de la clienti.
 * Din motive de eficienta, este obligatoriu sa se foloseasca memorie partajata pentru operatia de print: serverul va mentine tabela in memoria partajata iar clientul va citi aceasta aceasta zona de memorie de fiecare data cand are nevoie sa faca print.
 * Pentru sincronizare se vor folosi numai semafoare, atat pe Linux cat si pe Windows.
 * Sincronizarea trebuie sa fie "fine grained", adica la nivel de bucket (sau grupare de buckets). Nu este acceptabila existenta unui singur obiect de sincronizare pentru toata tabela!
 * Dimensiunea memoriei partajate poate fi fixa (nu este nevoie sa fie extinsa).
 * In memoria partajata se retine structura si nu reprezentarea serializata (ca sir de caractere) a acesteia.

= Testare =

Pentru simplificarea procesului de corectare al temelor, dar si pentru a reduce greselile temelor trimise, corectarea temelor se va face automat cu ajutorul unor teste publice (Linux, Windows).

Formatul afisarii, asa cum a fost descris mai sus, este obligatoriu.

In urma compilarii temei trebuie sa rezulte doua executabile: server (respectiv server.exe pentru Windows) si client (respectiv client.exe pentru Windows). Numele acestor executabile trebuie sa fie respectat.

Se vor acorda cate un punct pentru fiecare dintre cele 9 teste. Nota mai poate fi modificata prin depunctari suplimentare:


 * -0.6 sincronizare incorecta pe resursele partajate de mai multe procese (inclusiv sincronizare pe intreaga tabela acolo unde nu este cazul)
 * -0.6 neverificarea conditiilor de eroare sau/si neeliberarea de resurse
 * -0.1 pentru makefile incorect
 * -0.2 pentru README necorespunzator
 * -0.2 pentru surse prost comentate
 * -0.1 diverse alte probleme constatate in implementare

= Precizari =

Windows
Tema se va rezolva folosind doar functii Win32. Se pot folosi de asemenea si functiile de formatare printf, scanf, functiile de alocare de memorie malloc, free si functiile de manipulare a sirurilor de caractere (strcat, strdup, etc.)

Linux
Procesul server trebuie sa fie implementat ca daemon.

Tema se va rezolva folosind doar functii POSIX. Se pot folosi de asemenea si functiile de formatare printf, scanf, functiile de alocare de memorie malloc, free si functiile de manipulare a sirurilor de caractere (strcat, strdup, etc.)

Pentru partea de IPC se vor folosi functiile POSIX (shm_*, mq_*, sem_*) si nu cele SysV!

= Întrebări =

Pentru întrebări sau nelămuriri legată de temă puteți căuta, consulta sau [mailto:so@cursuri.cs.pub.ro trimite un mail pe] lista de discuții (trebuie să fiți înregistrați).