无招胜有招之NIO
?
?
- 用戶(hù)空間和內(nèi)核空間
Linux系統(tǒng)將自身劃分為兩部分,一部分為核心軟件,即是kernel,也稱(chēng)作內(nèi)核空間,另一部分為普通應(yīng)用程序,這部分稱(chēng)為用戶(hù)空間。
我比較喜歡的一種解釋話(huà)語(yǔ):計(jì)算機(jī)硬件由運(yùn)算器、控制器、存儲(chǔ)器、輸入輸出設(shè)備等設(shè)備組成,而能讓機(jī)箱中各種設(shè)備各司其職的東西叫做系統(tǒng)內(nèi)核。內(nèi)核負(fù)責(zé)驅(qū)動(dòng)硬件,管理活動(dòng)和分配管理硬件資源,所以它不能直接讓用戶(hù)操作。
因?yàn)橛脩?hù)不能直接控制硬件,也不能直接操作內(nèi)核,于是便需要基于“系統(tǒng)調(diào)用接口”開(kāi)發(fā)出的程序服務(wù)來(lái)滿(mǎn)足用戶(hù)日常工作。
?
- BIO.NIO.AIO
BIO:同步阻塞式IO,服務(wù)器實(shí)現(xiàn)模式為一個(gè)連接一個(gè)線(xiàn)程,即客戶(hù)端有連接請(qǐng)求時(shí)服務(wù)器端就需要啟動(dòng)一個(gè)線(xiàn)程進(jìn)行處理,如果這個(gè)連接不做任何事情會(huì)造成不必要的線(xiàn)程開(kāi)銷(xiāo),當(dāng)然可以通過(guò)線(xiàn)程池機(jī)制改善。?
BIO即阻塞I/O, 不管是磁盤(pán)I/O 還是網(wǎng)絡(luò)I/O, 數(shù)據(jù)在寫(xiě)入OutputStream 或者從InputStream讀取時(shí)都有可能會(huì)阻塞,一旦有阻塞,線(xiàn)程將會(huì)失去CPU的使用權(quán),這在當(dāng)前的大規(guī)模訪(fǎng)問(wèn)量和有性能要求的情況下是不能被接受的。
NIO:同步非阻塞式IO,服務(wù)器實(shí)現(xiàn)模式為一個(gè)請(qǐng)求一個(gè)線(xiàn)程,即客戶(hù)端發(fā)送的連接請(qǐng)求都會(huì)注冊(cè)到多路復(fù)用器上,多路復(fù)用器輪詢(xún)到連接有I/O請(qǐng)求時(shí)才啟動(dòng)一個(gè)線(xiàn)程進(jìn)行處理。?
AIO(NIO.2):異步非阻塞式IO,服務(wù)器實(shí)現(xiàn)模式為一個(gè)有效請(qǐng)求一個(gè)線(xiàn)程,客戶(hù)端的I/O請(qǐng)求都是由OS先完成了再通知服務(wù)器應(yīng)用去啟動(dòng)線(xiàn)程進(jìn)行處理。?
【推薦】https://www.cnblogs.com/zedosu/p/6666984.html
?
- Channel和Seletor
Seletor就可以理解為選擇器
?
- 緩沖區(qū)
緩沖區(qū)(Buffer):一個(gè)用于特定基本數(shù)據(jù)類(lèi)型的容器。由 java.nio 包定義的,所有緩沖區(qū)都是 Buffer 抽象類(lèi)的子類(lèi)。Java NIO 中的 Buffer 主要用于與 NIO 通道進(jìn)行交互,數(shù)據(jù)是從通道讀入緩沖區(qū),從緩沖區(qū)寫(xiě)入通道中的。
緩沖區(qū)對(duì)象本質(zhì)上是一個(gè)數(shù)組,但它其實(shí)是一個(gè)特殊的數(shù)組,緩沖區(qū)對(duì)象內(nèi)置了一些機(jī)制,能夠跟蹤和記錄緩沖區(qū)的狀態(tài)變化情況,如果我們使用get()方法從緩沖區(qū)獲取數(shù)據(jù)或者使用put()方法把數(shù)據(jù)寫(xiě)入緩沖區(qū),都會(huì)引起緩沖區(qū)狀態(tài)的變化。它可以保存多個(gè)相同類(lèi)型的數(shù)據(jù)。
?
【補(bǔ)充】
?
?
?
?
?
?
總結(jié)
- 上一篇: Spring的Java配置
- 下一篇: springboot环境搭建及入门必知