Citat din enuntul temei:<br>"Daca nu mai sunt pagini fizice libere, biblioteca trebuie sa evacueze o pagina fizica in swap. Paginile din swap trebuie aduse in memoria fizica, atunci cand ele sunt accesate."<br><br>In tema nu se specifica insa nicaieri &lt;&lt;pe ce pozitie in swap&gt;&gt; se va evacua pagina fizica. Din pacate, eu am ales varianta in care sa mentin intr-o tabela, similara cu page table-ul, indicii paginilor din swap la care se gasesc pagini din memoria virtuala. <br>Dupa ce m-am uitat atent pe codul test.c, mi-am dat seama ca alegerea facuta de mine a fost proasta, avand in vedere modul in care se face testarea. Si anume, citez din test.c, functia check_swap:<br><br>&nbsp;for (i = 0; i &lt; ppages; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lseek (ram_fd, i * p_sz + offset, SEEK_SET);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j = 0; j &lt;
 checks; j++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; read (ram_fd, &amp;read_val, 4);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (j == 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; page_id = read_val &gt;&gt; 16;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapped_vpages[i] = page_id;&nbsp; /// POS #1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>[.....]<br>&nbsp;&nbsp;&nbsp;&nbsp;
 &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; swap_count++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lseek (swap_fd, i * p_sz + offset, SEEK_SET);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j = 0; j &lt; checks; j++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; read (swap_fd, &amp;read_val, 4);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (j == 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; page_id = read_val &gt;&gt; 16; ///
 POS#2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (k = 0; k &lt; ppages; k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (page_id == mapped_vpages[k] &amp;&amp; have_count != 0) /// POS#3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; check = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; check &amp;=
 !(page_id ^ (read_val &gt;&gt; 16));<br><br>am incheiat citatu ! :D<br><br>Dupa cat am inteles eu din codul functiei check_swap, dupa cum se vede la POS#1 , se memoreaza in mapped_vpages niste id-uri de pagini virtuale, care se calculeaza pe baza valorilor stocate in RAM ( ugly hack, btw ). Apoi, in bucla de verificare a swap-ului, se calculeaza page_id-ul paginiii aflate in swap tot pe baza valorii citite din pagina din swap - vezi POS#2. Testul se asteapta, apoi, ca valoarile sa coincida - vezi POS#3 . Aceasta are loc daca, de exemplu, memoria SWAP ar fi indexata la fel ca si memoria virtuala, i.e. daca am pagina virtuala #tz , mapata pe pagina fizica #sh , si swapperul decide sa evacueze #sh din memoria RAM, pentru a face loc pentru alte pagini virtuale in RAM, atunci pagina #tz din memoria virtuala se asteapta de catre test sa fie mapata tot pe pozitia #tz in memoria swap!!! Am dreptate?<br><br>Daca da , atunci eu consider ca macar acest lucru trebuia specificat clar
 in enuntul temei, pt ca este un detaliu de implementare care poate impiedica trecerea anumitor teste. Nu consider ca este corect/...&nbsp; ca, inainte sa ne apucam de o tema, noi sa trebuiasca mai intai sa citim testele si sa deducem de acolo cum ar trebui sa se comporte programul la rulare. <br><br>Eu am ales ca pagina #tz sa fie mapata la swap_table[#tz], care poate fi diferint de #tz. Ma mir insa de ce nu imi pica testul...<br><br>Dar , in mod surprinzator, nu din aceasta cauza tema mea pica testele... Se pica la testul init2, subtestul swap_count. Acest test verifica daca swap_count ==have_count:<br><br>if (have_count != 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test ("swap_count", swap_count == have_count);<br><br>Acuma, sa ne uitam cum se calculeaza swap_count:<br><br>[.............................]<br>&nbsp;&nbsp;&nbsp; swap_count = 0;<br>&nbsp; for (i = 0; i &lt; vpages; i++)
 {<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lseek (swap_fd, i * p_sz + offset, SEEK_SET);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; read (swap_fd, &amp;read_val, 4);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (read_val == SWAP_POISON)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swap_count++;<br>[......................]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>Din ce am inteles eu, swap_count este egal cu vpages la finalul buclei, asta doar daca nu avem SWAP_POISON, si nu avem asa ceva in testul init2. Deci: in momentul apelului &nbsp; test ("swap_count", swap_count == have_count); , swap_count ==
 3, si have_count == 1 ,&nbsp; caci asa a fost apelata check_swap in run_test2. <br><br>Intrebarea : de ce asa ??? Ce rol are have_count asta, ca din cod eu personal nu pot sa inteleg.<br><p>&#32;


<hr size=1>Everyone is raving about <a href="http://us.rd.yahoo.com/evt=42297/*http://advision.webevents.yahoo.com/mailbeta">the all-new Yahoo! Mail beta.</a>