-
1 # 百萬英雄迷
-
2 # 此生唯一
IO多路複用是同步還是非同步看你站在哪個角度看的,IO多路複用比較經典的模型有selector,poll,epoll!
IO多路複用的發展背景:一開始C/S的通訊,通常是Client端發起一個請求,然後Server端起一個對應的執行緒(或者程序)來處理,各個請求之間並不影響,隨著使用者越來越多,併發量越來越大,server端建立的執行緒逐漸的把整個計算機記憶體全部佔用,導致伺服器卡死!
這個時候IO多路複用開始成為主流,因為其理念為使用一個執行緒不斷輪詢的監聽所有的連線,把活躍連線放入一個處理佇列(selector和epoll有所不同),使用任務執行緒進行處理,這個時候所有的連線執行緒使用一個執行緒代替,併發量提高了很多,例如基於使用epoll模型的nginx,併發量幾萬的時候佔用的執行緒也不過才幾M!
回到題目本身,伺服器在監聽事件的過程中,如果一直沒有請求,那麼監聽的執行緒就是處於阻塞的,因為是使用的單執行緒監聽,也沒有非同步的可能,但是在監聽到事件放入佇列之後,起多個執行緒分別去處理這個連線,這肯定又是非同步的,所以IO多路複用嚴格上來說是同步監聽,非同步處理的!
當然,IO多路複用並不是適用於所有的連線方式(長連線和短連線),如果是短連線,並且活躍事件比較多的情況下,使用IO多路複用,監聽執行緒會崩潰的,而改為使用基於執行緒池的多執行緒連線方式效能更好,如果是長連線的話,IO多路複用才能體現出極大的效能提升。
總的來說,IO多路複用在實際的開發中,用到的場景還是很多的,比如遊戲開發,社交軟體等,也是很多對伺服器要求很高的公司招聘時著重強調的,掌握netty框架還是很有必要的,原始碼在github上有,可以下載來玩玩,更多的技術分享,敬請關注。。。
-
3 # tacogo
其實,區分清楚IO多路複用和非同步AIO(Async IO)這兩個概念就行了,架在多路複用上的非阻塞IO(同步IO),只是用起來像非同步,從使用角度來看就是事件通知機制,但本質上多路複用屬於同步呼叫,同步在等待IO事件這個操作上,例如 select epoll_wait等。AIO非同步IO,可一次提交批次的IO操作。使用aio_xxx系列API,可透過訊號或使用者空間回撥使用IO完成的資料。
-
4 # 程式碼飼養員天齊
最近正好在整理網路程式設計的相關知識,看到了關於IO多路複用的東西。感覺可以將自己的理解說一下。雖然我看的是netty框架,你現在用的是twisted框架。但它們有個共同點就是底層都使用了epoll。既然是這樣,那麼就是雖然語言不通,但其背後的技術是相同的。
首先,說一下IO多路複用技術。IO多路複用技術透過把多個IO的阻塞複用到同一個select的阻塞上,從而使得系統在單執行緒的情況下可以同時處理多個客戶端請求。目前,支援I/O多路複用的有select、poll、epoll。顯然epoll是支援I/O多路複用技術的。
除了這個題主還提到了reactor設計模式,另外題主還引用了一個圖,相信這個圖所在的文章題主應該看過了。這個圖中有一個reactor模式的說明。為了快速回復就直接引用過來,以便可以更形象的進行說明。
從上圖可以看到使用者執行緒首先是註冊事件處理器,沒有阻塞直接返回,返回後可以繼續進行其他操作。相當於等待的工作交給Reactor來執行,當Reactor做輪詢時發現數據就緒就會通知使用者讀取資料。此時資料便可以直接讀取出來。
所以對使用者執行緒來說是非同步的,使用者發出讀請求後,不再是一直等待,而是馬上返回可以繼續處理其他事情,當資料真正準備好了之後,可以直接讀取。等待的工作由Reactor呼叫select來完成,而select是阻塞的。所以I/O多路複用是非同步阻塞的。說twisted是非同步的沒問題。非同步與非同步IO並不等價,非同步並不一定做的是I/O操作。
本人具有多年的java開發經驗,熟悉多種框架,熟悉網路程式設計,熟悉java安全程式設計,熟悉大資料,熟悉多種安全協議,有興趣的同學可以互相關注,互相學習!!!
epoll技術屬於IO複用,IO複用屬於同步IO,所以epoll屬於同步IO,現在我用了一個框架,比如twisted,裡面的reactor模式的實現是基於epoll或者poll的,在IO的範疇應該是屬於同步IO,但是網上幾乎所有的文章都說twisted是非同步的。非同步與非同步IO是不是一個東西?
回覆列表
首先明確概念 非同步就是說你幹一件事的時候還可以幹另外一件 IO就是指輸入輸出 兩者獨立 ;非同步IO的意思是IO的時候可以幹其他的不用等待IO操作;另外 linux裡非同步IO只有針對本地檔案的 網路IO都是同步的 epoll也是需要等待epoll_wait後才能繼續操作 只是epoll內部有關核心的實現是非同步的(核心不斷監聽事件和把對應的事件透過連結串列返回給你的epollevent傳出引數) 但對於使用者層就是同步的 因為需要等待wait幹完才能繼續 也就是epoll監聽是同步的