[SO] Tema 5 - fisiere swap/ram
Cosmin
cosh10000 at yahoo.com
Tue Dec 19 13:05:58 EET 2006
Multumesc pentru explicatii. Am implementat deja tema
folosind read/write in fisierele swap/ram. A fost de
departe cea mai simpla tema la SO de pana acum.
Totusi, ca o observatie, o scriere intr-o pagina
nealocata nu e necesar sa dea 2 faulturi (se poate si
cu unul singur). Avand in vedere ca ne putem da seama
daca un fault a fost cauzat de o operatie de
citire/scriere (pe Windows cel putin), putem face un
singur fault (daca se detecteaza o operatie de
scriere, se dau drepturi de citire/scriere, nu doar
citire, iar apoi si scriere).
In plus, testele au o scapare. Din cauza unei mici
erori la tema de windows, nu incarcam niciodata
continutul efectiv al memoriei din swap, insa acest
lucru nu parea sa conteze (un test simplu ar fi swap
pentru niste pagini de memorie, poison la swap iar la
o noua accesare a paginilor, acestea ar trebui sa
contina valoarea de poison din swap).
--- Razvan Deaconescu <razvand at cs.pub.ro> wrote:
> 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
>
> _______________________________________________
> so mailing list
> so at cursuri.cs.pub.ro
> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so
>
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
More information about the so
mailing list