[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