在《輕松搞懂5種IO模型》中,我發起了一個投票,
答案是【同步IO多路復用】,目前,60%的朋友答對了,原因這里解釋一下,
同步和異步的概念區別
同步:執行緒自己去獲取結果,(一個執行緒)
異步:執行緒自己不去獲取結果,而由其他執行緒送結果,(至少兩個執行緒)
異步執行如下圖所示,除非不需要知道結果,否則一般會有一個回呼方法,

IO多路復用的本質
為了徹底理解IO多路復用是同步還是異步,咱們探究一下IO多路復用的本質,
I/O多路復用,復用的IO監聽等待這條路,實際上就是用select/poll/epoll監聽多個io物件,當io物件有變化(有資料)的時候就通知用戶行程,好處就是單個行程可以處理多個socket,
select/poll/epoll的優勢并不是對于單個連接能處理得更快,而是在于能處理更多的連接,
對于每一個socket,一般都設定成為non-blocking,但是,整個用戶的process其實是一直被阻塞的,只不過process是被select這個函式阻塞,而不是被socket IO給阻塞,

I/O多路復用的流程如上圖所示:
(1)當用戶行程呼叫了select,那么整個行程會被阻塞;
(2)而同時,內核會“監視”所有select負責的socket;
(3)當任何一個socket中的資料準備好了,select就會回傳;
(4)這個時候用戶行程再呼叫read/accept/write操作,做一些資料從內核拷貝到用戶行程這樣的事情,
所以,I/O 多路復用的特點是通過一種機制一個行程能同時等待多個檔案描述符,而這些檔案描述符(套接字描述符)其中的任意一個進入讀就緒狀態,select()函式就可以回傳,
事實上,I/O 多路復用有時候性能比同步阻塞IO還更差一些,因為這里需要使用兩個系統呼叫(select 和 recvfrom),而同步阻塞IO只呼叫了一個系統呼叫(recvfrom),但是,用select的優勢在于它可以同時處理多個連接,所以,如果處理的連接數不是很高的話,可能延遲還更大,
總結
打個比方:行軍打仗講究糧草先行,諸葛亮比較牛,他打仗只帶少量糧草,其他靠敵軍送,這天他又派了暗探去查看敵軍糧草的守衛情況,如果敵人守備松懈,則趁機偷糧,如果這個暗探只偷一袋糧食,那效率最高的是不是他看到敵軍守備松懈就直接進去偷糧(同步阻塞IO)?但是他要偷的是十萬大軍的糧食,那他就要先回去匯報一聲:“守備松懈啦”,然后百人小分隊一起去把糧草偷出來(I/O 多路復用),當然啦,以諸葛亮的一貫作風而言,最后他還得放一把火,
暗探在同步阻塞模式下,打探敵情也是他,偷糧也是他,在諸葛亮團隊中,暗探在打探敵情時最終暗探是第一個獲取到結果的,暗探在偷糧時也是第一個自己知道結果的,(同步)
暗探在I/O 多路復用模式下,打探敵情也是他,偷糧是百人小分隊,在諸葛亮團隊中,暗探在打探敵情時最終執行者暗探是第一個獲取到結果的,百人小分隊在偷糧時也是百人小分隊自己先知道結果的,(同步)
綜上,IO多路復用是同步的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/428422.html
標籤:Linux
