Векторный ввод-вывод
В вычислениях , векторный ввод-вывод , также известный как ввод-вывод с разбросом/сбором , представляет собой метод ввода и вывода с помощью которого один вызов процедуры последовательно считывает данные из нескольких буферов и записывает их в один поток данных (сбор), или считывает данные из потока данных и записывает их в несколько буферов (разброс), как определено в векторе буферов. Рассеивание/сбор — это процесс сбора данных или распределения данных в заданном наборе буферов. Векторный ввод-вывод может работать синхронно или асинхронно. Основными причинами использования векторного ввода-вывода являются эффективность и удобство.
Векторный ввод-вывод имеет несколько потенциальных применений:
- Атомарность : если конкретная реализация векторного ввода-вывода поддерживает атомарность, процесс может записывать или читать из набора буферов в файл или из файла без риска, что другой поток или процесс может выполнить ввод-вывод в том же файле между первым процессом. ' читает или записывает, тем самым повреждая файл или ставя под угрозу целостность ввода
- Объединение вывода: приложение, которое хочет записать непоследовательно размещенные данные в памяти, может сделать это за одну векторную операцию ввода-вывода. Например, запись заголовка фиксированного размера и связанных с ним полезных данных, которые размещаются в памяти непоследовательно, может быть выполнена с помощью одной векторной операции ввода-вывода без предварительного объединения заголовка и полезных данных в другой буфер.
- Эффективность: одно векторное чтение или запись ввода-вывода может заменить множество обычных операций чтения или записи и, таким образом, сэкономить на накладных расходах, связанных с системными вызовами.
- Разделение ввода: при чтении данных, хранящихся в формате, определяющем заголовок фиксированного размера, можно использовать вектор буферов, в котором первый буфер имеет размер этого заголовка; и второй буфер будет содержать данные, связанные с заголовком
Органы по стандартизации документируют применимые функции. readv
[1] и writev
[2] в POSIX 1003.1-2001 и Единой спецификации UNIX версии 2. Windows API имеет аналогичные функции. ReadFileScatter
и WriteFileGather
; однако, в отличие от функций POSIX, они требуют выравнивания каждого буфера на странице памяти . [3] Winsock предоставляет отдельный WSASend
и WSARecv
функционирует без этого требования.
Хотя работать напрямую с вектором буферов может быть значительно сложнее, чем работать с одним буфером, используя API более высокого уровня. [4] для эффективной работы может смягчить трудности.
Примеры
[ редактировать ]Следующий пример на языке программирования C выводит «Привет, сообщество Википедии!» на стандартный вывод . Каждое слово сохраняется в одном буфере и выполняется только один вызов writev()
, все буферы выводятся на стандартный вывод.
#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[] = "Hello, ";
const char buf2[] = "Wikipedia ";
const char buf3[] = "Community!\n";
struct iovec bufs[] = {
{ .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 (writev(STDOUT_FILENO, bufs, sizeof(bufs) / sizeof(bufs[0])) == -1)
{
perror("writev()");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ readv. Архивировано 5 сентября 2008 г. на Wayback Machine в единой спецификации Unix.
- ^ writev. Архивировано 17 декабря 2007 г. на Wayback Machine в единой спецификации Unix.
- ^ ReadFileScatter в библиотеке MSDN
- ^ Vstr. Архивировано 5 марта 2017 г. на Wayback Machine, API векторных строк.