外國做營銷方案的網(wǎng)站360建站和凡科哪個好

注:還有一種信號驅動IO,使用較少暫不討論;
一,區(qū)分阻塞、非阻塞和同步、異步
看了很多文章對這兩組概念解釋和對比,說的太復雜了,其實沒必要,兩句話就能說清楚。
首先,對于讀數(shù)據(jù)recv或read(寫數(shù)據(jù)同理),分兩個階段:
- 等待數(shù)據(jù)可讀;
- 系統(tǒng)調用講數(shù)據(jù)從內核拷貝到用戶空間;
然后,對比兩組概念:
- 阻塞、非阻塞是對于等待數(shù)據(jù)可讀、可寫時,是否死等,即看第一階段;
- 同步、異步是對于數(shù)據(jù)在用戶空間和內核傳遞時,是否等待完成,即看第二階段;
可以得出結論:阻塞IO、非阻塞IO、多路復用都屬于同步IO,區(qū)別于異步IO。
二,關于多路復用
- 多路復用介紹參考:萬字圖解| 深入揭秘IO多路復用-騰訊云開發(fā)者社區(qū)-騰訊云;
- IO 多路復用的復用指的是復用線程,而不是IO連接,目的是讓少量線程能夠處理多個IO連接和讀寫;
- 多路復用有兩個會阻塞的階段:第一階段阻塞在select、epoll等系統(tǒng)調用,第二階段阻塞在數(shù)據(jù)拷貝;
- 多路復用首先是同步IO,但是阻塞還是非阻塞不同文章說法不一,如果從第一階段是否卡住死等數(shù)據(jù)就緒來看,是阻塞IO。
- 注意區(qū)分系統(tǒng)調用(如select、epoll)的阻塞和socket本身的阻塞,一般來說使用select、epoll是需要將socket設置為非阻塞的,因為有時返回socket可讀但執(zhí)行recv時發(fā)現(xiàn)并沒數(shù)據(jù),如果阻塞就會卡住;再者避免由于一個FD的阻塞讀/阻塞寫操作把處理多個文件描述符的任務餓死。參考:使用epoll時需要將socket設為非阻塞嗎?-騰訊云開發(fā)者社區(qū)-騰訊云
三,區(qū)分原生Socket的非阻塞和NIO
- 原生Socket在創(chuàng)建的時候也可以指定為阻塞或非阻塞模式(區(qū)別只在第一個等待數(shù)據(jù)的階段,第二個階段調用recv拷貝數(shù)據(jù)都是一樣的)。原生非阻塞Socket編程較復雜,比如可能需要循環(huán)判斷send和recv的數(shù)據(jù)量是否完整,故一般不會輕易挑戰(zhàn)。
- 原生Socket也是可以編程實現(xiàn)多路復用的,參考:SOCKET編程與復用 | YuYoung's Blog
- NIO底層實現(xiàn)也是操作的原生Socket,可以看作是對以上兩點的包裝,對使用者更友好。
=====================
點關注,不迷路,有緣再見!