This is an old revision of the document!


Test Cursul 8

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).

so2/cursuri/curs08/test.1360455039.txt.gz · Last modified: 2013/02/17 09:53 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0