[NIO]——(三)通道(Channel)的原理與獲取


一、什么是通道(Channel):
1、通道(Channel)一般用於表示源節點與目標節點的連接。在 JAVA NIO中負責緩沖區中數據的傳輸。
2、通道(Channel)本身不存儲數據,因此需要配合緩沖區進行傳輸。
0
 
3、最初的操作系統中我們應用程序調用計算機底層的IO接口時,所有的請求都要交給CPU來處理,所有的IO操作都是交給CPU來獨立負責的。
這樣進行大量讀寫操作時,對於CPU的占用率會變得特別高。
 
0
 
4、后面的操作系統經過改進,在內存與IO接口中間弄了一個DMA(直接存儲器),這時我們應用程序向操作系統發起讀寫的IO請求時,
DMA(直接存儲器)會向CPU申請權限,申請下來權限后,這些IO操作都交給DMA(直接存儲器)全權負責。這樣的好處是,
CPU在進行讀寫請求的過程中,CPU不再需要進行干預了。 傳統的數據傳輸方式就是這種DMA(直接存儲器),也就是我們所說的IO流就是這種形式。
但是仍然還是有一個問題,如果我們應用程序發起大量的讀寫請求時,這時候DMA(直接存儲器)也會去向CPU申請權限,然后去建立很多個DMA總線,
這時如果DMA總線過多,就會造成一個總線沖突的問題。如果總線沖突也會十分的影響性能。
 
0
 
5、后來DMA(直接存儲器)也有了更新,更新成了Channel(通道)的形式,當然DMA還是存在的。通道是一個完全獨立的處理器,
專門用於IO操作,雖然他是處理器,但是仍然是附屬於CPU,相較於原來的DMA(直接存儲器)他是完全獨立的處理器,
擁有一套自己的命令 。這時如果從應用程序來了大量的IO請求,它也不再需要去向CPU申請了,也就是讓IO操作與CPU徹底的斷絕關系了。
 
二、通道(Channel)的主要實現類有哪些:
java.nio.channels.Channel 接口:
  |-- FileChannel
  |-- SocketChannel
  |-- ServerSocketChannel
  |-- DatagramChannel
 
三、如何獲取通道(Channel):
1、Java 針對支持通道的類提供了 getChannel() 方法:
  本地IO:
    (1) FileInputStream
    (2) FileOutputStream
    (3) RandomAccessFile
   網絡IO:
    (1) Socket
    (2) ServerSocket
    (3) DatagramSocket
2、在JDK 1.7以上版本中的 NIO.2 針對各個通道提供了靜態方法open() 。
3、在JDK 1.7以上版本中的 NIO.2 的Files 工具類的 newByteChannel() 。
 
隨筆筆記整理於尚硅谷視頻。視頻地址:https://www.bilibili.com/video/BV14W411u7ro


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM