內(nèi)核空間與用戶空間
- 操作系統(tǒng)內(nèi)核
可以訪問受保護的內(nèi)存空間,擁有訪問底層硬件設備的所有權限。
為了保護內(nèi)核的安全,操作系統(tǒng)將虛擬空間劃分為:
- 內(nèi)核空間(內(nèi)核代碼運行的地方)
- 用戶空間(用戶程序代碼運行的地方)
內(nèi)核空間和用戶空間是隔離的。用戶程序不能直接操作內(nèi)核,需要通過系統(tǒng)調(diào)用來與內(nèi)核進行通信。
socket的出入
https://blog.csdn.net/fen_liu/article/details/120410870
對于一個socket的出入操作,通常包括兩個階段:
- 等待數(shù)據(jù)從網(wǎng)絡中到達(數(shù)據(jù)到達后,被復制到內(nèi)核的緩沖區(qū))
- 把數(shù)據(jù)從內(nèi)核緩沖區(qū)復制到用戶應用進程緩沖區(qū)
五種IO模型
阻塞式I/O
- 解釋
當應用進程調(diào)用了recv()這個系統(tǒng)調(diào)用,操作系統(tǒng)就開始了IO的第一個階段,用戶這邊,整個進程會被阻塞,當內(nèi)核等到數(shù)據(jù)準備好了,將數(shù)據(jù)從內(nèi)核拷貝到用戶內(nèi)存,然后內(nèi)核返回結果,用戶進程解除阻塞。
- 特點
在IO的兩個階段都阻塞;阻塞式不消耗CPU時間。
- 場景
阻塞 Socket、Java BIO。適用并發(fā)較小的網(wǎng)絡應用,并發(fā)較大的不適用,因為一個請求 IO 阻塞進程,就要為每個請求分配一個進程(線程)來響應,開銷大。
非阻塞式I/O
- 解釋
當用戶進程發(fā)出 recv() 操作時,如果內(nèi)核中的數(shù)據(jù)還沒有準備好,那么它并不會阻塞用戶進程,而是立刻返回一個錯誤碼。一旦內(nèi)核中的數(shù)據(jù)準備好了,并且又再次收到了用戶進程的系統(tǒng)調(diào)用,那么它馬上就將數(shù)據(jù)拷貝到了用戶內(nèi)存,然后返回。
- 特點
在第二階段阻塞;進程輪詢調(diào)用(polling),消耗 CPU 資源。
- 場景
SOCKET 設置 NON BLOCKING 屬性。支持并發(fā)量小,不用及時響應的網(wǎng)絡應用。
IO多路復用(事件驅動)
- 解釋
當用戶進程調(diào)用了 select(poll、epoll),那么整個進程會被阻塞,而此時,內(nèi)核會監(jiān)視所有 select 負責的 socket,當任何一個 socket 中的數(shù)據(jù)準備好了,select 就會返回。這個時候用戶進程再調(diào)用 recv 操作,將數(shù)據(jù)從內(nèi)核拷貝到用戶進程。
- 特點
第一階段在select上阻塞,第二階段依舊阻塞;性能好,Reactor模式。
- 場景
Java NIO,Nginx。適用高并發(fā)服務應用開發(fā),一個進程/線程響應多個請求。
https://mp.weixin.qq.com/s/3gC-nUnFGv-eoSBsEdSZuA
https://cloud.tencent.com/developer/article/1586974
信號驅動式I/O
- 解釋
應用進程使用 sigaction 系統(tǒng)調(diào)用,內(nèi)核立即返回,應用進程可以繼續(xù)執(zhí)行,也就是說等待數(shù)據(jù)階段應用進程是非阻塞的。內(nèi)核在數(shù)據(jù)到達時向應用進程發(fā)送 SIGIO 信號,應用進程收到之后在信號處理程序中調(diào)用 recv()將數(shù)據(jù)從內(nèi)核復制到應用進程中。
- 特點
特點:第二階段阻塞;通知機制,不是輪訓;CPU利用高于非阻塞式IO。
異步I/O
- 解釋
應用進程執(zhí)行 aio_read 系統(tǒng)調(diào)用會立即返回,應用進程可以繼續(xù)執(zhí)行,不會被阻塞,內(nèi)核會在所有操作完成之后向應用進程發(fā)送信號。
- 特點
兩個階段都不會阻塞;異步 I/O 的信號是通知應用進程 I/O 完成,而信號驅動 I/O 的信號是通知應用進程可以開始 I/O。
- 場景
Java 7 AIO、高性能服務器,高性能高并發(fā)。