1.概述
零拷贝是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而直接在内核空间(Kernel Space)中传输到网络的方式。
2.内核态和用户态
就像世界上的人并不平等一样,并不是所有的程序都是平等的。世界上有的人占有资源多,有的人占有资源少,有的人来了,别人出资源,有的人专门为别人让出资源。程序也是这样,有的程序可以访问计算机的任何资源,有的程序则只能访问非常受限的少量资源。而操作系统作为计算机的管理者,自然不能合被管理者享受一样的待遇。它应该享受更多的方便或特权。为了区分不同程序的不同权利,人们发明了内核态和用户态的概念。
那么什么是内核态,什么是用户态呢?只要想一想现实生活中,处于社会核心的人与处于社会边缘的人有什么区别就能明白处于核心的人拥有的资源多!由此,内核态就是拥有资源多的状态,或者说访问资源多的状态。我们也称之为特权态。相对来说,用户态就是非特权态,在此种状态下访问资源将受到限制。如果一个程序运行在特权态,则该程序就可以访问计算机的任何资源,即它的资源访问权限不受限制。如果一个程序运行在用户态,则资源需求将受到各种限制。
例如,如果要访问操作系统的内核数据结构,如进程表,则需要在特权态下才能办到。如果要访问用户程序里的数据,则在用户态下就可以了。
3.拷贝方式
非零拷贝情况如图,表面上很简单的通过网络发送数据的过程,在操作系统底层要copy4次,如果用户要修改文件数据再发送。这么做是必要的。但是,仅仅是发送数据,不修改,则没有必要copy4次---出现零拷贝(不经过用户态,经过用户态有2次copy(因为需要发送确认就有4次交互))。
下图为零拷贝,使用零拷贝,数据拷贝次数减少了,并且避免了内核态和用户态的交互,从而提高性能
零拷贝的英文描述
综上,使用Zero Copy 可以减少数据拷贝的次数,减少内核态和用户态的交互次数,从而提高通过网络发送数据的性能,降低延迟
应用场景:
kafka的底层就是用的零拷贝,节约资源提升了效率