NIO之零拷贝

本文介绍了Linux中的内核态与用户态的概念,并详细解析了传统IO的四次拷贝过程,接着深入探讨了NIO中的零拷贝,包括sendFile方法实现的零拷贝和收集拷贝功能的零拷贝。此外,还讨论了直接内存如何在NIO中应用以提升文件读写速度,以及其工作原理和内存回收机制。
摘要由CSDN通过智能技术生成

title: Nio之零拷贝
date: 2019-06-04 08:36:01
categories:

  • Java基础
    tags:
  • nio

Linux中的内核态与用户态

如上图所示,Unix/Linux的体系架构分为内核空间(kernal space)与用户空间(application space),内核控制着计算机的硬件资源,为上层应用程序提供运行环境。用户空间就是应用程序的活动空间,而内核为应用程序的执行提供着必要的cpu、存储、IO资源等。为了使应用程序访问使用到这些资源,内核就提供了资源访问的接口:系统调用。

传统IO的拷贝
  • 数据先从硬件资源被拷贝内核空间的缓冲区中(kernel buffer)。
  • 然后再从内核空间的缓冲区中拷贝到用户空间的缓冲区(application buffer)中。
  • 接着从用户空间再拷贝到内核空间中的Socket buffer/Write buffer中。
  • 最后再从Socket buffer中拷贝到网卡缓冲区/硬件资源中。

这个过程经过了4次的数据拷贝,其中有2次(1和4)是DMA拷贝(直接内存拷贝,不需要cpu的参与),2和3是cpu拷贝。

应用程序发起了readwrite系统调用,会经过4次的上下文切换。

Nio中的零拷贝
sendFile零拷贝

JavaNio中有个transferTo()方法,可以将一个channel里面的字节直接复制到另一个可以写入字节的channel中,此方法比从通道读取并写入目标通道的简单循环更有效。操作系统可以直接从文件系统缓存向目标通道传输字节,而无需实际复制它们。transferTo()最后内部封装的是sendFile这个系统调用。

基本代码如下:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值