### 5.1 零拷貝
零拷貝指的是數據不會重復拷貝到JVM內存當中,用戶態和內核態之間沒有拷貝操作,數據直接由內核緩沖區拷貝到另外的IO緩沖區(例如網卡的Socket緩沖區)。
以一般的Socket讀寫操作為例:將一個本地文件通過IO讀出并寫到網卡中。
~~~java
File f = new File("helloword/data.txt");
RandomAccessFile file = new RandomAccessFile(file, "r");
byte[] buf = new byte[(int)f.length()];
file.read(buf);
Socket socket = ...;
socket.getOutputStream().write(buf);
~~~
:-: 
* Java本身并不具備IO讀寫的能力(所有的應用程序都是),對于IO讀寫的操作,要去調用操作系統提供的相關系統調用函數,通過系統調用會將進程從用戶態切換到內核態(int 0x80)。
* 接著操作系統會通過DMA的方式進行IO的讀寫操作`拷貝(1)`,這個時候不用CPU參與,但是相對應的用戶線程要被阻塞。
* 操作系統將數據從IO設備中讀取出來之后存放到內核緩沖區中,接在再`拷貝(2)`到用戶緩沖區中,這個過程從內核態轉換到用戶態。
* 用戶緩沖區在處理數據之后調用writer方法將輸入寫入內核緩沖區(Socket緩沖區)(`拷貝(3)`),這個過程也要發生一次用戶態到內核態的轉換。
* 接著操作系統再使用DMA的方式將Socket緩沖區的內容寫入到網卡中。(`拷貝4`)
可以發現:這個過程發生了3次用戶態和內核態的切換,4次數據拷貝。
而在使用了直接內存之后就可以對數據的拷貝過程進行優化:
- 第一章 Java基礎
- ThreadLocal
- Java異常體系
- Java集合框架
- List接口及其實現類
- Queue接口及其實現類
- Set接口及其實現類
- Map接口及其實現類
- JDK1.8新特性
- Lambda表達式
- 常用函數式接口
- stream流
- 面試
- 第二章 Java虛擬機
- 第一節、運行時數據區
- 第二節、垃圾回收
- 第三節、類加載機制
- 第四節、類文件與字節碼指令
- 第五節、語法糖
- 第六節、運行期優化
- 面試常見問題
- 第三章 并發編程
- 第一節、Java中的線程
- 第二節、Java中的鎖
- 第三節、線程池
- 第四節、并發工具類
- AQS
- 第四章 網絡編程
- WebSocket協議
- Netty
- Netty入門
- Netty-自定義協議
- 面試題
- IO
- 網絡IO模型
- 第五章 操作系統
- IO
- 文件系統的相關概念
- Java幾種文件讀寫方式性能對比
- Socket
- 內存管理
- 進程、線程、協程
- IO模型的演化過程
- 第六章 計算機網絡
- 第七章 消息隊列
- RabbitMQ
- 第八章 開發框架
- Spring
- Spring事務
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 數據庫
- Mysql
- Mysql中的索引
- Mysql中的鎖
- 面試常見問題
- Mysql中的日志
- InnoDB存儲引擎
- 事務
- Redis
- redis的數據類型
- redis數據結構
- Redis主從復制
- 哨兵模式
- 面試題
- Spring Boot整合Lettuce+Redisson實現布隆過濾器
- 集群
- Redis網絡IO模型
- 第十章 設計模式
- 設計模式-七大原則
- 設計模式-單例模式
- 設計模式-備忘錄模式
- 設計模式-原型模式
- 設計模式-責任鏈模式
- 設計模式-過濾模式
- 設計模式-觀察者模式
- 設計模式-工廠方法模式
- 設計模式-抽象工廠模式
- 設計模式-代理模式
- 第十一章 后端開發常用工具、庫
- Docker
- Docker安裝Mysql
- 第十二章 中間件
- ZooKeeper