docs: 优化Java NIO文档图解,使用Excalidraw可视化
- 将ASCII文字图替换为专业的Excalidraw图表 - 新增4个可视化图表:三大核心组件架构、Selector多路复用模型、Buffer核心属性、零拷贝原理对比 - 图表使用配色方案区分不同组件(蓝色-Channel, 绿色-Buffer, 橙色-Selector) - 在Obsidian中可通过![[...]]语法直接嵌入查看
This commit is contained in:
@@ -85,27 +85,7 @@ while (true) {
|
||||
|
||||
### 2. NIO 三大核心组件
|
||||
|
||||
```
|
||||
┌────────────────────────────────────────┐
|
||||
│ Java NIO 架构 │
|
||||
├────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────┐ ┌─────────┐ │
|
||||
│ │Channel │◄──►│ Buffer │ │
|
||||
│ └────┬────┘ └─────────┘ │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ ┌─────────┐ │
|
||||
│ │Selector │ │
|
||||
│ │(多路复用)│ │
|
||||
│ └─────────┘ │
|
||||
│ │
|
||||
└────────────────────────────────────────┘
|
||||
|
||||
Channel: 数据通道(双向)
|
||||
Buffer: 数据容器
|
||||
Selector: 多路复用器
|
||||
```
|
||||
![[Java NIO三大核心组件架构]]
|
||||
|
||||
#### **核心组件关系**
|
||||
|
||||
@@ -137,29 +117,7 @@ buffer.clear();
|
||||
|
||||
#### **工作原理**
|
||||
|
||||
```
|
||||
Selector 多路复用模型:
|
||||
|
||||
┌──────────────────────────────────┐
|
||||
│ Selector │
|
||||
│ │
|
||||
│ select() - 阻塞等待就绪事件 │
|
||||
│ │
|
||||
│ ┌────┐ ┌────┐ ┌────┐ │
|
||||
│ │Ch1 │ │Ch2 │ │Ch3 │ ... │
|
||||
│ │就绪│ │就绪│ │就绪│ │
|
||||
│ └────┘ └────┘ └────┘ │
|
||||
└──────────────────────────────────┘
|
||||
▲
|
||||
│ one thread
|
||||
│
|
||||
┌─────────┴──────────┐
|
||||
│ Event Loop │
|
||||
│ - select() │
|
||||
│ - process() │
|
||||
│ - repeat │
|
||||
└────────────────────┘
|
||||
```
|
||||
![[Selector多路复用模型]]
|
||||
|
||||
#### **SelectionKey 事件类型**
|
||||
|
||||
@@ -307,25 +265,7 @@ sourceChannel.transferTo(0, sourceChannel.size(), destChannel);
|
||||
|
||||
#### **Buffer 结构**
|
||||
|
||||
```
|
||||
Buffer 核心属性:
|
||||
|
||||
┌───────┬──────────┬──────────┬─────────┐
|
||||
│ 0 │position │ limit │capacity │
|
||||
│ │ │ │ │
|
||||
│ 已处理 可读/写数据 │ 不可访问 │
|
||||
│ 数据 │ │ │
|
||||
└───────┴──────────┴──────────┴─────────┘
|
||||
↑ ↑ ↑
|
||||
mark position limit
|
||||
|
||||
操作方法:
|
||||
- mark(): 标记当前 position
|
||||
- reset(): 恢复到 mark 位置
|
||||
- clear(): position=0, limit=capacity
|
||||
- flip(): limit=position, position=0 (读→写)
|
||||
- rewind(): position=0, limit 不变
|
||||
```
|
||||
![[Buffer核心属性]]
|
||||
|
||||
#### **Buffer 使用流程**
|
||||
|
||||
@@ -439,17 +379,7 @@ if (bytesWritten == 0) {
|
||||
|
||||
#### **传统 I/O vs 零拷贝**
|
||||
|
||||
```
|
||||
传统 I/O(4 次拷贝,4 次上下文切换):
|
||||
1. 磁盘 → 内核缓冲区 (DMA)
|
||||
2. 内核缓冲区 → 用户缓冲区 (CPU)
|
||||
3. 用户缓冲区 → Socket 缓冲区 (CPU)
|
||||
4. Socket 缓冲区 → 网卡 (DMA)
|
||||
|
||||
零拷贝(2 次拷贝,2 次上下文切换):
|
||||
1. 磁盘 → 内核缓冲区 (DMA)
|
||||
2. 内核缓冲区 → 网卡 (DMA)
|
||||
```
|
||||
![[零拷贝原理对比]]
|
||||
|
||||
#### **transferTo 实现**
|
||||
|
||||
|
||||
Reference in New Issue
Block a user