2 回答

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超4個(gè)贊
內(nèi)核空間、用戶(hù)空間、計(jì)算機(jī)體系結(jié)構(gòu)、計(jì)算機(jī)組成原理、…… 確實(shí)有點(diǎn)兒深?yuàn)W。
我的新書(shū)《代碼之謎》會(huì)有專(zhuān)門(mén)的章節(jié)講解相關(guān)知識(shí),現(xiàn)在寫(xiě)個(gè)簡(jiǎn)短的科普文:
就速度來(lái)說(shuō) CPU > 內(nèi)存 > 硬盤(pán)
I
- 就是從硬盤(pán)到內(nèi)存O
- 就是從內(nèi)存到硬盤(pán)
第一種方式:我從硬盤(pán)讀取數(shù)據(jù),然后程序一直等,數(shù)據(jù)讀完后,繼續(xù)操作。這種方式是最簡(jiǎn)單的,叫阻塞IO。
第二種方式:我從硬盤(pán)讀取數(shù)據(jù),然后程序繼續(xù)向下執(zhí)行,等數(shù)據(jù)讀取完后,通知當(dāng)前程序(對(duì)硬件來(lái)說(shuō)叫中斷,對(duì)程序來(lái)說(shuō)叫回調(diào)),然后此程序可以立即處理數(shù)據(jù),也可以執(zhí)行完當(dāng)前操作在讀取數(shù)據(jù)。
在一起的 Java IO 中,都是阻塞式 IO,NIO 引入了非阻塞式 IO。
還有一種就是同步 IO 和異步 IO。經(jīng)常說(shuō)的一個(gè)術(shù)語(yǔ)就是“異步非阻塞”,好象異步和非阻塞是同一回事,這大概是一個(gè)誤區(qū)吧。
至于 Java NIO 的 Selector,在舊的 Java IO 系統(tǒng)中,是基于 Stream 的,即“流”,流式 IO。
當(dāng)程序從硬盤(pán)往內(nèi)存讀取數(shù)據(jù)的時(shí)候,操作系統(tǒng)使用了 2 個(gè)“小伎倆”來(lái)提高性能,那就是預(yù)讀,如果我讀取了第一扇區(qū)的第三磁道的內(nèi)容,那么你很有可能也會(huì)使用第二磁道和第四磁道的內(nèi)容,所以操作系統(tǒng)會(huì)把附近磁道的內(nèi)容提前讀取出來(lái),放在內(nèi)存中,即緩存。
(PS:以上過(guò)程簡(jiǎn)化了)
通過(guò)上面可以看到,操作系統(tǒng)是按塊 Block從硬盤(pán)拿數(shù)據(jù),就如同一個(gè)大臉盆,一下子就放入了一盆水。但是,當(dāng) Java 使用的時(shí)候,舊的 IO 確實(shí)基于 流 Stream的,也就是雖然操作系統(tǒng)給我了一臉盆水,但是我得用吸管慢慢喝。
于是,NIO 橫空出世。
添加回答
舉報(bào)