[SO] Tema 5 - fisiere swap/ram

Razvan Deaconescu razvand at cs.pub.ro
Tue Dec 19 11:14:27 EET 2006


cosh wrote:

> Fisierele swap si ram trebuie mapate in memorie sau
> trebuie citite/scrise cu read/write
> (ReadFile/WriteFile)? (pentru ca spre exemplu pe
> Windows nu se spune nimic de MapViewOfFile).
>  
>
Cum vrei tu :-)

Nu am spus nimic de MapViewOfFile pe Windows pentru ca nu este acelasi 
lucru cu mmap pe Linux; mmap face si mapare de fisiere in memorie dar 
face si alocare de memorie virtuala (adica e o combinatie intre 
VirtualAlloc si MapViewOfFile[Ex])

> Si daca trebuie, adresa intoarsa de vinit este chiar
> adresa la care a fost mapat fisierul swap?
>  
>
Adresa intoarsa de vinit/VirtualInit este adresa unde s-a alocat memoria 
virtuala.

Citat din enuntul temei:
" Functia vinit va intoarce un pointer catre o zona de memorie din 
spatiul de adresa al procesului; zona obtinuta reprezinta memoria 
virtuala, pointer-ul intors fiind, astfel, adresa de inceput a memoriei 
virtuale"

Daca tu vrei sa mapezi intreaga memorie virtuala peste fisierul de swap 
si sa copiezi din cand in cand informatia in fisierul ce simuleaza 
RAM-ul, poti sa faci si acest lucru; atentie insa la enuntul temei:
" La crearea spatiului de adresa virtual, dupa apelarea functiei vinit, 
paginile nu trebuie sa fie prezente in memorie. Ele vor fi create doar 
atunci cand programul le acceseaza."

> Tot in acest caz, ce inseamna sincronizarea? (in cazul
> cu read/write ar fi insemnat scrierea din memorie in
> fisier, dar daca fisierul o sa fie direct mapat in
> memorie, nu mai este necesara)
>  
>
ba o sa fie necesara :-) ; chiar daca tu faci maparea intre o zona de 
memorie virtuala si fisierul ce simuleaza RAM-ul, operatii de 
citire/scriere in acea zona nu garanateaza faptul ca fisierul contine 
aceleasi informatii (hint: msync/VirtualAlloc (..., MEM_COMMIT, ...)

> In cazul in care folosim read/write, eliberam memoria
> folosita de paginile ce trec in swap sau este
> suficient sa restrictionam accesul la aceste pagini?
>
este suficient sa restrictionezi accesul; poti sa eliberezi si memoria 
eventual folosind unmap ... ramane la latitudinea ta ... este doar ideea 
ca data viitoare cand o accesezi sa-ti dea inca un page fault :-) (si sa 
treaca testul totodata :-D)

ca si idee, aveti in vedere urmatoarea "schema":

       memorie virtuala
                 |
                 |
       RAM autentic
           /          \
         /             \
       /                \
  fisier RAM   fisier swap

exista un "strat" de memorie RAM autentica intre memoria virtuala si 
fisierul ce simuleaza RAM-ul, respectiv cache-ul; daca realizati maparea 
intre o zona de memorie si fisierul RAM aceasta memorie va fi chiar 
buffer-cache-ul;  daca nu realizati maparea intre zona de memorie si 
fisier, va fi o memorie RAM obisnuita; veti putea apoi "sincroniza" 
fisierul cu memoria, copiind informatiile din memorie in fisier ... cum 
doriti

> Observatii:
> * Oricare din metodele de mai sus le-am alege testele
> tot vor fi trecute.
> /* you gotta love them binary ops :-D */
> check &= !(exp_val ^ read_val);
> * As fi preferat:
> check &= exp_val == read_val;
> (pentru cei ce nu iubesc "binary ops :-D")
>  
>
Sau se putea mai simplu:

check = (exp_val == read_val) ? check : 0;

sau

if (exp_val != read_val)
   check = 0;

in acel moment, am avut o predispozitie pentru operatii binare :-) ... 
imi cer scuze ... o sa schimb in test

Razvan



More information about the so mailing list