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;
}

Reference