Vektorerad I/O
Inom datorer är vektoriserad I/O , även känd som scatter/gather I/O , en metod för inmatning och utmatning genom vilken ett enda proceduranrop sekventiellt läser data från flera buffertar och skriver det till en enda dataström , eller läser data från en dataström och skriver den till flera buffertar, enligt definition i en vektor av buffertar. Spridning/samla hänvisar till processen att samla in data från, eller sprida data till, den givna uppsättningen buffertar. Vectored I/O kan arbeta synkront eller asynkront. De främsta anledningarna till att använda vektoriserad I/O är effektivitet och bekvämlighet.
Vektorad I/O har flera potentiella användningsområden:
- Atomicitet : om den specifika vektoriserade I/O-implementeringen stöder atomicitet, kan en process skriva in i eller läsa från en uppsättning buffertar till eller från en fil utan risk att en annan tråd eller process kan utföra I/O på samma fil mellan den första processen ' läser eller skriver, vilket skadar filen eller äventyrar integriteten för indata
- Sammankopplande utdata: en applikation som vill skriva icke-sekventiellt placerad data i minnet kan göra det i en vektoriserad I/O-operation. Till exempel, skrivning av en rubrik med fast storlek och dess tillhörande nyttolastdata som placeras icke-sekventiellt i minnet kan göras med en enda vektoriserad I/O-operation utan att först sammanfoga rubriken och nyttolasten till en annan buffert
- Effektivitet: en vektoriserad I/O läsning eller skrivning kan ersätta många vanliga läsningar eller skrivningar, och därmed spara på de overhead som är involverade i syscalls
- Dela indata: när man läser data som lagras i ett format som definierar en rubrik med fast storlek, kan man använda en vektor av buffertar där den första bufferten är storleken på den rubriken; och den andra bufferten kommer att innehålla data som är associerade med rubriken
Standardorgan dokumenterar de tillämpliga funktionerna readv
och writev
i POSIX 1003.1-2001 och Single UNIX Specification version 2. Windows API har analoga funktioner ReadFileScatter
och WriteFileGather
; Men till skillnad från POSIX-funktionerna kräver de justering av varje buffert på en minnessida . Winsock tillhandahåller separata WSASend-
och WSARecv
-funktioner utan detta krav.
Även om det kan vara betydligt svårare att arbeta direkt med en vektor av buffertar än att arbeta med en enda buffert, kan användningen av API:er på högre nivåer för att arbeta effektivt mildra svårigheterna.
Exempel
Följande exempel skriver ut "Hej, Wikipedia Community!" till standardutgången . Varje ord sparas i en enda buffert och med endast ett anrop till writev()
skrivs alla buffertar ut till standardutgången.
0
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/uio.h> int main ( int argc , char * argv []) { const char buf1 [] = "Hej," ; const char buf2 [] = "Wikipedia" ; const char buf3 [] = "Community! \n " ; struct iovec buffs [] = { { . iov_base = ( void * ) buf1 , . iov_len = strlen ( buf1 ) }, { . iov_base = ( void * ) buf2 , . iov_len = strlen ( buf2 ) }, { . iov_base = ( void * ) buf3 , . iov_len = strlen ( buf3 ) }, }; if ( -1 == writev ( STDOUT_FILENO , bufs , sizeof bufs / sizeof bufs [ ])) { perror ( "writev()" ); avsluta ( EXIT_FAILURE ); } returnera EXIT_SUCCESS ; }