Vektorové I / O - Vectored I/O
Ve výpočtech je vektorový I / O , známý také jako scatter / collect I / O , metoda vstupu a výstupu, pomocí které jedno volání procedury postupně čte data z více vyrovnávacích pamětí a zapisuje je do jediného datového proudu nebo čte data z datový proud a zapíše jej do více vyrovnávacích pamětí, jak je definováno ve vektoru vyrovnávacích pamětí. Rozptyl / shromáždění označuje proces shromažďování dat z dané sady vyrovnávacích pamětí nebo jejich rozptyl do této sady. Vektorový I / O může pracovat synchronně nebo asynchronně. Hlavními důvody pro použití vektorových I / O jsou efektivita a pohodlí.
Vektorový I / O má několik potenciálních použití:
- Atomicita : pokud konkrétní vektorová implementace I / O podporuje atomicitu, proces může zapisovat nebo číst ze sady vyrovnávacích pamětí do nebo ze souboru bez rizika, že by jiné vlákno nebo proces mohl provádět I / O na stejném souboru mezi prvním procesem 'čte nebo zapisuje, čímž poškozuje soubor nebo narušuje integritu vstupu
- Zřetězený výstup: aplikace, která chce zapisovat do paměti data, která nejsou posloupně umístěna, to může udělat v jedné vektorové I / O operaci. Například zápis záhlaví pevné velikosti a jeho přidružených dat užitečného zatížení, která jsou umístěna nesekvenčně do paměti, lze provést jedinou vektorovanou I / O operací bez předchozího zřetězení záhlaví a užitečného zatížení do jiné vyrovnávací paměti
- Efektivita: jeden vektorový vstup / výstup pro čtení nebo zápis může nahradit mnoho běžných čtení nebo zápisů, a tak ušetřit režii zapojenou do syscallů
- Rozdělení vstupu: při čtení dat uchovávaných ve formátu, který definuje záhlaví pevné velikosti, lze použít vektor vyrovnávacích pamětí, ve kterých je první vyrovnávací paměť velikost této záhlaví; a druhá vyrovnávací paměť bude obsahovat data spojená s hlavičkou
Subjekty norem dokumentují příslušné funkce readv
a writev
v POSIX 1003.1-2001 a verzi Single UNIX Specification verze 2. Windows API má obdobné funkce ReadFileScatter
a WriteFileGather
; na rozdíl od funkcí POSIX však vyžadují zarovnání každé vyrovnávací paměti na stránce paměti . Winsock poskytuje samostatné funkce WSASend
a WSARecv
bez tohoto požadavku.
Zatímco práce přímo s vektorem vyrovnávacích pamětí může být výrazně těžší než práce s jedinou vyrovnávací pamětí, použití API na vyšší úrovni pro efektivní práci může zmírnit potíže.
Příklady
Následující příklad vytiskne „Hello, Wikipedia Community!“ na standardní výstup . Každé slovo je uloženo do jedné vyrovnávací paměti a pouze s jedním voláním do writev()
jsou všechny vyrovnávací paměti vytištěny na standardní výstup.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/uio.h>
int main(int argc, char *argv[])
{
const char buf1[] = "Hello, ";
const char buf2[] = "Wikipedia ";
const char buf3[] = "Community!\n";
struct iovec bufs[] = {
{ .iov_base = (void *) buf1, .iov_len = sizeof(buf1) - 1 },
{ .iov_base = (void *) buf2, .iov_len = sizeof(buf2) - 1 },
{ .iov_base = (void *) buf3, .iov_len = sizeof(buf3) - 1 },
};
if (-1 == writev(STDOUT_FILENO, bufs, sizeof(bufs) / sizeof(*bufs)))
{
perror("writev()");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}