您当前的位置: 首页 >  nio

02RPC - socket nio原理

杨林伟 发布时间:2019-08-05 17:00:54 ,浏览量:4

NIO是New IO 的简称,在jdk1.4 里提供的新api 。Sun 官方标榜的特性如下: 为所有的原始类型提供(Buffer)缓存支持,字符集编码解码解决方案。

Channel : 一个新的原始I/O 抽象。 支持锁和内存映射文件的文件访问接口。 提供多路(non-bloking) 非阻塞式的高伸缩性网络I/O 。

传统的I/O

使用传统的I/O程序读取文件内容, 并写入到另一个文件(或Socket), 如下程序:

File.read(fileDesc, buf, len);
Socket.send(socket, buf, len);

会有较大的性能开销, 主要表现在一下两方面:

1.上下文切换(context switch), 此处有4次用户态和内核态的切换。 2.Buffer内存开销, 一个是应用程序buffer, 另一个是系统读取buffer以及socket buffer。

其运行示意图如下: 在这里插入图片描述 1.先将文件内容从磁盘中拷贝到操作系统buffer

2.再从操作系统buffer拷贝到程序应用buffer

3.从程序buffer拷贝到socket buffer

4.从socket buffer拷贝到协议引擎.

NIO

NIO技术省去了将操作系统的read buffer拷贝到程序的buffer, 以及从程序buffer拷贝socket buffer的步骤, 直接将 read buffer 拷贝到 socket buffer. java 的 FileChannel.transferTo() 方法就是这样的实现, 这个实现是依赖于操作系统底层的sendFile()实现:

public void transferTo(long position, long count, WritableByteChannel target);

它的底层调用的是系统调用sendFile()方法

sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

如下图: 在这里插入图片描述

关注
打赏
1688896170
查看更多评论

杨林伟

暂无认证

  • 4浏览

    0关注

    3183博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0793s