2 个回答
我们以读操作为例,假设用户程序发起一次读请求。其实会调用read相关的「系统函数」,然后会从用户态切换到内核态,随后CPU会告诉DMA去磁盘把数据拷贝到内核空间。等到「内核缓冲区」真正有数据之后,CPU会把「内核缓存区」数据拷贝到「用户缓冲区」,最终用户程序才能获取到。
因为应用程序不能直接去读取硬盘的数据,从上面描述可知需要依赖「内核缓冲区」,一次读操作会让DMA将磁盘数据拷贝到内核缓冲区,CPU将内核缓冲区数据拷贝到用户缓冲区。所谓的零拷贝就是将「CPU将内核缓冲区数据拷贝到用户缓冲区」这次CPU拷贝给省去,来提高效率和性能.
稍微解释一下:为了保证内核的安全,操心系统将虚拟空间划分为「用户空间」和「内核空间」,所以在读系统数据的时候会有状态切换
因为应用程序不能直接去读取硬盘的数据,从上面描述可知需要依赖「内核缓冲区」,一次读操作会让DMA将磁盘数据拷贝到内核缓冲区,CPU将内核缓冲区数据拷贝到用户缓冲区。所谓的零拷贝就是将「CPU将内核缓冲区数据拷贝到用户缓冲区」这次CPU拷贝给省去,来提高效率和性能.
发布于:2年前 (2023-03-16) IP属地:四川省
常见的零拷贝技术有mmap(内核缓冲区与用户缓冲区的共享)、sendfile(系统底层函数支持)。零拷贝可以提高数据传输的性能,这块在Kafka等框架也有相关的实践。

发布于:2年前 (2023-03-16) IP属地:四川省

零拷贝如果简单用java里面对象的概率来理解的话,其实就是使用的都是对象的引用,每个引用对象的地方对其改变就都能改变此对象,永远只存在一份对象。
发布于:3年前 (2022-10-20) IP属地:未知
我来回答
您需要 登录 后回答此问题!