外國(guó)做營(yíng)銷方案的網(wǎng)站360建站和凡科哪個(gè)好

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