[so] multe intrebari:)
Cosmin Ratiu
cosminratiu at gmail.com
Mon Apr 19 21:49:23 EEST 2010
2010/4/19 Andreea b <andreea_rbd87 at yahoo.com>
>
> Am ceva intrebari, imi cer scuze daca intrebarile sunt "de baza" sau daca ar trebui sa stiu raspunsurile.
>
> Poate se mai lumineaza si altii :)
Salut, o sa incerc sa raspund eu, ca sa ma mai dezmortesc asa putin
:). Precizez ca nu pot garanta ca raspunsurile sunt corecte.
> 1. Am incercat sa imi dau cu presupusul in privinta exercitiului de mai jos, dar as vrea sa fiu sigura. Cum se gandeste?
>
> Un sistem fără TLB și cache accesează memoria folosind
> paginare neierarhică. Presupunând că timpul de acces la
> memorie este de 5ns și că o pagină de memorie ocupă 4KB, cât
> durează operațiile de mai jos? (sizeof(char) = 1)
> char a[4096 * 16];
> char b[4096 * 16];
> /* init a[i] */
> for (i = 0; i < 4096 * 16; i += 32) {
> b[i] = a[4096* 16 – i -1];
> }
Aici trebe sa numeri cate accese la memorie se fac. Dat fiind ca nu
avem nici TLB nici cache, e destul de simplu. a[ceva] e un acces,
b[ceva] e alt acces. Presupunem ca i e tinut intr-un registru.
> 2. Care e diferenta intre o memorie ierarhica si una neierarhica?
>
> Am inteles din linkul[1] rationamentul de la memoria ierarhica, dar nu si de ce pentru cea neierarhica se ocupa 4MB.
>
> Date
> – Spațiu virtual de adresare de 32 de biți
> – Pagina de 4K
> – Spațiul virtual al unui proces
> ● [.text 1020 pagini]
> ● [.data 4 pagini]
> ● [4096 pagini spatiu nemapat]
> ● [.stack 16 pagini]
> – O pagină din tabela de pagini conține 1024 de intrări
> ● Cât spațiu ocupă tabela de pagini în cazul folosirii:
> – paginării neierarhice
> – paginării ierarhice pe două niveluri (10 biți, 10 biți, 12 biți)
>
In cazul neierahic toata paginile de memorie sunt tinute intr-un
vector. Cate pagini sunt in total? 2^32 / 2^12 = 2^20.
De cate pagini avem nevoie pt. a tine tabela de pagini? 2^20 / 2^10 = 2^10.
Cat ocupa 2^10 pagini? 2^10 * 2^12 = 2^22 = 4MB.
> 3. In cele din urma ce depinde de ce si in ce proportii ?
>
> De la hard, memorie principala, swap, cache, TLB, tabela de pagini, pagini, magistrale si toate sub-sub-organizarile posibile :)
>
> exemplu din curs: Dimensiunea paginii (virtuale și fizice) este dată de hardware
> (512B – 4MB) (huge pages - 256MB)
>
> Cum e data?
Asta imi suna a intrebare la care trebuie sa spui ce ai inteles din
tot cursul. Nu exista un singur raspuns corect, trebuie sa fii inteles
ce se intampla de fapt si sa descrii concis.
> 4. Presupunand ca mi se da un cod, cum imi dau seama cand are loc un page fault?
>
> De cate ori scriu ceva intr-o pagina noua?
>
> int *p, i, status;
> p = (int *) mmap (NULL, sizeof(int) * 1024 * 1024, PROT_READ|PROT_WRITE, MAP_PRIVATE, 0, 0);
> for (i = 0; i < 1024; i++)
> p[i*1024] = i;
> switch(fork()) {
> case -1: /handle error */
> case 0: /* child process */
> for (i = 0; i < 512; i++)
> printf(“p[%d] = %d\n”, i*1024, p[i*1024]);
> for (i = 512; i < 1024; i++)
> p[i*1024] = 1024–i;
> exit(EXIT_SUCCESS);
> break;
> default:
> break;
> }
> wait (&status);
> for (i = 0; i < 1024; i++)
> p[i*1024] = i;
Paginile noi se mapeaza cand se acceseaza prima data o zona de
memorie. La prima intrebare nu stiu raspunsul momentan.
> 5. Date
> – TLB hit rate: 75%
> – Timp de acces la memorie: 60ns
> – Timp de acces la TLB: 10ns
> ● Care este media timpului de acces la memorie?
>
> 75% * 10ns + 25% * 60ns?
E mai complicat putin. TLB-ul contine doar translatarea adresa
virtuala -> adresa fizica. Trebuie sa mai si accesezi efectiv memoria
fizica. Hai sa luam cele 2 cazuri:
1) acces la memorie prin TLB dureaza 10ns (TLB-ul) + 60 ns (accesarea
efectiva a memoriei din pagina).
2) acces la memorie fara TLB dureaza (n + 1) * 60 ns, unde n e nivelul
de ierahizare a memoriei virtuale. De ce?
Pai...daca e un TLB miss, procesorul trebuie sa o ia pe calea
melcilor, prin page table. Ai n accese ca sa ajungi la adresa paginii
in sine. +1 acces pt. a ajunge la bucata dorita din interiorul
paginii.
Sa zicem ca n e 2. Atunci un acces la memorie fara TLB dureaza 180 de ns.
Media e atunci 75% * 70 ns + 25% * 180 ns.
Exista posibilitatea ca explicatia asta sa fie prea complicata sau sa
fi uitat ceva. In acest caz, va invit sa o corectati.
> 6. Dacă timpul copierii unei pagini este 1ms, ignorând timpul
> necesar altor operații (crearea de structuri interne, alocarea de
> pid-uri, copierea tabelelor de pagini etc.), care este timpul
> necesar apelului fork pe un proces cu un spațiu de adresă de
> 100MB? (pe un sistem de tip UNIX modern, cu dimensiunea unei
> pagini de 4K)
>
> Dat fiind ca se copiaza spatiul de adresa al parintelui pt procesul copil, iar resursele comune se partajeaza,
>
>
>
> 100MB/4K * 1ms ? Sau e o capcana ? :)
Exact, e o capcana. Cauta informatii despre copy-on-write. Fara
copy-on-write, fork() ar dura o vesnicie. Ca sa raspunzi la intrebare,
tre sa te gandesti exact ce se copiaza si ce nu.
>
> 7. Cand poate avea loc un context-switch in timpul rularii unui proces pe un sistem cu kernel preemptiv(la ce operatii)?
Context switch-ul e facut de scheduler, care e activat de interuperea
de timp sau explicit in anumite puncte cheie din kernel. Procesul tau
poate rula atat in user space, cat si in kernel (in timpul unui system
call). In userspace poate fi interupt oricand.
Mai interesant e ce se intampla in kernel. Procesul nu poate fi
intrerupt in anumite situatii cand face ceva sensibil, cum ar fi
spinlockuri, sectiuni rcu, in scheduler-ul insusi, etc. In rest, poate
fi schimbat daca un task mai prioritar vrea sa ruleze.
> 8. In cazul unui context switch, ce se schimba ?
>
> In afara de faptul TLB isi goleste o mare parte din intrari si registrele sunt schimbate total(puse pe stiva).
Toate intrarile din TLB sunt invalidate, pentru ca se schimba complet
tabela de pagini. In afara de ea, mai sunt registrele.
Sper ca nu am dezinformat prea mult,
Cosmin.
More information about the so
mailing list