This is an old revision of the document!
1. De ce nu este corectă următoare secvență de cod?
spin_lock(&spinlock); list_del_rcu(&p->list); spin_unlock(&spinlock); kfree(p);
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).