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()。
這會造成兩種浪費:
- 多一次 memory copy。
- 如果改成多次
write(),又會多次 system call / context switch overhead。
Vectored I/O 讓 OS 在一次 system call 中處理多段 buffer,避免 application 自己先合併資料
How it works
- Application 準備一個 vector,每個 entry 描述一段 buffer 的 address 和 length。
- Application 呼叫 vectored I/O system call,例如
writev()。 - Kernel 檢查整個 vector 的合法性。
- Kernel / driver 依序處理每段 buffer,或交給支援 scatter-gather 的 DMA controller
- 對外表現成一個 logical I/O operation。
Atomicity
某些 scatter-gather implementation 可以提供 Atomic Operations