Aviseringsbar I/O
Aviseringsbar I/O är den metod med vilken programtrådar endast bearbetar asynkrona I/O-begäranden när de är i ett aviseringsbart tillstånd.
Tänk på följande scenario för att förstå när en tråd är i ett aviseringsbart tillstånd:
- En tråd initierar en asynkron läsbegäran genom att anropa ReadFileEx- med en pekare till en motringningsfunktion.
- Tråden initierar en asynkron skrivbegäran genom att anropa WriteFileEx med en pekare till en återanropsfunktion.
- Tråden anropar en funktion som hämtar en rad data från en fjärrdatabasserver.
I det här scenariot returneras troligen anropen till ReadFileEx och WriteFileEx innan funktionsanropet i steg 3. När de gör det placerar kerneln pekarna till återanropsfunktionerna i trådens Asynkrona proceduranrop (APC). Kerneln underhåller den här kön specifikt för att lagra returnerade I/O-begärandedata tills den kan bearbetas av motsvarande tråd.
När radhämtningen är klar och tråden returneras från funktionen är dess högsta prioritet att bearbeta returnerade I/O-begäranden i kön genom att anropa återanropsfunktionerna. För att göra detta måste det ange ett aviseringsbart tillstånd. En tråd kan bara göra detta genom att anropa någon av följande funktioner med lämpliga flaggor:
- SleepEx
- WaitForSingleObjectEx
- WaitForMultipleObjectsEx
- SignalObjectAndWait
- MsgWaitForMultipleObjectsEx
När tråden går in i ett aviseringsbart tillstånd inträffar följande händelser:
- Kerneln kontrollerar trådens APC-kö. Om kön innehåller pekare för återanropsfunktionen tar kerneln bort pekaren från kön och skickar den till tråden.
- Tråden kör återanropsfunktionen.
- Steg 1 och 2 upprepas för varje pekare som finns kvar i kön.
- När kön är tom returnerar tråden från funktionen som placerade den i ett aviseringsbart tillstånd.
I det här scenariot anropas återanropsfunktionerna som skickas till ReadFileEx- och WriteFileExnär tråden har angetts som aviseringsbara och sedan återgår från funktionen som placerade den i ett aviseringsbart tillstånd.
Om en tråd går in i ett aviseringsbart tillstånd medan dess APC-kö är tom pausas trådens körning av kerneln tills något av följande inträffar:
- Kernelobjektet som väntar på signaleras.
- En pekare för återanropsfunktionen placeras i APC-kön.
En tråd som använder aviseringsbara I/O-processer asynkrona I/O-begäranden mer effektivt än när de bara väntar på händelseflaggan i OVERLAPPED- struktur som ska anges, och den aviseringsbara I/O-mekanismen är mindre komplicerad än I/O-slutförandeportar att använda. Aviseringsbar I/O returnerar dock endast resultatet av I/O-begäran till den tråd som initierade den. I/O-slutförandeportar har inte den här begränsningen.
Relaterade ämnen