內(nèi)核空間與用戶空間
- 操作系統(tǒng)內(nèi)核
可以訪問受保護(hù)的內(nèi)存空間誊薄,擁有訪問底層硬件設(shè)備的所有權(quán)限喳挑。
為了保護(hù)內(nèi)核的安全曹动,操作系統(tǒng)將虛擬空間劃分為:
- 內(nèi)核空間(內(nèi)核代碼運(yùn)行的地方)
- 用戶空間(用戶程序代碼運(yùn)行的地方)
內(nèi)核空間和用戶空間是隔離的疚俱。用戶程序不能直接操作內(nèi)核甸怕,需要通過系統(tǒng)調(diào)用來與內(nèi)核進(jìn)行通信。
socket的出入
https://blog.csdn.net/fen_liu/article/details/120410870
對于一個socket的出入操作灰伟,通常包括兩個階段:
- 等待數(shù)據(jù)從網(wǎng)絡(luò)中到達(dá)(數(shù)據(jù)到達(dá)后拆又,被復(fù)制到內(nèi)核的緩沖區(qū))
- 把數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到用戶應(yīng)用進(jìn)程緩沖區(qū)
五種IO模型
阻塞式I/O
- 解釋
當(dāng)應(yīng)用進(jìn)程調(diào)用了recv()這個系統(tǒng)調(diào)用,操作系統(tǒng)就開始了IO的第一個階段栏账,用戶這邊帖族,整個進(jìn)程會被阻塞,當(dāng)內(nèi)核等到數(shù)據(jù)準(zhǔn)備好了挡爵,將數(shù)據(jù)從內(nèi)核拷貝到用戶內(nèi)存竖般,然后內(nèi)核返回結(jié)果,用戶進(jìn)程解除阻塞茶鹃。
- 特點(diǎn)
在IO的兩個階段都阻塞涣雕;阻塞式不消耗CPU時間。
- 場景
阻塞 Socket前计、Java BIO胞谭。適用并發(fā)較小的網(wǎng)絡(luò)應(yīng)用垃杖,并發(fā)較大的不適用男杈,因為一個請求 IO 阻塞進(jìn)程,就要為每個請求分配一個進(jìn)程(線程)來響應(yīng)调俘,開銷大伶棒。
非阻塞式I/O
- 解釋
當(dāng)用戶進(jìn)程發(fā)出 recv() 操作時旺垒,如果內(nèi)核中的數(shù)據(jù)還沒有準(zhǔn)備好,那么它并不會阻塞用戶進(jìn)程肤无,而是立刻返回一個錯誤碼先蒋。一旦內(nèi)核中的數(shù)據(jù)準(zhǔn)備好了,并且又再次收到了用戶進(jìn)程的系統(tǒng)調(diào)用宛渐,那么它馬上就將數(shù)據(jù)拷貝到了用戶內(nèi)存竞漾,然后返回。
- 特點(diǎn)
在第二階段阻塞窥翩;進(jìn)程輪詢調(diào)用(polling)业岁,消耗 CPU 資源。
- 場景
SOCKET 設(shè)置 NON BLOCKING 屬性寇蚊。支持并發(fā)量小笔时,不用及時響應(yīng)的網(wǎng)絡(luò)應(yīng)用。
IO多路復(fù)用(事件驅(qū)動)
- 解釋
當(dāng)用戶進(jìn)程調(diào)用了 select(poll仗岸、epoll)允耿,那么整個進(jìn)程會被阻塞,而此時扒怖,內(nèi)核會監(jiān)視所有 select 負(fù)責(zé)的 socket较锡,當(dāng)任何一個 socket 中的數(shù)據(jù)準(zhǔn)備好了,select 就會返回盗痒。這個時候用戶進(jìn)程再調(diào)用 recv 操作念链,將數(shù)據(jù)從內(nèi)核拷貝到用戶進(jìn)程。
- 特點(diǎn)
第一階段在select上阻塞积糯,第二階段依舊阻塞掂墓;性能好,Reactor模式看成。
- 場景
Java NIO君编,Nginx。適用高并發(fā)服務(wù)應(yīng)用開發(fā)川慌,一個進(jìn)程/線程響應(yīng)多個請求吃嘿。
https://mp.weixin.qq.com/s/3gC-nUnFGv-eoSBsEdSZuA
https://cloud.tencent.com/developer/article/1586974
信號驅(qū)動式I/O
- 解釋
應(yīng)用進(jìn)程使用 sigaction 系統(tǒng)調(diào)用,內(nèi)核立即返回梦重,應(yīng)用進(jìn)程可以繼續(xù)執(zhí)行兑燥,也就是說等待數(shù)據(jù)階段應(yīng)用進(jìn)程是非阻塞的。內(nèi)核在數(shù)據(jù)到達(dá)時向應(yīng)用進(jìn)程發(fā)送 SIGIO 信號琴拧,應(yīng)用進(jìn)程收到之后在信號處理程序中調(diào)用 recv()將數(shù)據(jù)從內(nèi)核復(fù)制到應(yīng)用進(jìn)程中降瞳。
- 特點(diǎn)
特點(diǎn):第二階段阻塞;通知機(jī)制,不是輪訓(xùn)挣饥;CPU利用高于非阻塞式IO除师。
異步I/O
- 解釋
應(yīng)用進(jìn)程執(zhí)行 aio_read 系統(tǒng)調(diào)用會立即返回,應(yīng)用進(jìn)程可以繼續(xù)執(zhí)行扔枫,不會被阻塞汛聚,內(nèi)核會在所有操作完成之后向應(yīng)用進(jìn)程發(fā)送信號。
- 特點(diǎn)
兩個階段都不會阻塞短荐;異步 I/O 的信號是通知應(yīng)用進(jìn)程 I/O 完成倚舀,而信號驅(qū)動 I/O 的信號是通知應(yīng)用進(jìn)程可以開始 I/O。
- 場景
Java 7 AIO忍宋、高性能服務(wù)器瞄桨,高性能高并發(fā)。