7.3.2 非阻塞IO(non-blocking IO)
Linux下,可以通過設(shè)置socket使其變?yōu)閚on-blocking。
當(dāng)對一個non-blocking socket執(zhí)行讀操作時,流程是這個樣子:
從圖中可以看出,當(dāng)用戶進(jìn)程發(fā)出read操作時,如果kernel中的數(shù)據(jù)還沒有準(zhǔn)備好,那么它并不會block用戶進(jìn)程,而是立刻返回一個error。
用戶進(jìn)程判斷結(jié)果是一個error時,它就知道數(shù)據(jù)還沒有準(zhǔn)備好,于是用戶就可以在本次到下次再發(fā)起read詢問的時間間隔內(nèi)做其他事情,或者直接再次發(fā)送read操作。
一旦kernel中的數(shù)據(jù)準(zhǔn)備好了,并且又再次收到了用戶進(jìn)程的system call,那么它馬上就將數(shù)據(jù)拷貝到了用戶內(nèi)存(這一階段仍然是阻塞的),然后返回。
也就是說非阻塞的recvform系統(tǒng)調(diào)用調(diào)用之后,進(jìn)程并沒有被阻塞,內(nèi)核馬上返回給進(jìn)程,如果數(shù)據(jù)還沒準(zhǔn)備好,此時會返回一個error。
進(jìn)程在返回之后,可以干點別的事情,然后再發(fā)起recvform系統(tǒng)調(diào)用。
重復(fù)上面的過程,循環(huán)往復(fù)的進(jìn)行recvform系統(tǒng)調(diào)用。
這個過程通常被稱之為輪詢。
輪詢檢查內(nèi)核數(shù)據(jù),直到數(shù)據(jù)準(zhǔn)備好,再拷貝數(shù)據(jù)到進(jìn)程,進(jìn)行數(shù)據(jù)處理。
需要注意&#
總結(jié)
以上是生活随笔為你收集整理的7.3.2 非阻塞IO(non-blocking IO)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7.3.1 阻塞IO(blocking
- 下一篇: 7.3.3 多路复用IO(IO mult