什么是零拷贝?

提问者:帅平 问题分类:面试刷题
什么是零拷贝?
2 个回答
踏尽风雪
踏尽风雪
我们以读操作为例,假设用户程序发起一次读请求。其实会调用read相关的「系统函数」,然后会从用户态切换到内核态,随后CPU会告诉DMA去磁盘把数据拷贝到内核空间。等到「内核缓冲区」真正有数据之后,CPU会把「内核缓存区」数据拷贝到「用户缓冲区」,最终用户程序才能获取到。
稍微解释一下:为了保证内核的安全,操心系统将虚拟空间划分为「用户空间」和「内核空间」,所以在读系统数据的时候会有状态切换

因为应用程序不能直接去读取硬盘的数据,从上面描述可知需要依赖「内核缓冲区」,一次读操作会让DMA将磁盘数据拷贝到内核缓冲区,CPU将内核缓冲区数据拷贝到用户缓冲区。所谓的零拷贝就是将「CPU将内核缓冲区数据拷贝到用户缓冲区」这次CPU拷贝给省去,来提高效率和性能.
发布于:2年前 (2023-03-16) IP属地:四川省
ε小仙女з
ε小仙女з
常见的零拷贝技术有mmap(内核缓冲区与用户缓冲区的共享)、sendfile(系统底层函数支持)。零拷贝可以提高数据传输的性能,这块在Kafka等框架也有相关的实践。
发布于:2年前 (2023-03-16) IP属地:四川省
Rae
Rae 管理员
零拷贝如果简单用java里面对象的概率来理解的话,其实就是使用的都是对象的引用,每个引用对象的地方对其改变就都能改变此对象,永远只存在一份对象。
发布于:3年前 (2022-10-20) IP属地:未知
我来回答