蚂蚁二面,面试官问我零拷贝的实现原理,当场懵了…
"狼哥,面试又跪了,碰到了知识盲区" "哪个?" "一面还可以,二面面试官问我零拷贝的原理,懵逼了...这块内容没去研究过" "哦,这个知识点,我之前应该有讲过,你没注意到?" "这东西工作中用不到,可能被我忽略了" "啧啧啧..." "哎,有空和我大概讲讲?" "先从简单开始,实现下这个场景:从一个文件中读出数据并将数据传到另一台服务器上?" "为啥写这个?" "你先写" "行..." 1分钟后 "我写了伪代码" File.read(file, buf, len); Socket.send(socket, buf, len); "这里涉及到了几次数据拷贝?" "2次?磁盘拷贝到内存,内存拷贝到Socket?" "emmm,怪不得挂了,一点不冤。" "这种方式一共涉及了4次数据拷贝,知道用户态和内核态的区别吗?" "了解" "行,文字有点干瘪,你先看这个图" image.png 1、应用程序中调用 read() 方法,这里会涉及到一次上下文切换(用户态->内核态),底层采用DMA(direct memory access)读取磁盘的文件,并把内容存储到内核地址空间的读取缓存区。 2、由于应用程序无法读取内核地址空间的数据,如果应用程序要操作这些数据,必须把这些内容从读取缓冲区拷贝到用户缓冲区。这个时候, read() 调用返回,且引发一次上下文切换(内核态->用户态)