Vra

Wat is Windows se beste I / O kennisgewing gebeurtenis fasiliteit?

Deur beste wat ek bedoel iets wat ...

  1. nie 'n beperking op die aantal insette lêer beskrywers hê
  2. werk op alle lêer beskrywings (skyf lêers, voetstukke, ...)
  3. bied verskeie kennisgewing modes (rand veroorsaak, beperking veroorsaak)
Was dit nuttig?

Oplossing

In Windows, asinkroniseer bedrywighede gedoen deur 'n lêer werking, nie deur descriptor. Daar is verskeie maniere om te wag op lêer operasies om asynchroon voltooi.

Byvoorbeeld, as jy wil weet wanneer data is beskikbaar op 'n netwerk aansluiting, kwessie 'n asinkroniseer lees versoek op die potjie en wanneer dit voltooi, die data beskikbaar was en is opgespoor.

In Win32, asinkroniseer bedrywighede gebruik die OVERLAPPED struktuur om staat bevat oor 'n uitstaande IO operasie.

  1. Assosieer die lêers met 'n IO Voltooiing Port en versending asinkroniseer IO versoeke. Wanneer 'n operasie voltooi is, sal dit 'n voltooiing boodskap op die tou wat jou werker draad (s) kan nie wag op en haal as hulle aankom. Jy kan ook sit die gebruiker gedefinieerde boodskappe in die tou. Daar is geen beperking op hoeveel lêers of tou boodskappe kan gebruik word met 'n voltooiing hawe
  2. Dispatch elke IO operasie met 'n gebeurtenis. Die geleentheid wat verband hou met 'n operasie sal word te kenne gegee (bevredig 'n wag) wanneer dit voltooi. Gebruik WaitForMultipleObjects wag op al die gebeure by keer. Dit het die nadeel van net in staat is om te wag op MAXIMUM_WAIT_OBJECTS voorwerpe in 'n keer (64). Jy kan ook wag op ander vorme van gebeure op dieselfde tyd (proses / draad beëindiging, mutexes, gebeure, semafore)
  3. Gebruik 'n draad swembad . Die draad swembad kan 'n onbeperkte aantal voorwerpe en lêer operasies neem om op wag en uit te voer 'n gebruiker gedefinieerde funksie na afloop elk.
  4. Gebruik ReadFileEx en WriteFileEx te ry Asynchronous proses aanroep (APCs) aan die roeping draad en SleepEx (of WaitFor{Single|Multiple}ObjectsEx) met Alertable TRUE om 'n boodskap ontvang vir elke operasie wanneer dit voltooi. Hierdie metode is soortgelyk aan 'n IO voltooiing hawe, maar werk net vir een draad.

Die Windows NT kern maak geen onderskeid tussen socket, skyf lêer, pyp, ens lêer operasies intern: al hierdie opsies sal werk met alle vorme van die lêer

.

Ander wenke

libuv

libuv bied evented I / O vir Unix en Windows en het ondersteuning vir socket, lêers en pype. Dit is die platform laag Node.js.

Meer besonderhede is by: http://nikhilm.github.io/uvbook/introduction.html

Daar is nie een nie, so ver ek weet. 'N Vriend en ek is besig om op 'n open source Windows epoll implementering (skakel hieronder) maar ons loop in probleme uitzoeken hoe om te maak dit dieselfde as die Linux implementering.

Huidige struikelblokke:

  • In Linux, lêer beskrywings en socket beskrywers is verwissel, maar in Windows hulle nie. Beide moet versoenbaar is met 'n epoll implementering wees.
  • In Windows dis nogal moeilik om kern gebeure te kry ... dit is hoe epoll werke in Linux. Ons vermoed dat 'n program met behulp van ons kruis-platform epoll biblioteek merkbaar stadiger sal loop in Windows as Linux.

Ek sal probeer om terug te kom en hierdie post te werk as ons vordering met die projek te maak.

http://sourceforge.net/projects/cpoll

Kies () funksie is POSIX en bruikbare op vensters insluitend "winsock.h" of "winsock2.h".

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top