zoukankan      html  css  js  c++  java
  • DMA/Zero copy

    DMA:

    直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式。在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占有率,可以大大节省系统资源 

    Zero copy:

    From:

    https://www.ibm.com/developerworks/library/j-zerocopy/

    https://my.oschina.net/plucury/blog/192577

    http://blog.csdn.net/jiangbo_hit/article/details/6146502

    web应用向用户提供静态内容,意味着有很多data从磁盘读出之后,原封不动的通过socket传输给用户。此过程中,内核把数据从disk读出来,然后把它传输给user级的应用,然后应用再次把同样的内容再传回给处于内核级的socket,此时应用是一种低效的中间介质,用来把磁盘数据传给socket。

    如果zero copy,内核直接把磁盘数据传给socket,而不通过应用程序传输,从而减少copy,减少cpu消耗,减少内核态和用户态的上下文切换开销

    调用read将文件从磁盘读到buffer,然后调用write将buffer写入到socket

    read(file, tmp_buf, len);
    write(socket, tmp_buf, len);

    read: 系统通过DMA(Direct Memory Access)将数据copy到内核模式,CPU控制将内核模式数据copy到用户模式下的 buffer中

    write: 将用户模式下的buffer数据copy到内核模式下的socker buffer中,通过DMA(Direct Memory Access)将数据copy到网卡中传送

     

    数据需要在用户态和内核态复制,浪费两次cpu复制,占用了cpu资源

    sendfile函数,用于将文件通过socket传送。
    sendfile(socket, file, len);
    该函数通过一次系统调用完成了文件的传送,减少了原来 read/write方式的模式切换。此外更是减少了数据的copy

    通过sendfile传送文件只需要一次系统调用,当调用 sendfile时:
    1。首先通过DMA copy将数据从磁盘读取到kernel buffer中
    2。然后通过CPU copy将数据从kernel buffer copy到sokcet buffer中
    3。最终通过DMA copy将socket buffer中数据copy到网卡buffer中发送
    sendfile与read/write方式相比,少了 一次模式切换一次CPU copy。但是从上述过程中也可以发现从kernel buffer中将数据copy到socket buffer是没必要的。

    再升级:

    改进后的处理过程如下:
    1。DMA copy将磁盘数据copy到kernel buffer中
    2。向socket buffer中追加当前要发送的数据在kernel buffer中的位置和偏移量
    3。DMA gather copy根据socket buffer中的位置和偏移量直接将kernel buffer中的数据copy到网卡上。

     

    CPU不需要为数据在内存之间的copy消耗资源,在计算机发送网络文件时,不需要将文件内容copy到用户空间,而是直接在内核空间中传输到网络

    Java NIO中的FileChannel.transferTo()方法都实现了零拷贝的功能

    Netty允许我们将多段数据合并为一整段虚拟数据供用户使用,而过程中不需要对数据进行拷贝操作

  • 相关阅读:
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    log4net写txt日志
    easyui上传文件
    让 SVN (TortoiseSVN)提交时忽略bin和obj目录
    C#进阶系列——WebApi 跨域问题解决方案:CORS
    js控制radio选中
    sql注入
    修改类不用重启Tomcat加载整个项目
    URIEncoding与useBodyEncodingForURI 在tomcat中文乱码处理上的区别
    ActiveMQ 使用场景
  • 原文地址:https://www.cnblogs.com/it-worker365/p/7403310.html
Copyright © 2011-2022 走看看