成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

沒吃透Netty 緩沖區,還能算得上Java老司機?

開發 后端
操作系統為了提供穩定性,把虛擬地址空間分為用戶空間和內核空間,其中用戶進程只能操作用戶空間的內容,而內核空間的內容可以操作用戶空間的內容以及用戶空間的內容。

 本文轉載自微信公眾號「小明菜市場」,作者小明菜市場。轉載本文請聯系小明菜市場公眾號。

前言

Java NIO 需要理解的主要有緩沖區,通道,選擇器,這三個主要的部分。

基礎

用戶空間和內核空間

操作系統為了提供穩定性,把虛擬地址空間分為用戶空間和內核空間,其中用戶進程只能操作用戶空間的內容,而內核空間的內容可以操作用戶空間的內容以及用戶空間的內容。

I/O過程中的數據流向

假設我們需要從磁盤中的某個文件讀取數據,進程發起read系統調用,進入內核狀態,內核會隨即向磁盤控制硬件發出命令,要求其從磁盤讀取數據,磁盤控制器把數據直接寫入到內核緩沖區中,隨后內核會吧數據從內核空間的臨時緩沖區拷貝到用戶緩沖區,進程再次切換回用戶態繼續執行。總結數據流向是:磁盤 -> 內核緩沖區 -> 用戶緩沖區

內存空間多重映射

對于虛擬地址的空間,一個以上的虛擬地址可以指向同一個物理內存地址。如果用戶空間的虛擬地址和內核空間的虛擬地址映射到同一個物理地址,那么這塊物理地址代表的空間就對內核和用戶進程都可見。便可省去數據在內核緩沖區和用戶緩沖區來回復制的開銷。

緩沖區

Java NIO 數據傳輸過程,數據先放到發送緩沖區 -> 通過通道發送到接收端 -> 接受端通道接受數據并填充到接受緩沖區 所以緩沖區的作用其實是連接通道作為數據傳輸的目標或者來源。

核心概念

屬性

需要理解Buffer工作機制,需要了解如下幾個屬性

  1. 容量: 緩沖區的容量,創建緩沖區時指定
  2. 位置: 下一個要被讀取或者寫入元素的索引
  3. 上界: 緩沖區中第一個不能被讀或者寫的位置。
  4. mark標記,一個備忘的位置

存取

緩沖區的核心就在于存取操作,buffer提供了相對位置存取和絕對位置存取兩種方式。

  1. 相對位置存取:在當前的位置寫入或者讀取數據,然后增加位置的值。
  2. 絕對位置存取。在指定的位置的寫入或者讀取數據,不改變位置的值

代碼如下

  1. //相對位置存取 
  2.  public abstract ByteBuffer put(byte b); 
  3.  public abstract byte get(); 
  4.  
  5.  //絕對位置存取 
  6.  public abstract ByteBuffer put(int index, byte b); 
  7.  public abstract byte get(int index); 

翻轉

翻轉是 buffer的核心概念,可以理解buffer有兩種模式,寫模式和讀模式。寫模式:我們分配一個緩沖區,然后直接填充數據,讀模式下。我們從頭開始讀取數據。如何從寫模式切換到讀模式,翻轉,翻轉的時候我們用limit記錄待讀取數據的長度,然后把位置置換為0就可以開始讀取數據了。

  1. public final Buffer flip() { 
  2.    //記錄待讀取數據的長度 
  3.     limit = position; 
  4.    //從頭開始讀取數據 
  5.     position = 0; 
  6.     mark = -1; 
  7.     return this; 

demo

  1. //創建一個緩沖區  
  2. ByteBuffer buffer = ByteBuffer.allocate(100); 
  3. //寫數據 
  4. for (char c : "hello".toCharArray()) { 
  5.   buffer.put((byte) c); 
  6. //翻轉 
  7. buffer.flip();//等價于 buffer.limit(buffer.position()).position(0); 
  8. //讀數據 
  9. while (buffer.hasRemaining()) { 
  10.   char c = (char) buffer.get(); 
  11.   System.out.println(c); 

直接緩沖區

對于一般的I/O過程,數據流向是,磁盤或者網絡 -> 內核臨時緩沖區 -> 用戶空間緩沖區

直接緩沖區解決的是內核空間臨時緩沖區到用戶空間緩沖區復制這一步耗費的多余。雖然直接緩沖區是I/O的最佳選擇,但是其比創建非直接緩沖區將會耗費更大的成本了,所以一般都是直接重復使用。

創建緩沖區

Buffer不能直接通過構造函數實例化,都是通過靜態工廠方法創建,下為ByteBuffer的靜態工廠方法。

  1. //創建內存緩沖區 
  2. public static ByteBuffer allocate(int capacity); 
  3. //創建直接緩沖區 
  4. public static ByteBuffer allocateDirect(int capacity) ; 
  5.  
  6. public static ByteBuffer wrap(byte[] array, int offset, int length) 

 

責任編輯:武曉燕 來源: 小明菜市場
相關推薦

2011-12-14 16:30:42

javanio

2019-02-27 13:58:29

漏洞緩沖區溢出系統安全

2017-01-09 17:03:34

2019-08-20 09:30:18

Spring Clou組件Eureka

2017-07-04 17:09:10

Map環形緩沖區數據

2014-07-30 11:21:46

2018-01-26 14:52:43

2009-11-16 17:26:17

Oracle優化緩沖區

2009-11-16 17:08:59

Oracle日志緩沖區

2018-08-15 10:29:58

NettyJDK內存

2021-02-09 10:07:23

面試MySQL存儲

2009-09-24 18:16:40

2009-07-15 15:50:48

Jython線程

2023-10-09 23:01:09

MySQL數據庫

2009-11-16 16:59:24

Oracle優化庫高速

2011-07-20 10:54:14

C++

2010-12-27 10:21:21

2023-07-11 08:32:06

緩沖區Java

2015-03-06 17:09:10

2010-10-09 14:45:48

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产福利在线视频 | 国产成人精品一区二区 | 午夜精品一区 | 亚洲视频免费 | 伊人久久大香线 | 日韩av在线不卡 | 围产精品久久久久久久 | av日韩精品 | 国产一区二区在线播放 | 亚洲免费网 | 黄色网址在线播放 | 亚洲中午字幕 | 国产日韩一区二区三区 | 国产亚洲久 | 久久久久久99 | 日韩在线观看中文字幕 | 欧美日韩综合一区 | 在线免费国产视频 | 国产精品久久一区二区三区 | 久久久久www | 免费在线看黄视频 | 国产亚洲网站 | 日韩成人中文字幕 | 午夜影院在线观看 | 99热热精品 | 日韩日韩日韩日韩日韩日韩日韩 | 毛片99 | 精品亚洲一区二区三区 | 亚洲一区二区久久 | 久久久精彩视频 | 成人在线观看黄 | 久久久久久久久久久91 | 日韩亚洲视频 | 天天草天天爱 | 一区二区三区四区在线视频 | 大象一区 | 国产91精品久久久久久久网曝门 | 羞羞视频免费在线观看 | 亚洲精品福利在线 | av天天干| 成人精品久久日伦片大全免费 |