????????我們作為開發(fā)的拆又,很多底層?xùn)|西都需要了解一點(diǎn),因?yàn)槿f一自己有機(jī)會(huì)去開發(fā)框架而不是單單的寫業(yè)務(wù)了呢栏账。而我就是在慢慢的摸索中帖族。關(guān)于IO的東西,我也是看看視頻挡爵,自己敲敲代碼竖般,然后就來這里記一下筆記。
? ? ? ? 先說一下幾個(gè)個(gè)人理解的概念吧茶鹃,阻塞和非阻塞(BIO對比NIO):線程訪問數(shù)據(jù)時(shí)涣雕,數(shù)據(jù)是需要準(zhǔn)備時(shí)間的,特別是io讀取闭翩,因?yàn)橛脩魬B(tài)和內(nèi)核態(tài)的切換以及數(shù)據(jù)的解析讀取都是很慢的挣郭,所以才會(huì)有阻塞的情況。阻塞就是數(shù)據(jù)沒有準(zhǔn)備好的時(shí)候疗韵,一定停滯不前兑障,等到數(shù)據(jù)完全準(zhǔn)備好才進(jìn)行下一步的操作。而非阻塞就是數(shù)據(jù)沒有準(zhǔn)備好,那我就返回做自己其他的事旺垒,等到準(zhǔn)備好了再回來執(zhí)行,那么這里就有一個(gè)通知問題肤无。NIO就是通過多路復(fù)用選擇器無限循環(huán)(輪詢)獲取數(shù)據(jù)的完成情況來做到的先蒋。(linux的selector模式)。
? ? ? ? 同步和異步(BIO宛渐、NIO對比AIO):這兩個(gè)概念是基于應(yīng)用程序和操作系統(tǒng)處理IO時(shí)間鎖采用的方法竞漾。同步就是直接參與,數(shù)據(jù)完成之后才返回窥翩,這樣會(huì)阻塞在一個(gè)方法上面(所以BIO和NIO都是會(huì)阻塞的业岁,只是BIO阻塞就一直等待,NIO阻塞寇蚊,可以通過選擇器繼續(xù)下次的io笔时,他們兩個(gè)其實(shí)調(diào)用read方法都是阻塞的)。異步就是遇到IO直接讓操作系統(tǒng)去做(linux的epoll模式)仗岸,自己等著通知就可以了允耿。
? ? ? ? BIO,每次請求過來扒怖,都必須開一個(gè)線程较锡,因?yàn)槟悴恢肋@個(gè)任務(wù)需要讀取多少東西,或者根據(jù)不想讀取盗痒,就是請求連接蚂蕴,然后一直等著客戶端的輸入。這樣就會(huì)出現(xiàn)很多無用的線程俯邓,但是因?yàn)榭蛻舳说妮斎牖蛘卟蛔鳛槁饴ィ@些線程還不能shutdown,這樣任務(wù)多了對于服務(wù)端就是線程爆炸看成,拖慢所有的線程君编。
? ? ? ? NIO,每次請求過來川慌,都會(huì)在selector上面注冊一個(gè)信息吃嘿,然后selector循環(huán)遍歷這些信息,遇到讀寫的情況才會(huì)通知操作系統(tǒng)去處理IO事件梦重,這樣就可以省下很多無用的線程兑燥。
? ? ? ? 對比:感覺NIO很優(yōu)是不是,是的琴拧。但是BIO就一無是處了嗎降瞳?不是,如果遇到所有的連接都是IO讀寫,而且都是大任務(wù)(就是讀和寫都花費(fèi)很長的時(shí)間)挣饥,這樣的情況下除师,NIO也沒有什么優(yōu)勢,反而會(huì)因?yàn)槎嗔诉x擇器扔枫,拖慢了總體的進(jìn)度汛聚,而且NIO是基于bufferr緩存的,也就是每次讀取一個(gè)緩存短荐,這樣可能會(huì)出現(xiàn)讀取半個(gè)數(shù)據(jù)倚舀,這樣對于解析來說就復(fù)雜很多。這時(shí)候BIO反而會(huì)好很多忍宋。所以NIO最適用的就是請求數(shù)據(jù)量不大的情況下痕貌,如果每次都是例如文件下載的方式,BIO效果更好糠排。
? ? ? ? AIO舵稠,每次請求過來,我們只需要通知操作系統(tǒng)去做IO乳讥,用戶線程不參與進(jìn)去柱查,操作系統(tǒng)讀取完成通知用戶線程,這時(shí)候再去處理云石,同樣是基于緩存的唉工。
? ? ? ? 其實(shí)這些概念說的都很乏味,還不如直接上代碼汹忠,我也手寫了BIO和AIO客戶端和服務(wù)端的一些代碼淋硝,每一行都有注釋。
? ? ? ? 對于這些東西宽菜,必須自己動(dòng)手敲一遍谣膳,不然用戶都只是停留在概念,然后看了忘铅乡,留下不了什么继谚,必須,必須阵幸,必須自己動(dòng)手花履。
? ? ? ? 代碼好像不能上傳簡書,我只好上傳自己的github了挚赊。诡壁。。尷尬https://github.com/1581501186/BaseInterfaceWithNoImpl