加入收藏 | 设为首页 | 会员中心 | 我要投稿 江门站长网 (https://www.0750zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

100 Award获奖者的IT领导经验

发布时间:2021-02-06 17:14:04 所属栏目:动态 来源:互联网
导读:1)发出read系统调用,会导致用户空间到内核空间的上下文切换,然后再通过DMA将文件中的数据从磁盘上读取到内核空间缓冲区 2)接着将内核空间缓冲区的数据拷贝到用户空间进程内存,然后read系统调用返回。而系统调用的返回又会导致一次内核空间到用户空间的上
  • 1)发出read系统调用,会导致用户空间到内核空间的上下文切换,然后再通过DMA将文件中的数据从磁盘上读取到内核空间缓冲区
  • 2)接着将内核空间缓冲区的数据拷贝到用户空间进程内存,然后read系统调用返回。而系统调用的返回又会导致一次内核空间到用户空间的上下文切换
  • 3)write系统调用,则再次导致用户空间到内核空间的上下文切换,将用户空间的进程里的内存数据复制到内核空间的socket缓冲区(也是内核缓冲区,不过是给socket使用的),然后write系统调用返回,再次触发上下文切换
  • 4)至于socket缓冲区到网卡的数据传输则是独立异步的过程,也就是说write系统调用的返回并不保证数据被传输到网卡

「一共有四次用户空间与内核空间的上下文切换。四次数据copy,分别是两次CPU数据复制,两次DMA数据复制」

mmap+write实现的零拷贝
 

  • 缓冲区 是所有I/O的基础,I/O 无非就是把数据移进或移出缓冲区
    • 进程发起read请求,内核先检查内核空间缓冲区是否存在进程所需数据,如果已经存在,则直接copy数据到进程的内存区。如果没有,系统则向磁盘请求数据,通过DMA写入内核的read缓冲冲区,接着再将内核缓冲区数据copy到进程的内存区
    • 进程发起write请求,则是把进程的内存区数据copy到内核的write缓冲区,然后再通过DMA把内核缓冲区数据刷回磁盘或者网卡中
  • 虚拟内存:现代操作系统都使用虚拟内存,有如下两个好处
    • 一个以上的虚拟地址可以指向同一个物理内存地址
    • 虚拟内存空间可大于实际可用的物理地址

利用第一点特性可以把内核空间地址和用户空间的虚拟地址映射到同一个物理地址,这样DMA就可以填充(读写)对内核和用户空间进程同时可见的缓冲区了;大致如下
 

  • 内核空间:Linux自身使用的空间;主要提供进程调度、内存分配、连接硬件资源等功能
  • 用户空间:提供给各个程序进程的空间;用户空间不具有访问内核空间资源的权限,如果应用程序需要使用到内核空间的资源,则需要通过系统调用来完成:从用户空间切换到内核空间,完成相关操作后再从内核空间切换回用户空间

缓冲区和虚拟内存

  • 直接内存访问(Direct Memory Access)(DMA)
    • 直接内存访问:DMA允许外设设备和内存存储器之间直接进行IO数据传输,其过程不需要CPU的参与
  • 前言

    大白话解释,零拷贝就是没有把数据从一个存储区域拷贝到另一个存储区域。但是没有数据的复制,怎么可能实现数据的传输呢?其实我们在java NIO、netty、kafka遇到的零拷贝,并不是不复制数据,而是减少不必要的数据拷贝次数,从而提升代码性能

    • 零拷贝的好处
    • 内核空间和用户空间
    • 缓冲区和虚拟内存
    • 传统的 I/O
    • mmap+write 实现的零拷贝
    • sendfile 实现的零拷贝
    • 带有DMA收集拷贝功能的sendfile实现的零拷贝
    • java提供的零拷贝方式

    零拷贝的好处

    • 零拷贝机制能减少用户空间和操作系统内核空间的上下文切换
    • 减少内存的占用
    • 内核空间和用户空间

(编辑:江门站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!