Jump to content

Векторный ввод-вывод

В вычислениях , векторный ввод-вывод , также известный как ввод-вывод с разбросом/сбором , представляет собой метод ввода и вывода с помощью которого один вызов процедуры последовательно считывает данные из нескольких буферов и записывает их в один поток данных (сбор), или считывает данные из потока данных и записывает их в несколько буферов (разброс), как определено в векторе буферов. Рассеивание/сбор — это процесс сбора данных или распределения данных в заданном наборе буферов. Векторный ввод-вывод может работать синхронно или асинхронно. Основными причинами использования векторного ввода-вывода являются эффективность и удобство.

Векторный ввод-вывод имеет несколько потенциальных применений:

  • Атомарность : если конкретная реализация векторного ввода-вывода поддерживает атомарность, процесс может записывать или читать из набора буферов в файл или из файла без риска, что другой поток или процесс может выполнить ввод-вывод в том же файле между первым процессом. ' читает или записывает, тем самым повреждая файл или ставя под угрозу целостность ввода
  • Объединение вывода: приложение, которое хочет записать непоследовательно размещенные данные в памяти, может сделать это за одну векторную операцию ввода-вывода. Например, запись заголовка фиксированного размера и связанных с ним полезных данных, которые размещаются в памяти непоследовательно, может быть выполнена с помощью одной векторной операции ввода-вывода без предварительного объединения заголовка и полезных данных в другой буфер.
  • Эффективность: одно векторное чтение или запись ввода-вывода может заменить множество обычных операций чтения или записи и, таким образом, сэкономить на накладных расходах, связанных с системными вызовами.
  • Разделение ввода: при чтении данных, хранящихся в формате, определяющем заголовок фиксированного размера, можно использовать вектор буферов, в котором первый буфер имеет размер этого заголовка; и второй буфер будет содержать данные, связанные с заголовком

Органы по стандартизации документируют применимые функции. 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;
}

См. также

[ редактировать ]
  1. ^ readv. Архивировано 5 сентября 2008 г. на Wayback Machine в единой спецификации Unix.
  2. ^ writev. Архивировано 17 декабря 2007 г. на Wayback Machine в единой спецификации Unix.
  3. ^ ReadFileScatter в библиотеке MSDN
  4. ^ Vstr. Архивировано 5 марта 2017 г. на Wayback Machine, API векторных строк.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 0261123faf3302fb8f70de20a08405d1__1721169540
URL1:https://arc.ask3.ru/arc/aa/02/d1/0261123faf3302fb8f70de20a08405d1.html
Заголовок, (Title) документа по адресу, URL1:
Vectored I/O - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)