NIO多路复用机制

NIO多路复用机制

客户端与服务器每次网络通讯, 会建立一个连接, 创建socket, 以soket为媒介, 发送和接收输入输出流.进行流的读写操作.

介绍下BIO、NIO和AIO

BIO(blocking I/O) 同步阻塞
JDK1.4之前,是面向流传输的, 传输效率慢, 客户端每次发起一个请求, 建立一个连接, 都创建一个socket对象, 不管有没有流的传输, 服务器都创建一个线程, 但有些线程不会执行流的读写操作是无效的. 线程多了会占用过多的资源,浪费堆的内存空间(可以采用线程池去管理线程, 但是如果线程池满的情况下, 再创建新线程会等待空余线程去复用)不适合高并发情况
io的阻塞是针对流是否可以同时读写来说的,stream只是支持单向的读写

NIO (non-blocking I/O)同步非阻塞
组成部分: 通道, 缓冲区, 选择器
JDK1.4开始支持, 引入的面向缓冲区的, 缓冲区buffer支持同时读写操作, 服务器不需要对每个请求都创建线程,
执行流程: 客户端发起请求, 请求通过chanel通道注册到selector连接器上, selector进行while(true)轮询, 当轮询到到有读写操作时,才创建线程. 效率提升.适用连接数量较多,但连接较短的操作, 比如聊天室。
在这里插入图片描述

AIO (Asynchronous I/O) 异步非阻塞

AIO的基本流程是:用户线程通过系统调用,告知kernel内核启动某个IO操作,用户线程返回。kernel内核在整个IO操作(包括数据准备、数据复制)完成后,通知用户程序,用户执行后续的业务操作。

在这里插入图片描述

BIO/NIO/AIO使用场景
并发连接数不多时采用BIO,因为它编程和调试都非常简单,但如果涉及到高并发的情况,应选择NIO或AIO,更好的建议是采用成熟的网络通信框架Netty。

NIO中select、poll 、 epoll模式
文件描述符fd:
在linux中,一切皆文件,fd是非负整数,用来标明每一个被进程所打开的文件
select模式
当客户端发起一个socket请求, 在linux系统下看做一个文件描述符fd, select模式的fd存放bitmap里, 支持fd的大数量是1024。
 

在这里插入图片描述

 

在这里插入图片描述

poll模式
1.相比select, 把fd的bitMap变为了fd的链表,
2.fd的个数上限大于1024个, 但依旧会有用户态和内核态切换的性能问题.
3.依旧存在时间复杂度O(n)的问题, 提升性能不大

epoll模式(基于事件驱动)
在这里插入图片描述

执行过程
1.epoll_create()
创建好请求socket的fd; 准备空间, 在高速cache中生成Map(就那个红黑树) 和 1个List(就那个事件链表)
2. epoll_ctl(epollfd, my_events)
只把有效fd事件(比如:读写等)注册进红黑树, 以便支持快速插入、删除、修改等操作而不用再变遍历 ,然后通过回调函数, 写进事件链表里.
3. epoll_wait(epollfd, ready_events)
检查事件链表中有数据就处理, 没有数据就睡眠.

epoll优点:
1.相比select和poll, epoll获取有效fd的时间复杂度是O(1), epoll每次只扫描事件链表的数据, 直接取符合条件的fd, 所以复杂度O(1)
2.epoll提供高速cache, 共享用户态和内核态, 不需要内核状态之前的切换.

Netty简述

Netty基于NIO的Reactor的多线程模型,
有2个线程, 一个是boss线程,一个是worker线程,
boss线程执行accept方法, 集中接收客户端的请求,建立连接
worker线程负责处理各自IO事件.

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值