一般網路通訊設計到兩台電腦a,b。假設每個電腦都是linux核心,那麼兩個使用者程式的通訊過程就是:a上的使用者執行緒->a的核心->a的網絡卡->網線->b的網絡卡->b的核心->b上的使用者執行緒。
那麼一般的同步形容的是哪一部分的內容呢?按照我的理解是,對於a、b而言,如果是同步,在核心->使用者執行緒或者使用者執行緒->核心這一步就是使用者執行緒需要花cpu同步執行的,就是需要等待。但是如果是非同步,這兩個過程就是讓核心去執行的,也就是把使用者執行緒解放了,自然就達到了非同步的要求。
不論有多少個a(a1,a2,a3…)發起連線請求,就有多少個b(b1,b2,b3)接收請求,b需要等待整個過程,b1執行緒接受a1的請求之後,只能專門盯著對應a1的這個socket,也不能去做別的。如果併發量上去之後,這個負載就很大了。
比方說:十個燒水壺,需要十個人盯著,水壺要燒開了,對應的人就把這個水壺的開關關掉,再喝裡面的熱水。
nio就是雖然有多個a在連線,連線肯定有先後,而且傳輸資料有快慢,但是只有乙個執行緒b進行處理,如果a1先到,就先處理a1,來了a2,如果之前沒處理好,就要等待b處理好a1,再來處理a2;但是,如果a1沒好,就先處理其他準備好的,比如a2。這個就是同步非阻塞,就是b不會阻塞在乙個請求執行緒上,但是這個執行緒還是同步處理,b執行緒需要自己去核心拿資料。
這個過程描述起來就是乙個reactor模型,b可以監聽多個socket,只要乙個socket有事件,就處理這個事件,也是乙個io多路復用的思想,這樣乙個執行緒就能處理多個請求,但是如果每個請求的資料傳輸量都很大,那麼其實這個效率也會退化到bio差不多的水準。
比方說:十個燒水壺,只要乙個人盯著,只要有乙個水壺要燒開了,這個人就把這個水壺的開關關掉,再有乙個要燒開了,就再把那個給關掉。水壺裡面的水就是資料,燒開的過程就是資料準備的過程,人關掉熱水的過程就是資料從核心到使用者執行緒的過程。
aio與nio的差別就在於,資料從核心到使用者執行緒這一步,是由核心完成的,這樣使用者執行緒就能專們處理業務邏輯相關的程式。對於使用者執行緒來說,資料是即拿即用的。
比方說:十個燒水壺,乙個人只要開啟開關(接收請求),然後水燒開了,水壺會自動斷電,整個過程就是全自動的,非同步非阻塞,你要用了就自己過來拿。
這三個io迷惑了半年,用一種我能理解的方式解釋了一下,如果行文有誤,麻煩各位解惑。
JAVA 中BIO,NIO,AIO的理解
bio nio aio含義跟適用場景 bio 同步阻塞io 定義 同步並阻塞,伺服器實現模式為乙個連線乙個執行緒,即客戶端有連線請求時伺服器端就需要啟動乙個執行緒進行處理,如果這個連線不做任何事情會造成不必要的執行緒開銷,當然可以通過執行緒池機制改善。適用場景 適用於連線數目比較小且固定的架構,這種...
BIO NIO AIO個人心得筆記
io是一套用於資料傳輸的機制 bio blocking io 同步式阻塞式io nio nonblocking io 同步式非阻塞式io jdk1.4 tomcat aio asynchronous io 非同步式非阻塞式io jdk1.8 bio的缺點 單向流 資料只能從一端流向另一端,這就導致如...
BIO NIO AIO的形象比喻
bio blocking i o 同步阻塞i o模式。nio new i o 同步非阻塞模式。aio asynchronous i o 非同步非阻塞i o模型。先看阻塞和非阻塞的區別,以燒水為例 阻塞vs非阻塞 人是否坐在水壺前面一直等。同步vs非同步 水壺是不是在水燒開之後主動通知人。再加上同步 ...