En informática , la E / S vectorizada , también conocida como E / S de dispersión / recopilación , es un método de entrada y salida mediante el cual una única llamada a procedimiento lee secuencialmente datos de varios búferes y los escribe en un único flujo de datos , o lee datos de un flujo de datos y lo escribe en varios búferes, como se define en un vector de búferes. Dispersión / recopilación se refiere al proceso de recopilación de datos o de dispersión de datos en el conjunto de búferes dado. Las E / S vectorizadas pueden funcionar de forma sincrónica o asincrónica. Las principales razones para usar E / S vectorizadas son la eficiencia y la conveniencia.
La E / S vectorizada tiene varios usos potenciales:
- Atomicidad : si la implementación de E / S vectorizada particular admite atomicidad, un proceso puede escribir o leer desde un conjunto de búferes hacia o desde un archivo sin riesgo de que otro hilo o proceso pueda realizar E / S en el mismo archivo entre el primer proceso 'lee o escribe, corrompiendo así el archivo o comprometiendo la integridad de la entrada
- Salida de concatenación: una aplicación que desee escribir datos colocados de forma no secuencial en la memoria puede hacerlo en una operación de E / S vectorizada. Por ejemplo, escribir un encabezado de tamaño fijo y sus datos de carga útil asociados que se colocan de forma no secuencial en la memoria se puede realizar mediante una única operación de E / S vectorizada sin concatenar primero el encabezado y la carga útil a otro búfer.
- Eficiencia: una lectura o escritura de E / S vectorizada puede reemplazar muchas lecturas o escrituras ordinarias y, por lo tanto, ahorrar en la sobrecarga involucrada en las llamadas al sistema
- Dividir la entrada: al leer datos almacenados en un formato que define un encabezado de tamaño fijo, se puede usar un vector de búferes en el que el primer búfer es del tamaño de ese encabezado; y el segundo búfer contendrá los datos asociados con el encabezado
Los organismos de normalización documentan las funciones aplicables readv
[1] y writev
[2] en POSIX 1003.1-2001 y la Especificación Única de UNIX versión 2. La API de Windows tiene funciones análogas ReadFileScatter
y WriteFileGather
; sin embargo, a diferencia de las funciones POSIX, requieren la alineación de cada búfer en una página de memoria . [3] Winsock proporciona funciones independientes WSASend
y WSARecv
sin este requisito.
Si bien trabajar directamente con un vector de búferes puede ser significativamente más difícil que trabajar con un solo búfer, el uso de API de nivel superior [4] para trabajar de manera eficiente puede mitigar las dificultades.
Ejemplos de
El siguiente ejemplo imprime "¡Hola, comunidad de Wikipedia!" a la salida estándar . Cada palabra se guarda en un solo búfer y con una sola llamada a writev()
, todos los búferes se imprimen en la salida estándar.
#include #include #include #include int main ( int argc , char * argv []) { const char buf1 [] = "Hola" ; const char buf2 [] = "Wikipedia" ; const char buf3 [] = "Comunidad! \ 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 ()" ); salir ( EXIT_FAILURE ); }return EXIT_SUCCESS ; }