NIO 少一次拷贝
来源:2-10 Buffer的原理和使用场景-面试题解读(2)

上游猴子
2021-09-16
原理是让内核缓冲区和用户缓冲区虚拟内存地址指向同一块物理内存地址, 这个是怎么去实现的呢?
看了源码,可以通过 DirectByteBuffer 进行操作, 在堆外创建 buffer , 读写操作时底层调用read/write系统函数,会传递 fd , buffer 位置 , length … 等等。
假设我们执行写入操作,用户会先数据写入到 buffer 中, 该 buffer 可以是堆外创建一块 buffer 空间,执行 write 操作, 传递 buffer 位置信息(虚拟内存地址)和长度, fd 等等,由内核进行拷贝到 socket 输出缓冲区, 再由 DMA 拷贝到网卡.
读取时, 用户会先创建 buffer , 该 buffer 可以是堆外创建一块 buffer 空间, 执行 read 操作时会传入 buffer 的位置信息(内存地址)和长度, 此时有个问题, 怎么去实现用户缓冲区和内核缓冲区能指向同一个物理内存地址? 是传入的 buffer 虚拟内存地址映射的物理内存地址就是共享的物理内存地址?
写回答
2回答
-
幕布斯9873758
2022-03-02
求问脑图用的什么软件
00 -
求老仙
2021-09-22
对,在Java中这个是堆外内存。 另外,关于如何创建内核空间到用户空间的共享内存,这个内核程序就有权限。 可以参考mmap等底层的API。
00
相似问题