零拷贝技术初探

    xiaoxiao2021-12-14  20

    传统的数据传输方式:

     

     

    举例:如服务器端从接受到客户端请求以后,需要将本地的文件发送给客户端。其中不可避免的需要经过read()和write()两个过程才能完成数据的传输工作。其中的步骤具体解析如下:

    1.read()函数调用会导致系统调用,从而引发用户模式(user model)到内核模式(kernel mode)的上下文切换(第一次切换),在内核模式下调用sys_read(或其他)从磁盘中读取内容,拷贝存储到内核地址空间缓冲区中(DMA方式)(第一次拷贝)。

    2.然后数据从内核缓冲区拷贝到用户应用层缓冲区(第二次拷贝),read()系统调用返回,发生上下文切换(从内核模式切换到用户模式)(第二次切换)。这时磁盘中的数据已经被存储到用户应用层的缓冲区中了。

    3.Send()函数调用引发用户模式到内核模式的又一次切换(第三次切换),数据从用户缓冲区拷贝到内核地址空间缓冲区(第三次拷贝)。缓冲区与套接字相关联。

    4.Send()系统调用返回,从内核模式切换到用户模式(第四次切换)。DMA拷贝将数据从内核缓冲区传输到协议引擎(第四次拷贝)。

     

    零拷贝技术

     

    零拷贝技术的目标:

    l  避免数据拷贝

    避免操作系统内核缓冲区之间进行数据拷贝操作。

    避免操作系统内核和用户应用程序地址空间这两者之间进行数据拷贝操作。

    用户应用程序可以避开操作系统直接访问硬件存储。

    数据传输尽量让 DMA 来做。

    l  将多种操作结合在一起

    避免不必要的系统调用和上下文切换。

    需要拷贝的数据可以先被缓存起来。

    对数据进行处理尽量让硬件来做。

     

    零拷贝技术分类:

    1.直接 I/O:对于这种数据传输方式来说,应用程序可以直接访问硬件存储,操作系统内核只是辅助数据传输:这类零拷贝技术针对的是操作系统内核并不需要对数据进行直接处理的情况,数据可以在应用程序地址空间的缓冲区和磁盘之间直接进行传输,完全不需要 Linux 操作系统内核提供的页缓存的支持。

    2.在数据传输的过程中,避免数据在操作系统内核地址空间的缓冲区和用户应用程序地址空间的缓冲区之间进行拷贝。有的时候,应用程序在数据进行传输的过程中不需要对数据进行访问,那么,将数据从 Linux 的页缓存拷贝到用户进程的缓冲区中就可以完全避免,传输的数据在页缓存中就可以得到处理。在某些特殊的情况下,这种零拷贝技术可以获得较好的性能。Linux 中提供类似的系统调用主要有 mmap(),sendfile() 以及 splice()。

    3.对数据在 Linux 的页缓存和用户进程的缓冲区之间的传输过程进行优化。该零拷贝技术侧重于灵活地处理数据在用户进程的缓冲区和操作系统的页缓存之间的拷贝操作。这种方法延续了传统的通信方式,但是更加灵活。在  Linux  中,该方法主要利用了写时复制技术。

    转载请注明原文地址: https://ju.6miu.com/read-971588.html

    最新回复(0)