Nio

Time: 2024-11-02 Saturday 15:34:01
Author: Jackasher

Nio

Bio的问题

客户端没有换行, 服务端就默认认为客户端挂掉,于是跟着挂掉了,这种bio就是服务端需要什么就必须发, 不然就会挂掉,

image-20241101043724403

为什么java的io操作慢

image-20241101053931996

Nio模型

![image-20241101235932810](/Users/leojackasher/Library/Mobile Documents/com~apple~CloudDocs/Markdown/Nio.assets/image-20241101235932810.png)

![image-20241102000217272](/Users/leojackasher/Library/Mobile Documents/com~apple~CloudDocs/Markdown/Nio.assets/image-20241102000217272.png)

image-20241102000320132

缓冲区

image-20241102003140005

Channel

image-20241102003419373

Scatter AND Gather

image-20241102004035786

FileChannel

内存映射减少磁盘 I/O 操作的原因,主要在于它让文件内容与内存之间的交换由操作系统直接管理,并且利用虚拟内存机制实现按需加载,避免传统文件操作中的繁重数据传输。这里是详细解释:

1. 内存映射的直接访问优势

通过内存映射,文件的一部分直接映射到进程的虚拟地址空间,形成一块内存区域。这样一来,应用程序可以像操作内存一样直接访问文件内容,而不需要反复调用磁盘 I/O 函数。这就避免了:

​ •多次系统调用:传统文件操作中,每次读取或写入都需要调用文件 I/O 系统函数,而内存映射直接使用内存地址操作数据。

​ •多层缓冲区传输:在传统方式中,磁盘数据需要经过内核缓冲区,复制到用户空间缓冲区。而内存映射减少了复制过程,因为它将文件内容直接映射到内存中,数据在内核缓冲区和应用程序的虚拟内存之间共享,不需要多次搬运数据。

2. 操作系统的虚拟内存管理

内存映射利用了操作系统的虚拟内存管理机制,可以按需将数据从磁盘加载到物理内存。当应用访问映射区域的某个位置时,操作系统才会把相应文件块加载到物理内存中(称为“按需加载”或“页缺失处理”)。

这带来以下优势:

​ •避免一次性加载整个文件:即使文件很大,也可以先分配一块虚拟内存空间,当应用访问特定区域时,操作系统才加载对应的块,减少了内存消耗。

​ •自动缓存和替换:操作系统会自动将不常访问的页面换出内存,腾出空间给其他数据,减少了内存压力。无需手动管理文件缓存。

3. 磁盘 I/O 和内存速度差异

磁盘 I/O 是计算机系统中的性能瓶颈,因为磁盘的读写速度远低于内存。内存映射减少了磁盘读写的频率和数据传输的步骤,尽可能将文件操作放在内存中完成。以下是典型的性能对比:

​ •内存访问速度:几纳秒级别,通常为数百 MB 到数 GB/s。

​ •磁盘访问速度:传统 HDD 为几毫秒级别(约 100 MB/s),而 SSD 虽然快一些,但仍然比内存慢。


Nio
http://example.com/2024/11/02/Nio/
作者
Jack Asher
发布于
2024年11月2日
许可协议