2016-12-10 10 views
-1

Какова цель структуры iov_iter? Эта структура используется в ядре Linux вместо struct iovec. Нет никакой хорошей документации для интерфейса iter. Я нашел один документ в LWN, но я не могу этого понять. Может ли кто-нибудь помочь мне понять интерфейс iter, который используется в ядре Linux?Какова цель структуры iov_iter в Linux?

ответ

0

Одна из целей iovec, в которой указывается LWN article, заключается в обработке данных в нескольких кусках.

Если у вас есть несколько дискретных буферов, соединенных цепью с указателями, и вы хотите их прочитать или записать за один раз, вы можете просто заменить это несколькими операциями чтения/записи, но в некоторых случаях семантика связана с чтением/писать границы - поэтому ops нельзя просто разбить, не изменяя значения. Альтернативой является копирование всех данных в и из непрерывного буфера, что является расточительным, и мы хотим избежать любой ценой.

Использование POSIX readv/writev или, в нашем случае API iov_iter, уменьшает количество системных вызовов и, следовательно, накладные расходы. Хотя в ядре это не переводит на дорогостоящие операционные системы, такие как контекстные коммутаторы, это все еще вызывает незначительную озабоченность. Драйверы также могут обрабатывать более крупные фрагменты данных более эффективно, чем у них было бы много небольших кусков, когда у них не будет возможности узнать, есть ли еще в ближайшем будущем - это особенно верно для сетевых драйверов, хотя я не знаю iov_iter используется там atm.

Другим примером такой же ситуации является ввод-вывод для необработанных дисков устройств, которые допускают ввод/вывод ввода-вывода до конца и конца блока границ. Пользователь может иногда хотеть выполнять произвольный доступ или перезаписывать небольшой кусок буфера, например, при запуске блока и/или нулевом остатке. Сценарии, подобные этому, - это именно то, что нужно сделать iovec; вы можете построить iovec, который позволяет выполнять всю операцию блока, распределенную по нескольким дискретным буферам, что может включать даже «буфер нуля» для сброса частей считываемого блока и не заботится о его обработке, нулевой буфер для цепочки в конце writev, чтобы обнулить остальную часть блока. Опять же, я должен указать вам, может использовать смежный буфер с соответствующим копированием и/или обнулением, но API iov_iter предоставляет альтернативную абстракцию с меньшими накладными расходами и, возможно, проще рассуждать при чтении кода.

Термин для таких операций, как эти в векторной обработке или параллельных вычислениях, является «обработка разброса/сбора данных».

 Смежные вопросы

  • Нет связанных вопросов^_^