Urmăriți precizările din pagina de reguli.
Puteți participa la o singură sesiune de examen final.
[SO][Lucrare X] Transfer Prenume Nume, Grupa
unde:X
este indexul lucrării (1, 2, 3 sau 4)Prenume
este prenumele.Nume
este numa.Grupa
este grupa.[SO][Lucrare X] Prenume Nume, Grupa
; de exemplu [SO][Lucrare 1] Andreea Popescu, 332CA
.dup()
?dup()
este folosit practic pentru redirectarea ieșirii, intrării sau erorii standard în fișier. Altă situație practică este pentru operatorul |
(pipe) de comunicare între procese.wait()
este un apel blocant. Când are loc deblocarea procesului blocat în wait()
?wait()
atunci când unul dintre procesele sale copil își încheie execuția. În acel moment, apelul wait()
se deblochează și întoarce informații despre modul în care și-a încheiat procesul copil execuția.fread
, fwrite
) și care este un avantaj al celor de tipul system I/O (precum read
, write
)?system I/O
nu alocă memorie suplimentară pentru buffering, sunt mai economice din acest punct de vedere.fork()
că este invocat o dată dar se întoarce de două ori?write
(poate scrie dincolo de limita unui fișier), ftruncate
(modifică chiar câmpul dimensiune) sau open
cu argumentul O_TRUNC
care reduce dimensiunea fișierului la 0.RUNNING
în starea READY
.RUNNING
în starea READY
atunci când îi expiră cuanta de rulare sau când există un proces cu prioritate mai mare în coada READY
(care să îi ia locul).100MB
de memorie fizică (RAM) rezidentă. P1 execută fork()
și rezultă procesul P2. Câtă memorie fizică (RAM) rezidentă folosesc împreună P1 și P2 imediat dupa fork()
? De ce?fork()
folosește copy-on-write ceea ce înseamnă că nu se alocă memorie rezidentă nouă pentru noul proces. Se alocă, într-adevăr, o nouă tabelă de pagini, dar spațiul rezident al procesului P1 este acum partajat cu procesul P2 până la prima operație de scriere, când pagina aferentă va fi duplicată.starvation
(așteptare nedefinită pentru ca un proces să poată rula pe procesor)..text
și .rodata
din cadrul bibiliotecilor partajate (shared libraries
) pot fi partajate între mai multe procese?.text
și .rodata
sunt zone read only. Acest lucru înseamna că pot fi partajate în siguranță pentru că nici un proces care accesează zona nu o va putea modifica. Zonele conțin permanent aceleași informații indiferent de numărul de procese care le folosesc și pot fi, deci, partajate.READY
a planificatorului. Pentru un sistem interactiv/responsiv este de dorit ca timpul de așteptare să fie cât mai scurt.SIGSEGV
, Segmentation fault) către procesul care a generat page fault-ul.TSL
(test and set lock) la nivelul procesorului?TSL
sau cmpxchg
) nu ar fi posibilă implementarea unor mecanisme precum spinlock-uri. Astfel de instrucțiuni vor fi disponibile pentru orice procesor pentru a permite implementarea mecanismelor de sincronizare.int (*fn_ptr)(int, int); /* fn_ptr is a function pointer */ char buffer[128]; /* buffer for storing strings */
fn_ptr
. Probabil acest pointer va fi folosit la un moment dat rezultând în execuția arbitrară și alterând fluxul normal de execuție al programului.lock()
și unlock()
ieftine prin comparație cu mutex-ul. Operațiilor de lock()
și unlock()
pe mutex sunt de obicei costisitoare întrucât pot ajunge să invoce planificatorul. Având operații rapide, spinlock-ul este potrivit pe secțiuni critice de mici dimensiuni în care nu se fac operații blocante; în aceste cazuri faptul că face busy-waiting nu contează așa de mult pentru că va intra rapid în regiunea critică. Dacă am folosi un mutex pentru o regiune critică mică, atunci overhead-ul cauzat de operațiile pe mutex ar fi relativ semnificativ față de timpul scurt petrecut în regiunea critică, rezultând în ineficiența folosirii timpului pe procesor.execve
?execve(”/bin/sh”)
. Întrucât un apel de bibliotecă este mai dificil de realizat, se preferă o instrucțiune simplă de apel de sistem (precum int 0x80
. Se face un apel de sistem execve
cu un argument de forma unui șir /bin/sh
într-un registru rezultând în crearea unui shell nou.wait()
pentru așteptarea îndeplinirii unei condiții după care thread-ul curent va rula;notify()
sau signal()
pentru a anunța thread-ul/thread-urile blocate în operația wait()
de îndeplinirea condiției.send()
cu 1024
de octeți de date, iar apelul send
întoarce 1024
. Alegeți varianta corectă de mai jos și argumentați: În acest moment, aplicația sender poate fi sigură că datele au fost livrate cu succes cătresend()
și recv()
buffere de dimensiuni mari (de exemplu mai mari decât 100KB
).N
subdirectoare. Câte hard link-uri pointează la acest director?N+2
hard link-uri. N
hard link-uri sunt date de intrarea ..
(dot dot) a fiecărui subdirector (link către directorul părinte). Celelalte două hard link-uri sunt numele directorului și intrarea .
(dot) care referă directorul însuși.send()
pe un socket se blochează?send()
pe socket se blochează în situația în care buffer-ul din kernel (send buffer) nu dispune de loc pentru copierea datelor din buffer-ul de user space. Sau, în anumite cazuri, precum în cazul sockeților non-blocanți, dacă nu există nici măcar 1 octet liber în buffer-ul de kernel (send buffer).lseek()
nu are sens pe dispozitive de tip caracter, ci doar pe dispozitive de tip bloc?lseek()
are sens.recv()
comandat pentru citirea a 789
de octeți, se citesc 123
de octeți. Cum se explică citirea unui număr mai mic de octeți decât cel comandat?123
de octeți erau disponibili în buffer-ul din kernel aferent socket-ului (receive buffer). În această situație apelul recv()
se întoarce cu numărul de octeți disponibili (123
) deși exista spațiu mai mare (789
) în buffer-ul din user space.