This shows you the differences between two versions of the page.
so2:cursuri:curs08:test [2013/02/10 02:10] 127.0.0.1 external edit |
so2:cursuri:curs08:test [2013/02/17 09:53] (current) razvan.deaconescu |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Test Cursul 8 ====== | ====== Test Cursul 8 ====== | ||
- | 1. **De ce nu este corectă următoare secvență de cod?** | + | * TODO |
- | <code> | + | |
- | spin_lock(&spinlock); | + | |
- | list_del_rcu(&p->list); | + | |
- | spin_unlock(&spinlock); | + | |
- | kfree(p); | + | |
- | </code> | + | |
- | + | ||
- | Se folosește RCU deci nu mai este necesar locking-ul. Pentru a garanta faptul că toți cititorii au trecut de {{{p}}} trebuie folosit {{{synchronize_rcu}}} în loc de {{{spin_unlock}}} (nimic în loc de {{{spin_lock}}}. Pe majoritatea arhitecturilor, apelul nu face decât o barieră pentru operațiile de read și write. | + | |
- | + | ||
- | O variantă a codului care nu ar folosi RCU ar avea și {{{kfree}}} în interiorul zonei protejate. | + | |
- | + | ||
- | 2. **Pentru un TLB cu 64 de intrări și costul unui miss de 100ns, care este costul re-umplerii TLB-ului în cazul unui apel de sistem pentru un split user/kernel 4/4 și respectiv 3/1?** | + | |
- | + | ||
- | Pentru un kernel 3/1 se invalidează TLB-ul la schimbarea de context. În rest, costul e dat de numărul de intrări care trebuiesc actualizate. | + | |
- | + | ||
- | În cazul unui kernel 4/4 tot TLB-ul se invalidează, rezultând un cost de 6.4us. | + | |
- | + | ||
- | 3. **Ce fragmentare internă avem pentru alocarea unui bloc de memorie de 34 de octeți folosind kmalloc? Dar dacă folosim kmem_cache_create? (slab)** | + | |
- | + | ||
- | Apelul {{{kmalloc}}} folosește slab în spate. El caută un cache de dimensiune putere a lui 2 și alocă spațiu de acolo. Deci, folosind {{{kmalloc}}} fragmentarea este de 30 de octeți. | + | |
- | + | ||
- | Folosind {{{kmem_cache_create}}} ne creăm un slab de obiecte de dimensiune 34 (36 dacă avem restricție de aliniere) și fragmentarea va fi 0 (2). | + |