QIO

QIO ( Queue I/O ) är en term som används i flera datoroperativsystem designade av det tidigare Digital Equipment Corporation ( DEC ) i Maynard, Massachusetts .

I/O-operationer på dessa system initieras genom att skicka ett QIO-anrop till kärnan . Det finns två typer av QIO - Queue I/O, och Queue I/O och Wait.

För QIO utan väntetid återkommer samtalet omedelbart. Om begäran lyckas köas, sker den faktiska operationen asynkront. Efter slutförandet returneras status i QIO-statusdubbelordet. QIO-begäran kan också specificera att slutförandet sätter en händelseflagga eller utfärdar en Asynkron System Trap ( AST ).

Samtalet kan också utfärdas som QIOW (Queue I/O och Wait for completion), vilket tillåter synkron I/O. I det här fallet kombineras operationen vänta-på-händelse-flagga så att samtalet inte återkommer förrän I/O-operationen slutförs eller misslyckas.

Följande operativsystem implementerar QIO(W):

QIO-argument i VMS

Under VMS är argumenten för QIO-anropet:

  • Händelseflaggan som ska ställas in när operationen är klar . Det är inte möjligt att inte specificera en händelseflagga; flagga 0 är giltig. Det är helt tillåtet att ha flera samtidiga operationer som ställer in samma händelseflagga vid slutförandet. Det är sedan upp till applikationen att reda ut eventuell förvirring detta kan orsaka, eller bara ignorera den händelseflaggan.
  • Kanalen , ett litet heltal som tidigare associerats med enheten. På denna nivå görs alla operationer på diskfiler och kataloger (filnamnsanalys, katalogsökning, filöppning/stängning) av lämpliga QIO-förfrågningar.
  • Funktionskoden som ska utföras. 6 bitar tilldelas grundkoden (såsom läs, skriv), med ytterligare 10 bitar för "modifierare" vars betydelse beror på grundkoden.
  • Det valfria I/O-statusblocket (IOSB) , som rensas av QIO-anropet och fylls i när I/O-operationen har slutförts. De första två byten håller slutförandestatusen (framgång, slutet på filen nått, timeout, I/O-fel, etc.), medan de nästa två byten normalt returnerar antalet byte som lästs eller skrivits i operationen. Betydelsen, om någon, av de sista fyra byten är operationsberoende.
  • Den valfria AST- rutinen att anropa när operationen är klar.
  • En ytterligare parameter (vars betydelse är upp till den som ringer) ska skickas till AST-rutinen.
  • En delvis standardiserad lista med upp till sex parametrar som kallas P1 till P6 . De två första parametrarna anger vanligtvis I/O-buffertens startadress (P1) och I/O-byteräkningen (P2). De återstående parametrarna varierar med funktionen och den specifika enheten. Till exempel, för en datorterminal kan P3 vara tiden för att tillåta läsningen att slutföras, medan det för en diskenhet kan vara startblocksnumret för överföringen.

QIO-slutförande

Det finns tre olika sätt att känna av när den köade I/O-operationen har slutförts:

  1. När händelseflaggan sätts.
  2. När de första två byten av IOSB blir noll.
  3. När AST-rutinen körs.

Ovanliga QIO:er som kräver komplex bearbetning

Enkla QIO:er, som läs- eller skrivbegäranden, betjänas antingen av själva kärnan eller av enhetsdrivrutiner. Vissa mer komplicerade förfrågningar, särskilt de som involverar bandenheter och operationer på filnivå, exekverades ursprungligen av en ancillary Control Processor (ACP) (en specialuppgift med egen adressmappning).

Filsystemet Files-11 ODS-1 på RSX - 11 implementerades av ett subrutinbibliotek som kommunicerade med en uppgift som heter F11ACP med hjälp av en speciell uppsättning QIO:er som kallas "ACP QIOs." Motsvarande funktionalitet för att styra magnetbandsenheter tillhandahölls av en uppgift som heter MTAACP.

Ursprungligen tillhandahölls Files-11 ODS-2-filsystemet av F11BACP på VMS , men funktionaliteten hos F11BACP inkorporerades senare i VMS-kärnan för att spara överkostnaderna för processkontextväxlar, och kallas nu en XQP (eXtended Qio Processor) .

IO$_READPROMPT

Förmodligen den mest komplexa enskilda QIO-begäran som är möjlig är VMS-terminaldrivrutinens IO$_READPROMPT- anrop med IO$M_TIMED- modifieraren; denna QIO kräver alla sex ytterligare parametrar:

P1
Adressen till bufferten i vilken de inmatade tecknen tas emot
P2
Längden på bufferten, vilket begränsar det maximala antalet tecken att läsa. Om bufferten är fylld kommer läsningen att slutföras framgångsrikt, även om användaren inte skriver ett radavslutningstecken. Noll är tillåtet, i vilket fall läsningen kommer att avslutas framgångsrikt med noll lästa tecken.
P3
Maximalt antal sekunder att vänta på mer inmatning. Detta används endast om IO$M_TIMED -modifieraren är närvarande, och ett värde på noll betyder noll sekunder: läsningen kommer att avslutas omedelbart, så den enda möjliga inmatningen kommer att vara vad som har "skrivits i förväg" av användaren.
P4
Adressen till den valfria "terminatormasken", som anger vilka ASCII-tecken som avslutar läsningen. Om det utelämnas, är detta standard till de vanliga VMS-linjeavgränsare inklusive vagnretur (men inte linjematning). Det är möjligt att ange en mask utan radavslutningar , i vilket fall läsningen kommer att slutföras först när bufferten är full eller timeouten har förflutit.
P5
Adressen till en promptsträng som ska visas för användaren innan inmatning accepteras. Fördelen med att tillhandahålla denna uppmaning, istället för som en tidigare skrivoperation, är automatisk återvisning i alla situationer som kräver en uppdatering av ingångsraden medan läsningen pågår (t.ex. efter att ett operatörsmeddelande har sänts till terminalen, eller användaren trycker på CTRL/R för att visa raden igen).
P6
Längden på promptsträngen.

Genom lämpliga val av parametrarna ovan är det möjligt att göra både terminalinmatning och utmatning med det ena anropet, det finns inget behov av att använda det vanliga IO$_WRITEVBLK- anropet för terminalutgång alls.