Selector多路复用器原理
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多路复用器原理相关推荐
- NIO 之 Selector实现原理
相关文章 NIO 之 ByteBuffer实现原理 NIO 之 Channel实现原理 NIO 之 Selector实现原理 概述 Selector允许单线程处理多个 Channel.如果你的应用打开 ...
- 深入浅出NIO之Selector实现原理
2019独角兽企业重金招聘Python工程师标准>>> 前言 Java NIO 由以下几个核心部分组成: 1.Buffer 2.Channel 3.Selector Buffer和C ...
- Selector 实现原理
转载自 Selector 实现原理 概述 Selector是NIO中实现I/O多路复用的关键类.Selector实现了通过一个线程管理多个Channel,从而管理多个网络连接的目的. Channel代 ...
- nio和bio的原理_Java的BIO,NIO和AIO的区别于演进
前言 Java里面的IO模型种类较多,主要包括BIO,NIO和AIO,每个IO模型都有不一样的地方,那么这些IO模型是如何演变呢,底层的原理又是怎样的呢? 本文我们就来聊聊. BIO BIO全称是Bl ...
- Socket 核心原理分享
Socket 核心原理分享 闪念基因 2020-09-21 10:38:58 作者:ITDragon龙 出处:http://www.cnblogs.com/itdragon/ Socket 的个人故事 ...
- epoll编程实例客户端_深入底层探析网络编程之多路复用器(select,poll,epoll)
IO模型 只关注IO,不关注IO读写完成后的事情. 同步:程序(APP)自己进行读/写操作 异步:由Kernel完成读/写,程序跑起来感觉像没有访问IO,访问的是buffer 阻塞:BLOCKING, ...
- Java NIO Selector , SelectionKey , SocketChannel , ServerSocketChannel
一 NIO介绍 1. NIO是非阻塞的 NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,rea ...
- NIO核心设计与原理
一.五种IO模型 在<Unix网络编程>一书中提到了五种IO模型,分别是:阻塞IO.非阻塞IO.多路复用IO.信号驱动IO以及异步IO. 五种IO模型 1.1 阻塞IO模型 最传统的一种I ...
- 01-计算机原理基础
目录 一.计算机原理基础 三.虚拟机安装与使用 四.Linux系统介绍 4.1 Linux系统介绍 4.2 单体项目部署: 4.3 部署Springboot项目(java -jar xxx.jar): ...
最新文章
- 2017年全球光伏需求有望首次突破100吉瓦
- php输出的数组如何存入表单,jquery:如何在jquery中将数组附加到表单请求并将其发送到php...
- mysql存储过程——procedure[prəˈsiːdʒər]
- window8服务器
- 电脑格式化的危害_防止硬盘被格式化的六大方法
- Bailan4142 二分法求函数的零点【二分法】
- 笔记本系统恢复连载之十:系统恢复并不难
- wow模型修改器_《魔兽世界》魔兽世界模型修改器攻略
- TLS 各种加密套件
- sipp命令 各参数含义
- [ZJOI2009]狼和羊的故事 题解
- 【五、反向代理及其相关配置】
- 网站服务器选择什么操作系统,网站服务器选择哪种操作系统比较好
- 读《史蒂夫•乔布斯传》(二)
- tomcat启动成功浏览器却无法访问
- html网页设计期末大作业——生物科技化妆品网页(6页) HTML+CSS+JS网页设计期末课程大作业
- 常被大众误以为是外国佬研发的四款国产软件,建议低调收藏
- PCB工艺规范及PCB设计安规原则
- VirtualBox - 自动调整屏幕大小,设置虚机自适应显示器
- 【Spring Cloud 基础设施搭建系列】Spring Cloud Demo项目 Spring Cloud Config Client 失败快速响应与超时重试