[so] [SO][Tema2][Windows] Problema sincronizare fisier

Adrian Scoica adrian.scoica at gmail.com
Wed Apr 27 21:12:34 EEST 2011


2011/4/27 Razvan Deaconescu <razvan.deaconescu at cs.pub.ro>

> On 04/23/2011 03:12 PM, Cosmin Stefan-Dobrin wrote:
> > Si ca o scurta descriere a ce am facut in cod, initial am mapat (ca in
> > exemplu), granular, fiecare pagina virtuala cu flagurile:
> > VirtualAlloc(  addr, page_size, MEM_RESERVE | MEM_COMMIT, PAGE_NOACCESS);
>

MEM_RESERVE functioneaza asemanator cu operatira de reserve de la alocatorii
din C++: iti garanteaza ca memoria respectiva va fi libera in viitor, dar NU
ti-o aloca/mapeaza(sau in C++, instantiaza).

Tu ai nevoie ca ea sa fie rezervata ca sa poti apoi sa faci commit pe
bucatele (pagina cu pagina). In Windows, daca nu le mapezi pagina cu pagina,
nu mai poti fragmenta dupa aia, si folosesti intai reserve si apoi commit ca
sa te asiguri ca ai la dispozitie un loc suficient de mare sa le poti mapa
consecutiv pe toate.

Teoretic, poti face si acum ai facut tu, daca faci VirtualFree dupa commit,
dar codul rezultat NU este thread-safe (intre VirtualFree si urmatorul
VirtualAlloc(...MEM_COMMIT...) s-ar putea ca alt thread sa mapeze ceva in
spatiul ala prin malloc sau VAlloc.

> si apoi, la maparea fisierului ram, realizez VirtualFree, Creez un
> FileMapping cu flagurile:
> CreateFileMapping(  file_handle,    NULL,   (DWORD) PAGE_READWRITE,  0, 0,
> NULL);

Este suficient sa faci un singur mapping la inceput. Dupa aceea poti folosi
handle-ul respectiv ca sa faci MapViewOfFileEx de oricate ori ai nevoie. Sa
nu uiti sa il si inchizi la sfarsit.


> >
> > si mapez fisierul:
> > MapViewOfFileEx(  mHandle,  desired_access,    0,
> > file_page_no*page_size,   page_size, address);
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so/attachments/20110427/69632b3c/attachment-0001.htm>


More information about the so mailing list