Selector的原理详解

  • 1.传统多线程网络通信的服务器设计
  • 2.线程池版网络通信的服务器设计
  • Selector版网络通信的服务器设计

说到Selector的作用,我们不得不引入 多线程网络通信的设计

1.传统多线程网络通信的服务器设计


服务器每建立一个客户端连接Socket,就会创建一个线程单独处理这个Socket中的IO请求(IO读写),那么这样当连接很多的时候,势必会造成线程资源不足的问题,浪费内存空间,且处理不同连接的IO请求时会频繁的切换线程,降低CPU的利用率

缺点:
1.浪费线程资源,消耗内存空间
2.线程频繁切换开销大,降低CPU利用率

2.线程池版网络通信的服务器设计

基于传统版做了一定改进,既然提到线程资源不够的问题,那么采用线程池来固定线程个数,这要求Socket是非阻塞模式

阻塞模式:一个线程只负责一个Socket的IO处理,无论这个Socket是否又IO请求,如果有IO请求,那么线程处理,如果没有那么线程就阻塞等待,这样线程的利用率非常低.

非阻塞模式:一个线程可以负责多个Socket的IO处理,当Socket有IO请求时,线程池调用空闲线程去处理此Socket的IO请求,处理完毕后发现没有IO请求了,那么线程空闲下来可以用于处理其他Socket的IO请求,而不必要阻塞等待.

缺点:
连接数过多,IO量大,线程处理不过来,使得某些Socket的IO请求响应时间长,这样就需要增加线程池中线程的个数,也会导致线程不够用

Selector版网络通信的服务器设计


将所有建立连接的Socket的channel通道存储在selector容器中,只需要创建一个线程去不断循环遍历selector中的所有channel通道,如果发现channel通道处于读写就绪状态,那么线程去处理这个channel的IO请求,处于阻塞状态,直到IO处理完毕,继续进行轮询操作

缺点:
如果IO量非常大,那么会出现线程一直在处理一个channel的IO操作,线程一直阻塞在一个Socket通道中,造成其他Socket的长时间等待一直得不到处理,于是接下来就要引入Netty中IO多路复用的Rector模型来解决这些高并发高吞吐量的问题.

Netty框架之Selector轮询器相关推荐

  1. Netty框架之Selector使用详解

    谈到Selector的具体使用,那么就要结合BIO,NIO的知识讲解,Selector使用在非阻塞模式NIO场景下,学习NIO之前先要了解BIO原理,下面我们一步步讲解 一.BIO(Blocking- ...

  2. Golang源码探究 —— 网络轮询器netpoller

    目录 一.Linux网络编程基础知识 1.1 socket编程 1.2 三次握手 二.网络I/O模型 2.1 阻塞I/O模型 2.2 非阻塞I/O模型 2.3 I/O多路复用 2.4 信号驱动I/O ...

  3. Netty框架之多线程的Selector优化

    Netty框架之多线程的Selector优化 1.一个Boss线程,一个Woker线程实现服务器 2.一个Boss线程,多个Woker线程实现服务器 学习Selector之后,我们发现单个Select ...

  4. Netty框架之概述及基本组件介绍

    概述 Netty是由JBOSS提供的一个java开源框架,是一个高性能.高可扩展性的异步事件 驱动的网络应用程序框架,它极大地简化了TCP和UDP客户端和服务器开发等网络编 程. NIO有下面的缺点: ...

  5. JavaSocket编程之Netty框架线程模型

    1.Netty概述 Netty是一个由JBoss提供的高效的Java NIO client-server(客户端-服务器)开发框架,使用Netty可以快速开发网络应用.Netty提供了一种新的方式来使 ...

  6. 【博学谷学习记录】超强总结,用心分享 | 架构师 Netty框架学习总结

    文章目录 前言 一.Netty · Netty简介 · Netty核心架构 · Netty中Reactor实现 1.工作流程 2.ChannelPipeline 和 ChannelHandler(开发 ...

  7. 平滑的加权轮询均衡算法

    前言 在反向代理.路由.分布式应用调度等场景中通常都需要用到负载均衡算法,负载均衡的关键要点是"均衡",即确保调用请求能均衡地落到多个处理节点上,负载均衡算法一般使用随机或轮询都可 ...

  8. spring 长轮询_Spring集成文件轮询和测试

    spring 长轮询 我最近实施了一个小项目,在该项目中,我们必须轮询文件夹中的新文件,然后在文件内容上触发服务流. Spring Integration非常适合此要求,因为它带有一个通道适配器 ,该 ...

  9. usb端点轮询_使用Spring Integration轮询http端点

    usb端点轮询 如果您想用Spring Integration编写一个流程来轮询HTTP端点并从http端点收集一些内容以进行进一步处理,那有点不直观. Spring Integration提供了几种 ...

最新文章

  1. fibonacci数列前20项_等差数列、等比数列、调和数列等几种常见数列的总结
  2. Java程序内存分析
  3. IDEA编译时出现 Information:java: javacTask: 源发行版 1.8 需要目标发行版 1.8
  4. 下一个排列—leetcode31
  5. SpringMVC中向服务器传输数据(解决get、post、delete、put请求乱码问题)
  6. Reporting Area and Available Characteristics
  7. 【POJ - 3744】Scout YYF I(概率dp,矩阵快速幂优化dp)
  8. ubuntu 12.04 ubuntu System program problem detected 解决方法
  9. oracle 获取当前用户下的所有表名与字段信息
  10. java对象调用方法,java 对象调用
  11. cs用服务器运行,如何搭建自己的CS服务器(插件配置篇)
  12. 【电脑使用】插入SD卡图标是灰色的,点击显示“请将磁盘插入驱动器”
  13. Android学习笔记:实现app启动界面跳过倒计时功能
  14. c语言海报,竞选海报 c语言
  15. Android 64位变32位
  16. 一点点矩阵理论知识:如何区分理解子空间的和与并?
  17. 上传绕过php文件改为图片,文件上传漏洞另类绕过技巧及挖掘案例全汇总
  18. 百分点技术负责人:我们为什么需要大数据操作系统
  19. 通过Keras + LSTM训练天气污染程度预测模型
  20. mysql和虚拟主机区别_mysql和虚拟主机的区别是什么

热门文章

  1. 智华计算机终端无法卸载,智华天成V1.0计算机终端保密检查系统软件 国密装备目录**...
  2. 【Unity】监听编辑器聚焦/激活状态OnEditorFocus
  3. Spring/Boot/Cloud系列知识:SpringMVC进行HTTP信息接收和发送的过程(1)
  4. [Python] 2的N次方
  5. 无限法则服务器错误代码,电脑打个无限法则没事儿重启,看系统管理器。提示如图错误代码,发现看不懂...
  6. linux中进程与cpu核的绑定
  7. linux用户密码转换为明文,Linux strace 明文密码抓取
  8. Objective-C 之父 Brad Cox 逝世,创建过乐队、推动苹果软件生态
  9. maven查看jar包对应的依赖
  10. CRC校验中的“模2”除法运算流程图和图示