java的selector

无论在tomcat中的Poller线程,还是在netty的NioEventLoop中都有用到NIO中中重要的组件Selector,为啥需要多路复用。先看下BIO模型

在BIO中,服务端每接收一个客户端的请求就需要创建一个线程,用来处理客户端的请求。如果有大量的客户端请求,那么将会创建大量的线程进行处理,线程的创建销毁导致服务效率极低。这时,NIO的多路复用就出现了,用一个线程处理多个客户端请求。

无论是在TOMCAT中的Poller线程,还是netty中都有用到这个多路复用器

底层原理

在Linux中多路复用器的底层实现是select与epoll,首先来了解一下select这个系统调用

select

select是一个系统调用,它允许程序监视多个文件描述符,直到一个或多个文件描述符为某个I/O“准备好”才返回,或者超时也会返回。该进程传递给内核一组fd,并陷入到R0中,内核去操作这些fd,并监控着,如果一旦这个fd可以使用(可读、可写的事件发生),立马返回,执行用户所注册的回调操作。看下内核的源码。

应用

在redis中,也使用了NIO的多路复用器。在启动redis服务的时候,就是创建多路复用器。

可以看到,多路复用器有多种,在这里,我们关注select跟epoll。这是linux的东西。然后再serverSocket接收到了请求之后,将client的socket对应的fd放入集合中。

然后再aeMain中调用了select系统调用,询问内核是否有请求数据的到来。

如果有数据过来,即retval>0,则把对应的socket fd挂在evetnloop->fired数据中。让redis进行处理。

epoll

epoll对应有三个系统调用epoll_create,epoll_ctl,epoll_wait。epoll不需要每次都向内核传入fdset,epoll会自己在内核维护需要监听的socket fd。当有请求数据到来,内核会将有事件的fd放入rdlist中,其流程如下图所示。

epoll在redis中的应用

首先在服务启动的时候,会调用epoll_create创建ep。

然后将服务端用来监听请求的server socket放入

并确认好回调函数acceptTcpHandler

当有客户端请求过来,调用sys_epoll_ctl将客户端socket的fd放入epoll中,并设置好回调函数readQueryFromClient

当有请求到来,将会回调readQueryFromClient。

内核原理

epoll_wait获取准备好事件fd

Selector多路复用器原理相关推荐

  1. NIO 之 Selector实现原理

    相关文章 NIO 之 ByteBuffer实现原理 NIO 之 Channel实现原理 NIO 之 Selector实现原理 概述 Selector允许单线程处理多个 Channel.如果你的应用打开 ...

  2. 深入浅出NIO之Selector实现原理

    2019独角兽企业重金招聘Python工程师标准>>> 前言 Java NIO 由以下几个核心部分组成: 1.Buffer 2.Channel 3.Selector Buffer和C ...

  3. Selector 实现原理

    转载自 Selector 实现原理 概述 Selector是NIO中实现I/O多路复用的关键类.Selector实现了通过一个线程管理多个Channel,从而管理多个网络连接的目的. Channel代 ...

  4. nio和bio的原理_Java的BIO,NIO和AIO的区别于演进

    前言 Java里面的IO模型种类较多,主要包括BIO,NIO和AIO,每个IO模型都有不一样的地方,那么这些IO模型是如何演变呢,底层的原理又是怎样的呢? 本文我们就来聊聊. BIO BIO全称是Bl ...

  5. Socket 核心原理分享

    Socket 核心原理分享 闪念基因 2020-09-21 10:38:58 作者:ITDragon龙 出处:http://www.cnblogs.com/itdragon/ Socket 的个人故事 ...

  6. epoll编程实例客户端_深入底层探析网络编程之多路复用器(select,poll,epoll)

    IO模型 只关注IO,不关注IO读写完成后的事情. 同步:程序(APP)自己进行读/写操作 异步:由Kernel完成读/写,程序跑起来感觉像没有访问IO,访问的是buffer 阻塞:BLOCKING, ...

  7. Java NIO Selector , SelectionKey , SocketChannel , ServerSocketChannel

    一    NIO介绍 1. NIO是非阻塞的 NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,rea ...

  8. NIO核心设计与原理

    一.五种IO模型 在<Unix网络编程>一书中提到了五种IO模型,分别是:阻塞IO.非阻塞IO.多路复用IO.信号驱动IO以及异步IO. 五种IO模型 1.1 阻塞IO模型 最传统的一种I ...

  9. 01-计算机原理基础

    目录 一.计算机原理基础 三.虚拟机安装与使用 四.Linux系统介绍 4.1 Linux系统介绍 4.2 单体项目部署: 4.3 部署Springboot项目(java -jar xxx.jar): ...

最新文章

  1. 2017年全球光伏需求有望首次突破100吉瓦
  2. php输出的数组如何存入表单,jquery:如何在jquery中将数组附加到表单请求并将其发送到php...
  3. mysql存储过程——procedure[prəˈsiːdʒər]
  4. window8服务器
  5. 电脑格式化的危害_防止硬盘被格式化的六大方法
  6. Bailan4142 二分法求函数的零点【二分法】
  7. 笔记本系统恢复连载之十:系统恢复并不难
  8. wow模型修改器_《魔兽世界》魔兽世界模型修改器攻略
  9. TLS 各种加密套件
  10. sipp命令 各参数含义
  11. [ZJOI2009]狼和羊的故事 题解
  12. 【五、反向代理及其相关配置】
  13. 网站服务器选择什么操作系统,网站服务器选择哪种操作系统比较好
  14. 读《史蒂夫•乔布斯传》(二)
  15. tomcat启动成功浏览器却无法访问
  16. html网页设计期末大作业——生物科技化妆品网页(6页) HTML+CSS+JS网页设计期末课程大作业
  17. 常被大众误以为是外国佬研发的四款国产软件,建议低调收藏
  18. PCB工艺规范及PCB设计安规原则
  19. VirtualBox - 自动调整屏幕大小,设置虚机自适应显示器
  20. 【Spring Cloud 基础设施搭建系列】Spring Cloud Demo项目 Spring Cloud Config Client 失败快速响应与超时重试

热门文章

  1. 警冲标和绝缘节的那些事儿
  2. 使用了代理服务器之后突然浏览器不能打开网页的解决方法
  3. 台式计算机系统配置,怎么看自己电脑配置 电脑配置参数说明【图文】
  4. 2022年全球市场外科手术引流设备总体规模、主要生产商、主要地区、产品和应用细分研究报告
  5. TYVJ 1939 「Poetize4」玉蟾宫
  6. Django学习第一周和第二周(pycharm专业版)
  7. css 鼠标沙漏,CSS3 沙漏动画
  8. Android 操作系统架构
  9. ARM Cortex M4使用浮点运算单元(FPU)
  10. Web侦察工具HTTrack (爬取整站)