👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主
⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 中级
🙉八股文专题:剑指大厂,手撕 Java 八股文
文章目录
1. 什么是零拷贝,它和传统的IO执行流程有什么差别?
零拷贝(Zero-Copy) 是一种计算机操作,旨在减少数据在内存中的复制次数,从而提高数据传输的效率。在传统的IO执行流程中,数据从磁盘读取到用户空间,再到内核空间,然后再从内核空间传输到网络接口,这个过程中会有多次数据拷贝。零拷贝技术通过减少这些不必要的数据拷贝,提高了数据传输的性能。
传统IO执行流程:
- 读取数据:应用程序调用
read
系统调用,将数据从磁盘读取到内核缓冲区。 - 数据拷贝:内核将数据从内核缓冲区复制到用户缓冲区。
- 写入数据:应用程序调用
write
系统调用,将数据从用户缓冲区复制到内核缓冲区。 - 发送数据:内核将数据从内核缓冲区传输到网络接口。
零拷贝执行流程:
- 读取数据:应用程序调用零拷贝相关的系统调用(如
mmap
、sendfile
),将数据从磁盘读取到内核缓冲区。 - 数据传输:内核直接将数据从内核缓冲区传输到网络接口,省去了用户缓冲区的中间拷贝。
2. mmap内存映射,它是如何实现零拷贝的?
mmap(Memory-Mapped I/O) 是一种将文件或设备映射到进程地址空间的方法。通过 mmap
,文件的内容可以直接在内存中访问,而不需要显式的读写操作。
实现零拷贝的过程:
- 映射文件:应用程序调用
mmap
系统调用,将文件映射到进程的地址空间。 - 数据访问:应用程序直接在内存中访问映射的文件内容,省去了内核和用户空间之间的数据拷贝。
- 数据传输:应用程序调用
write
系统调用,将内存中的数据直接传输到网络接口。
优点:
- 减少数据拷贝