[so] I/O
Bercea Gabriel
gamitech at gmail.com
Thu Jul 31 12:44:58 EEST 2008
Just for the tip on the iceberg. Trebuie sa te gandesti, la nivel de
implementare, cum sunt implementate, si de ce, sync si async I/O si de
ce exista astea 2 solutii.
Internally async I/O de multe ori e baza sistemului de operare si metoda
mai mereu aleasa pentru I/O deoarece permite o mare interactivitate cu
userul. De obicei async I/O este folosit foarte des in cazuri de low
virtual memory, atunci cand sistemul de operare decide ca trebuie sa
flushuiasca pagini pe disc. Ideea e ca OS ul nu are decat un numar fixat
de la boot de system worker threads pentru ModifiedPageWriter (MPW).
Daca fiecare pagina ar fi flushuita sincron atunci utilizatorul ar avea
de asteptat perioade insuportabil de lungi pentru operatii de genul asta.
Aici nu vorbesc de multiplexare si doar de faptul ca requestul de flush
pleaca dintr-un anumit system worker thread context si poate se termine
si in contextul kernel mode al notepadului. Asincron nu inseamna
neeaparat ca vrei sa sti cum s-a terminat operatia pe care ai
forwardat-o, care e statusul final, ci inseamna ca nu vreai sa stai dupa
fiecare operatie sa se termine, ca sa treci la urmatoarea operatie. It
make a lot of sense on multicore right ? de ce sa nu flushuiesc 2 pagini
de VM in paralel ?
Same goes for socket, sau orice interactioneaza cu kernel executive ul.
Acum de ce as vrea sync I/O, internally (f important internally) ?
Pai in primul rand ca sa nu pierd contextul in care se termina operatia.
Operatiile KM care incep in contextul unui process, si primesc ca input
o adresa care poate fi tradusa cu PTE ul acelui proces, nu as dori sa o
procesez in alt context, pentru ca, dupa cum va imaginati, acel proces
are alt PTE, deci virtual to phisical translationul cade, deci memoria
accesata vine valida, dar la un moment dat ajunge invalida. Operatiile
de genul asta de asemenea pot fi terminate in arbitrary thread context,
though, insa trebuie sa te folosesti de anumite mecanisme pe care le
dispune sistemul de operare, gen sa faci memoria rezidenta in ram, si
sa o poti descrie independent de context si altceva destul de important
sometimes, dar nu de multe ori vizivil: PTE ul sa nu ajunga sa fie paged
it's self, dar most of the time poate sa fie. So now you can work
synchronously and context thread independent.
Example: CreateFile este vine intotdeauna in contextul threadului care
l-a initiat user mode, si obiectul creat este dependent de context.
Operatia totusi, post-creatul, poate sa se termine si in alt context
thread, async adica, insa threadul initial, va face un mic hang, vazand
operatia ca fiind pending.
Nu se poate spune acelasi lucru pentru un ReadFile sau WriteFile. Ele
fiind mai mereu async.
Alexandru Goia wrote:
> Buna ziua,
>
> In ce situatii e recomandat sa fac blocking I/O (read, write) si in ce
> situatii e mai bine sa fac non-blocking I/O ? (Nu ma refer la
> multiplexed I/O.) Va rog, daca se poate, cu exemple concrete.
>
> Va multumesc.
> Alexandru
> _______________________________________________
> so mailing list
> so at cursuri.cs.pub.ro
> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: gamitech.vcf
Type: text/x-vcard
Size: 222 bytes
Desc: not available
Url : http://cursuri.cs.pub.ro/pipermail/so/attachments/20080731/cea1045e/attachment.vcf
More information about the so
mailing list