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

Zobacz też