copy form https://blog.csdn.net/lisonglisonglisong/article/details/51944671
兩個階段:
- 等待數(shù)據(jù)
- 數(shù)據(jù)從內(nèi)核態(tài)復(fù)制到用戶態(tài)
1. 阻塞式IO
階段1與階段2都阻塞

image.png
2. 非阻塞式IO
依然會在階段2阻塞

image.png
3. IO多路復(fù)用(事件驅(qū)動IO)
依然會在階段2阻塞

image.png
4. 信號驅(qū)動式IO

image.png
5. 異步IO

image.png
五種IO模型比較
1-4 都是階段2阻塞

image.png
阻塞/非阻塞
阻塞I/O會一直阻塞用戶進程直到操作完成
非阻塞I/O在內(nèi)核的數(shù)據(jù)還沒準(zhǔn)備好的情況下會立即返回
同步/異步
POSIX是這樣定義的:
A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes. —— 同步IO操作導(dǎo)致進程阻塞,直到IO操作完成。
An asynchronous I/O operation does not cause the requesting process to be blocked. —— 異步IO操作不導(dǎo)致進程阻塞。
上面定義中的I/O operation是指真正的I/O系統(tǒng)調(diào)用,比如recvfrom,所以阻塞式I/O模型、非阻塞式I/O模型、I/O復(fù)用模型、信號驅(qū)動式I/O模型都屬于同步I/O。
只有異步I/O模型屬于POSIX定義的異步I/O,因為在異步I/O模型中,用戶進程是將整個I/O操作都交給內(nèi)核來完成,內(nèi)核完成后發(fā)信號通知,在此期間用戶進程完全不用去理會。