NIO与传统IO的区别(形象比喻)
? ? ? ? 傳統(tǒng)的socket IO中,需要為每個(gè)連接創(chuàng)建一個(gè)線程,當(dāng)并發(fā)的連接數(shù)量非常巨大時(shí),線程所占用的棧內(nèi)存和CPU線程切換的開銷將非常巨大。使用NIO,不再需要為每個(gè)線程創(chuàng)建單獨(dú)的線程,可以用一個(gè)含有限數(shù)量線程的線程池,甚至一個(gè)線程來(lái)為任意數(shù)量的連接服務(wù)。由于線程數(shù)量小于連接數(shù)量,所以每個(gè)線程進(jìn)行IO操作時(shí)就不能阻塞,如果阻塞的話,有些連接就得不到處理,NIO提供了這種非阻塞的能力。
????????小量的線程如何同時(shí)為大量連接服務(wù)呢,答案就是就緒選擇。這就好比到餐廳吃飯,每來(lái)一桌客人,都有一個(gè)服務(wù)員專門為你服務(wù),從你到餐廳到結(jié)帳走人,這樣方式的好處是服務(wù)質(zhì)量好,一對(duì)一的服務(wù),VIP啊,可是缺點(diǎn)也很明顯,成本高,如果餐廳生意好,同時(shí)來(lái)100桌客人,就需要100個(gè)服務(wù)員,那老板發(fā)工資的時(shí)候得心痛死了,這就是傳統(tǒng)的一個(gè)連接一個(gè)線程的方式。
????????老板是什么人啊,精著呢。這老板就得捉摸怎么能用10個(gè)服務(wù)員同時(shí)為100桌客人服務(wù)呢,老板就發(fā)現(xiàn),服務(wù)員在為客人服務(wù)的過(guò)程中并不是一直都忙著,客人點(diǎn)完菜,上完菜,吃著的這段時(shí)間,服務(wù)員就閑下來(lái)了,可是這個(gè)服務(wù)員還是被這桌客人占用著,不能為別的客人服務(wù),用華為領(lǐng)導(dǎo)的話說(shuō),就是工作不飽滿。那怎么把這段閑著的時(shí)間利用起來(lái)呢。這餐廳老板就想了一個(gè)辦法,讓一個(gè)服務(wù)員(前臺(tái))專門負(fù)責(zé)收集客人的需求,登記下來(lái),比如有客人進(jìn)來(lái)了、客人點(diǎn)菜了,客人要結(jié)帳了,都先記錄下來(lái)按順序排好。每個(gè)服務(wù)員到這里領(lǐng)一個(gè)需求,比如點(diǎn)菜,就拿著菜單幫客人點(diǎn)菜去了。點(diǎn)好菜以后,服務(wù)員馬上回來(lái),領(lǐng)取下一個(gè)需求,繼續(xù)為別人客人服務(wù)去了。這種方式服務(wù)質(zhì)量就不如一對(duì)一的服務(wù)了,當(dāng)客人數(shù)據(jù)很多的時(shí)候可能需要等待。但好處也很明顯,由于在客人正吃飯著的時(shí)候服務(wù)員不用閑著了,服務(wù)員這個(gè)時(shí)間內(nèi)可以為其他客人服務(wù)了,原來(lái)10個(gè)服務(wù)員最多同時(shí)為10桌客人服務(wù),現(xiàn)在可能為50桌,60客人服務(wù)了。
?
這種服務(wù)方式跟傳統(tǒng)的區(qū)別有兩個(gè):
1、增加了一個(gè)角色,要有一個(gè)專門負(fù)責(zé)收集客人需求的人。NIO里對(duì)應(yīng)的就是Selector。
2、由阻塞服務(wù)方式改為非阻塞服務(wù)了,客人吃著的時(shí)候服務(wù)員不用一直侯在客人旁邊了。傳統(tǒng)的IO操作,比如read(),當(dāng)沒(méi)有數(shù)據(jù)可讀的時(shí)候,線程一直阻塞被占用,直到數(shù)據(jù)到來(lái)。NIO中沒(méi)有數(shù)據(jù)可讀時(shí),read()會(huì)立即返回0,線程不會(huì)阻塞。
?
NIO中,客戶端創(chuàng)建一個(gè)連接后,先要將連接注冊(cè)到Selector,相當(dāng)于客人進(jìn)入餐廳后,告訴前臺(tái)你要用餐,前臺(tái)會(huì)告訴你你的桌號(hào)是幾號(hào),然后你就可能到那張桌子坐下了,SelectionKey就是桌號(hào)。當(dāng)某一桌需要服務(wù)時(shí),前臺(tái)就記錄哪一桌需要什么服務(wù),比如1號(hào)桌要點(diǎn)菜,2號(hào)桌要結(jié)帳,服務(wù)員從前臺(tái)取一條記錄,根據(jù)記錄提供服務(wù),完了再來(lái)取下一條。這樣服務(wù)的時(shí)間就被最有效的利用起來(lái)了。
總結(jié)
以上是生活随笔為你收集整理的NIO与传统IO的区别(形象比喻)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mongodb 安装启动
- 下一篇: openstack swift midd