Wektorowe wejścia/wyjścia
W informatyce wektorowe we/wy , znane również jako rozproszone/zgromadzone we/wy , to metoda wejścia i wyjścia, za pomocą której pojedyncze wywołanie procedury sekwencyjnie odczytuje dane z wielu buforów i zapisuje je w pojedynczym strumieniu danych lub odczytuje dane z strumień danych i zapisuje go w wielu buforach, zgodnie z definicją wektora buforów . Rozpraszanie/zbieranie odnosi się do procesu zbierania danych z lub rozpraszania danych w danym zestawie buforów. Wektorowe wejścia/wyjścia mogą działać synchronicznie lub asynchronicznie. Głównymi powodami korzystania z wektorowych operacji we/wy są wydajność i wygoda.
Vectored I/O ma kilka potencjalnych zastosowań:
- Atomowość : jeśli konkretna implementacja wektorowego wejścia/wyjścia obsługuje atomowość, proces może zapisywać lub odczytywać z zestawu buforów do lub z pliku bez ryzyka, że inny wątek lub proces może wykonać operacje wejścia/wyjścia na tym samym pliku między pierwszym procesem ' odczytuje lub zapisuje, uszkadzając w ten sposób plik lub naruszając integralność danych wejściowych
- Konkatenacja danych wyjściowych: aplikacja, która chce zapisać w pamięci dane umieszczone niesekwencyjnie, może to zrobić w ramach jednej wektorowej operacji we/wy. Na przykład zapisanie nagłówka o stałym rozmiarze i powiązanych z nim danych ładunku, które są umieszczane w pamięci niesekwencyjnie, można wykonać za pomocą pojedynczej wektorowej operacji we/wy bez uprzedniego łączenia nagłówka i ładunku z innym buforem
- Wydajność: jeden wektorowy odczyt lub zapis we/wy może zastąpić wiele zwykłych odczytów lub zapisów, a tym samym zaoszczędzić na narzutach związanych z wywołaniami systemowymi
- Dzielenie danych wejściowych: podczas odczytu danych przechowywanych w formacie, który definiuje nagłówek o stałym rozmiarze, można użyć wektora buforów, w których pierwszy bufor ma rozmiar tego nagłówka; a drugi bufor będzie zawierał dane powiązane z nagłówkiem
Organy normalizacyjne dokumentują odpowiednie funkcje readv
i writev
w POSIX 1003.1-2001 i specyfikacji Single UNIX w wersji 2. Windows API ma analogiczne funkcje ReadFileScatter
i WriteFileGather
; jednakże, w przeciwieństwie do funkcji POSIX, wymagają one wyrównania każdego bufora na stronie pamięci . Winsock udostępnia oddzielne funkcje WSASend
i WSARecv
bez tego wymogu.
Podczas gdy bezpośrednia praca z wektorem buforów może być znacznie trudniejsza niż praca z pojedynczym buforem, korzystanie z interfejsów API wyższego poziomu w celu wydajnej pracy może złagodzić trudności.
Przykłady
Poniższy przykład drukuje komunikat „Witaj, społeczność Wikipedii!” na standardowe wyjście . Każde słowo jest zapisywane w pojedynczym buforze i wystarczy tylko jedno wywołanie writev()
, wszystkie bufory są drukowane na standardowym wyjściu.
#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 [] = "Cześć, " ; const char buf2 [] = "Wikipedia" ; const char buf3
[] = "Społeczność! \n " ; struct bufs iovec [] = { { . iov_base = ( void * ) buf1 , . iov_len = strlen ( buf1 ) }, { . iov_base = ( void * ) buf2 , . iov_len = strlen ( buf2
0
) }, { . iov_base = ( void * ) buf3 , . iov_len = strlen ( buf3 ) }, }; if ( -1 == writev ( STDOUT_FILENO , bufory , rozmiar buforów / rozmiar buforów [ ])) { perror ( "writev()" ); wyjście (
EXIT_FAILURE ); } powrót EXIT_SUCCESS ; }