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

Se även