Table of Contents

Hackathon SO

Hackathon-ul presupune rezolvarea unui exercițiu propus de către echipa de Sisteme de Operare, din materia parcursă în cadrul cursului si laboratoarelor de SO. Exercițiul este propus spre a fi rezolvat de către o echipă de 2 studenți înscriși la cursul de Sisteme de Operare. Primele 3 cele mai bune implementări vor fi recompensate cu premii. În timpul desfășurării hackathon-ului, echipele vor primi ajutor din partea echipei de SO.

Obiective

Data

Sâmbătă, 20 mai 2023, în intervalul 9:00 - 17:00.

Locație

Hackathonul se desfășoară în format fizic în sala PR706.

Precondiții

  1. La acest hackathon vor putea participa studenții înscriși la cursul de SO în anul universitar 2022-2023;
  2. Participanții vor forma echipe de câte două persoane;
  3. Participanții vor lucra pe propriile sisteme.

Înscriere

Echipele participante se vor putea înscrie la hackathon prin completarea formularului de aici până pe data de 17 mai 2023, ora 20:00. Se vor alege maxim 20 de echipe.

Regulament

  1. Codul versionat trebuie să fie adăugat într-un repository privat folosind platforma GitLab a facultății. Faceți un repo privat în care adăugați asistenții supraveghetori și un README cu componența echipei.
  2. Codul trebuie să treacă un set de teste puse la dispoziție de către echipa de SO.

Submisie

Submisiile vor fi încărcate pe Moodle .

Premii

Fiecare membru al echipelor câștigătoare va fi premiat, în funcție de locul obținut:

  1. Premiul 1: voucher eMag în valoare de 900 lei
  2. Premiul 2: voucher eMag în valoare de 800 lei
  3. Premiul 3: voucher eMag în valoare de 700 lei

Echivalare

Toate echipele participante sunt eligibile de echivalarea unui punct din notele pentru temă în cadrul materiei Sisteme de Operare (în funcție de complexitatea implementării și stadiului proiectului dezvoltat în timpul hackathonului).

Anunțare câștigători

Echipele câștigătoare vor fi anunțate până joi, 25 mai 2023.

Dezvoltarea aplicației

Dezvoltarea trebuie făcută exclusiv pe mașinile virtuale SO.

Nu rulați testele local (pe calculatoarele voastre sau în mașinile voastre virtuale). Pot să apară diferențe între local și VM-uri, iar, pentru corectare, vom considera doar rezultatele obținute în mașina virtuală de la SO.

Loader de funcții lambda

Proiectul constă în realizarea unui sistem care permite încărcarea dinamică a unor biblioteci și executarea unor funcții din acestea. Proiectul implementează o arhitectură de tip client - server, unde serverul primește cereri de rulat funcții dintr-o anumită bibliotecă dinamică din sistem.

Funcționalitatea este primul pas spre implementarea unei funcționalități similare AWS Lambda, unde utilizatorul poate să încarce o funcție și să o execute pe diferite servere, la cerere; în cazul proiectului propus, funcțiile sunt deja implementare în biblioteci, iar clientul cere executarea anumitor funcții printr-o comandă trimisă serverului. Mai jos sunt detaliate cerințele principale ale temei, precum și posibile îmbunătățiri.

Detalii și observații implementare

Pentru implementare se pune la dispoziție funcționalitatea de primire de comenzi (folosind UNIX sockets), care conțin numele unei biblioteci (calea către fișierul cu biblioteca) și opțional numele unei funcții. O comandă trimisă de la client către server are următorul format: <libname> [<funcname> [<filename>]] unde:

Datele rezultate în urma execuției vor fi scrise într-un fișier al cărui nume este întors ca răspuns clientului. Fișierul returnat va conține doar mesajele afișate la standard output de către funcția de bibliotecă apelată.

Comunicarea între client și server este următoarea:

Client						    Server
						    listen()
connect()					    accept()
send()     -—---libname [funcname [filename]]-----> recv()
recv()     <--------------outputfile--------------- send()

După primirea și parsarea unui mesaj din partea unui client, serverul apelează secvențial o serie de funcții care au următoarele scopuri:

Cele 5 funcții au caracter orientativ. În funcție de implementare, unele funcții pot să nu fie implementate. În acest caz, funcțiile vor rămâne ca stub-uri.

Implementarea serverului trebuie paralelizată astfel încât cererile clienților să fie tratate cât mai rapid. Fiecare echipă trebuie să decidă modelul de paralelizare (prin procese, prin threaduri, hibrid, folosirea unui work pool etc.) luând în considerare scopul proiectului.

Funcționalitatea de bază presupune implementarea în C, pentru sistemul de operare Linux, folosind API-ul POSIX:

Aveți în vedere faptul că în implementarea voastră trebuie să asigurați buna funcționare a serverului: executarea funcțiilor dintr-o bibliotecă cerută de utilizator poate avea comportament neașteptat (ex. accese invalide, închideri forțate etc.). Implementarea serverului trebuie să fie robustă, iar serverul trebuie să își continue execuția și în aceste cazuri.

Concepte teoretice necesare

De ce este nevoie pentru implementarea proiectului propus:

Testare

Exemplu rulare
## pornirea serverului
so@so:~/skel$ ./server
 
## client
# se execută funcția "run" din libbasic.so
so@so:~/checker$ ./client $(realpath libbasic.so)
Output file: /home/so/checker/output/out-cfy0fl
so@so:~/checker$ cat /home/so/output/out-cfy0fl 
run
 
# se execută funcția "function" din libbasic.so
so@so:~/checker$ ./client $(realpath libbasic.so) function
Output file: /home/so/checker/output/out-vc7s03
so@so:~/checker$ cat /home/so/output/out-vc7s03 
function
 
# se execută funcția "cat" din libbasic.so cu argumentul "/home/so/checker/Makefile"
so@so:~/checker$ ./client $(realpath libbasic.so) cat $(realpath Makefile)
Output file: /home/so/checker/output/out-y732bN
so@so:~/checker$ cat /home/so/output/out-y732bN 
CC=gcc
[...]
Rulare Checker

Aveți la dispoziție un checker pentru verificarea parțială a implementării voastre.

so@so~$ cd checker
so@so~$ ./checker.sh

Task-uri adiționale / departajare

Funcționalitatea de bază este obligatorie pentru toate echipele participante. Pe lângă aceasta, pentru departajare, fiecare echipă poate aduce funcționalități adiționale aplicației. Fiecare funcționalitate extra va fi descrisă într-un fișier README (ce presupune și cum ați testat).

Câteva funcționalități extra pe care le puteți avea în vedere (puteți propune voi orice altceva vi se pare necesar):