【NIO为什么需要selector】

NIO,多路复用,epoll轮询机制

NIO为什么需要selector

1.简单的NIO实现

意思就是让accept变为非阻塞
意思就是让accept变为非阻塞
没有客户端连接时,socketChannel为空,并且不会阻塞
没有客户端连接时,socketChannel为空,并且不会阻塞
并且把socketChannel的阻塞配置也设置为false,这样在后面获取输入流,使用read读取流中数据的时候就不会阻塞。
可能有多个连接,所以需要把客户端连接同一个list数组存起来
没有发送数据,read也不会阻塞,直接跳到下面的if判断了。
在这里插入图片描述

2.这样写的NIO存在的问题**

1.如果没有客户端连接进来,程序还会一直占用cpu,浪费资源。
2.如果channelList,现在有10000个连接在channelList里面,但是只有3个连接里面要收发数据,从10000个连接里面遍历去找3个需要处理的连接,非常低效.

3.解决方法(完整的NIO,使用Selector,)

用serverSocketChannel监听连接事件,注册到多路复用器selector上
用serverSocketChannel监听连接事件,注册到多路复用器selector上
这个阻塞并不会占用cpu,并且只处理有读写事件的socketchannel;
在这里插入图片描述

NIO模型图
NIO模型图

4.epoll事件轮询机制底层原理简诉(三个操作系统内核函数)。

epoll_create创建实例,epoll_ctl监听channel,有事件发生则把事件挪到就绪列表rdlist中,epoll_wait监听relist,没事件阻塞,有事件就处理rdlist中的事件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.select和poll和epoll的区别

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值