Bine v-am gasit pe ItAssistant.org. Va aducem de aceasta data un set de intrebari centrate pe Sisteme de Operare, care vor necesita un nivel mediu spre avansat de cunostinte. De asemenea oferim si raspunsurile pentru aceste intrebari.
1. Care din urmatoarele instructiuni ar putea suprascrie adresa de retur a unei functii? (my_func este o functie) Motivati si precizati contextul in care se poate intampla. (Poate fi un singur raspuns, raspunsuri multiple, nici unul, toate raspunsurile)
long *a = malloc(30); /* definire si alocare */ /* instructiuni */ a) a = my_func; b) *(&a + 4) = my_func; c) *(a + 0x4000000) = my_func; d) memcpy(my_func, a, sizeof(void *));
Cuvant cheie: ar putea. Unele situatii sunt improbabile dar posibile.
Inainte de toate:
- a este o variabila (de tip pointer)
- a rezida pe stiva
- &a este adresa pe stiva a variabilei a
- a (valoarea a) este o adresa de heap (puncteaza catre zona de 30 de octeti alocata folosind malloc)
- in general, heap-ul creste in sus si stiva creste in jos
- my_func este o functie deci rezida in .text (zona de cod)
a) nu are un efect; se suprascrie valoarea lui a cu adresa functiei my_func
b) posibil; daca exista unele variabile intre [ret][ebp] si [a] atunci &a+4 poate puncta catre adresa unde se gaseste valoarea de retur si *(&a + 4) o poate suprascrie
c) posibil; a+0×4000000 inseamna adunarea a 0×4000000 la o adresa de heap (valoarea lui a); se poate ajunge (greu probabil, dar posibil) la o adresa de retur de pe stiva
d) ciudata, se suprascrie o informatie din zona de cod (zona read only); pot aparea erori de acces sau comportanent nedeterminist (in nici un caz nu suprascrierea adresei de retur dintr-o functie)
2. Un program executa urmatoarea secventa de cod:
for (i = 0; i < BUFLEN; i++) printf("%c", buf[i]); iar altul for (i = 0; i < BUFLEN; i++) write(1, buf+i, 1);
Care secventa dureaza mai mult? De ce?
Functia printf foloseste buffering-ul din libc. Acest lucru inseamna ca, pana la indeplinirea uneia dintre cele trei actiuni de mai jos, nu se face apel de sistem:
- se umplu buffer-ele
- se apeleaza fflush(stdout)
- se transmite newline (n)
Apelul de sistem write face apel de sistem de fiecare data rezultand un overhead important.
3. Care este avantajul configurarii intreruperii de ceas la valoarea de 1ms? Dar la valoarea de 100ms?
- 1ms - timp de raspuns scurt, interactivitate sporita, fairness, sisteme desktop (intreruperi dese, se diminueaza timpul de asteptare pentru fiecare proces
- 100ms -productivitate (throughtput) sporita, sisteme server (mai putine context switch-uri, mai mult timp pentru “lucru efectiv”)
4. Pe un sistem ruleaza 50 de procese. La un moment dat este pornita o masina virtuala VMware Server pe care ruleaza 50 de procese. Cate procese vor rula pe sistemul gazda? Dar in cazul pornirii unei masini virtuale OpenVZ pe care ruleaza 50 de procese?
O masina virtuala VMware Server este reprezentata pe sistemul gazda de un singur proces. Vor exista, in total, 51 de procese.
O masina virtuala (container) OpenVZ are, pe sistemul fizic, un corespondent pentru fiecare proces. Vor exista, in total, 100 de procese.
5. Cum se modifica spatiul de adresa al unui proces la schimbarea de context intre doua threaduri?
Nu se modifica. Threadurile partajeaza spatiul de adresa al procesului.
6. Biblioteca standard C ofera programatorului functia calloc (alocare cu zeroing). De ce este nevoie si de oferirea functiei malloc?
Functia malloc este mai rapida – nu face zeroing si permite demand paging.
7. Fie secventa de program de mai jos:
int main(void) { char *a; int i; for (i = 0; i < 10; i++) a = malloc(1); return 0; }
La rulare se observa (prin folosirea unui profiler) ca primul apel malloc dureaza semnificativ mai mult decat celelalte 9. Care este motivul?
Toate apelurile reusesc (intorc o adresa valida) si nu exista nici o modificare adusa apelului malloc.
Primul apel malloc genereaza un page fault, urmarea fiind alocarea unei pagini fizice intregi (chiar daca se solicita alocarea unui singur octet). Urmatoarele apeluri vor aloca octeti din cadrul aceleiasi pagini – nu mai este generat un page fault si nu se aloca alte pagini.
8. Cate procese se vor crea in urma executiei secventei de mai jos (se exclude procesul curent)? Toate apelurile fork se intorc cu succes.
fork(); if (fork() == 0) fork();
Apelul fork() intoarce 0 in procesul copil si cu PID-ul procesului copil in parinte
Fie P1 primul proces (cel existent).
Dupa linia 1 primul proces creeaza un proces copil, P2. Intrucat nu se verifica valoarea de iesire a apelului fork, ambele procese (P1 si P2) vor continua cu linia 2
In cadul liniei 2 cele doua procese de mai sus creeaza cate un proces copil. Fie P3 procesul copil pentru P1 si P4 procesul copil pentru P2. In cadrul liniei se verifica valoarea intoarsa de apelul fork. Doar procesele copil proaspat create vor satisface conditia if (fork() == 0). Adica foar procesele P3 si P4 vor continua la linia 3.
In cadrul liniei 3, procesele P3 respectiv P4 creeaza cate un proces copil; fie acestea P5 si P6.
La sfarsitul sectiunii vor exista 6 procese: procesul initial (P1) si 5 noi procese create (P2, P3, P4, P5, P6).
9. Fie secvenţele de pseudocod de mai jos. Care din cele doua abordari este optima?
mutex_lock(&mutex); a++; mutex_unlock(&mutex);
spin_lock(&spinlock); a++; spin_unlock(&spinlock);
Secventele de mai sus urmaresc accesul exclusiv pentru incrementarea variabilei a. Incrementarea variabilei a este o operatie rapida si putin consumatoare de timp. Se doreste, asadar, un mecanism de sincronizare/asigurare a accesului exclusiv cat mai rapid. Acest mecansim este asigurat de spinlock-uri care opereaza foarte rapid in cadrul primitivelor spin_lock si spin_unlock. In vreme ce o operatie pe un mutex impune contactarea planificatorului, spinlock-ul impune o operatie de busywaiting
10. Care dintre apelurile sigaction si sigemptyset va dura mai mult? sigaction actualizeaza rutina de tratare a unui semnal, iar sigemptyset initializeaza setul de semnale descris de structura sigset_t la 0.
Sigaction este apel de sistem si are un overhead inerent. sigemptyset opereaza la nivelul bitilor dintr-o zona de memorie, operatie foarte rapida si care nu dispune de un overhead suplimentar. In consecinta, durata sigaction este vizibil mai mare decat durata sigemptyset.
Related posts:
- Intrebari si raspunsuri pentru interviurile Java
- Protejarea impotriva atacului fork bomb
- Intrebari si raspunsuri pentru interviurile C
- Intrebari si raspunsuri pentru interviu C
- Intrebari si raspunsuri pentru interviu C


