Vectored I/O

Basic Concept

Vectored I/O 是讓一個 system call 同時處理多個 buffer 的 I/O interface。一般 read() / write() 通常只處理一段 contiguous buffer;vectored I/O 則讓 application 傳入一個 buffer vector,OS 依序從多個 memory regions 讀取或寫入。

UNIX 的 readv() / writev() 是典型例子。這種方法也常被稱為 scatter-gather I/O

  • Scatter:把一個 input source 的資料分散寫到多個 buffers。
  • Gather:把多個 buffers 的資料收集起來寫到同一個 output destination。

Motivation

很多資料在 application memory 裡本來就不是連續放在同一個大 buffer。例如 network packet 可能由 header、metadata、payload 分別存在不同 buffer。如果沒有 vectored I/O,application 可能要先配置一個大 buffer,把這些片段 copy 成連續資料,再呼叫一次 write()

這會造成兩種浪費:

  1. 多一次 memory copy。
  2. 如果改成多次 write(),又會多次 system call / context switch overhead。

Vectored I/O 讓 OS 在一次 system call 中處理多段 buffer,避免 application 自己先合併資料

How it works

  1. Application 準備一個 vector,每個 entry 描述一段 buffer 的 address 和 length。
  2. Application 呼叫 vectored I/O system call,例如 writev()
  3. Kernel 檢查整個 vector 的合法性。
  4. Kernel / driver 依序處理每段 buffer,或交給支援 scatter-gather 的 DMA controller
  5. 對外表現成一個 logical I/O operation。

Atomicity

某些 scatter-gather implementation 可以提供 Atomic Operations