通过 sendfile 系统调用,数据可以直接在内核空间内部进行 I/O 传输,从而省去了数据在用户空间和内核空间之间的来回拷贝,sendfile 调用中 I/O 数据对用户空间是完全不可见的,整个拷贝过程会发生 2 次上下文切换,1 次 CPU 拷贝和 2 次 DMA 拷贝。
Linux零拷贝很多人都听过零拷贝zero-copy的大名,知道在很多牛掰的中间件(比如rocketmq)中为了提高效率,都是用了这项技术。但是,zero-copy到底是怎么回事?今天我想把他彻底搞明白。
这种技术,让用户程序直接访问设备内存,相比于在用户空间和内核空间互相拷贝数据,效率更高。DMA的全称叫直接内存存取,是一种允许外围设备直接访问系统主内存的机制,原来需要依赖cpu进行的数据传输现在可以交给DMA控制器来做,DMA控制传输的过程中cpu可以去做其他的工作,使效率大大提升,目前大多数的硬件设备,包括磁盘控制器、网卡、显卡以及声卡等都支持 DMA 技术。
Socket Direct Buffer:在 JDK 1.4 及更高版本中,Java NIO 支持使用直接缓冲区,这类缓冲区是在系统堆外分配的,可以直接由网卡硬件进行 DMA 操作,减少数据在用户态与内核态之间复制次数 ,提高网络数据发送效率。
在使用传统的 I/O 操作时,比如 InputStream/OutputStream ,通常是将数据暂存到 byte 或者 char 中,亦或者从 byte 或者 char 中来获取数据,但是在 Java 语言中对 array 数组自身提供的可操作的 API 非常少,常用的操作仅仅是 length 属性和下标,如果相对数组中的数据进行更高级的操作,需要自己写代码来实现,处理方式比较原始。
企业级框架:Maven➾GIT ➾ SSM ➾ Spring ➾ MyBatis ➾ SpringMVC ➾ Mybatis Plus ➾ SpringBoot➾SpringSecurity➾日志开发框架。