java io 零拷备

客户端需要访问服务器上的文件资源,传统的文件传输性能表现会很糟糕。过程如下:

1.服务端将磁盘上的文件读取出来

2.然后通过网络发送给客户端。

传统I/O的工作方式是,数据读取和写入是从用户空间到内核空间来回复制,而内核空间的数据是通过操作系统的I/O接口从磁盘读取或写入。一般涉及到两个系统调用:

read(file, tmp_buf, len);

write(socket, tmp_buf, len);

如图:

消耗性能的环节:

  1. 用户态与内核态上下文切换

无论是read操作还是write操作,每次操作都会发生 用户态到内核态的切换 和 内核态到用户态的切换。

  1. 数据拷备
  • DMA控制器将数据从磁盘拷备到内核缓冲区
  • CPU将数据从内核缓冲区拷备到用户空间的缓冲区
  • CPU将数据从用户空间的缓冲区拷备到内核空间的socket缓冲区
  • DMA控制器将数据从内核空间的socket缓冲区拷备到网卡

传统方式中的数据拷备过程有很大的优化空间。这种方式在高并发场景里表现会非常糟糕。

零拷备技术实现方式通常有两种:

  1. mmap

mmap 系统调用函数会将内核缓冲区里的数据映射到用户空间,这样就省去了CPU拷备的开销。

  1. sendfile

可以替代 read()和write()两个系统调用,直接完成内核缓冲区到socket缓冲区的数据拷备

如果网卡支持 SG_DMA技术,可以直接通过如下图所示的方式来完成数据的拷备:

这样,所有数据的拷备全程没有CPU的参与 ,这就是所谓的零拷备。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值