epoll可以用单进程单线程实现高并发

首先我们可以实现单进程单线程实现高并发(模拟非阻塞IO请求)

服务端

//服务端
public class BlockNIOServer {public static void main(String[] args) throws IOException, InterruptedException {//获取通道ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();//切换非阻塞模式serverSocketChannel.configureBlocking(false);//绑定端口serverSocketChannel.bind(new InetSocketAddress(8090));//获取选择器Selector selector = Selector.open();//将该通道注册到select中,让select监听该通道的连接是否准备就绪serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);Iterator<SelectionKey> iterator = null;//通过选择器轮询获取已经准备就绪的事件while (selector.select()>0){iterator = selector.selectedKeys().iterator();while (iterator.hasNext()){SelectionKey selectionKey = iterator.next();//如果获取的是准备连接就绪的事件if (selectionKey.isAcceptable()){System.out.println("有客户端已经准备好连接了....");//开始接受连接客户端SocketChannel accept = serverSocketChannel.accept();//切换非阻塞模式accept.configureBlocking(false);//将通道注册到selector中,让select监听该通道的数据是否准备就绪accept.register(selector,SelectionKey.OP_READ);}else if (selectionKey.isReadable()){SocketChannel socketChannel = (SocketChannel) selectionKey.channel();Random random = new Random();int i = random.nextInt(100);String path = "C:\\Users\\zhengyan\\Desktop\\test1\\"+i+".txt";FileChannel fileChannel = FileChannel.open(Paths.get(path), StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE);ByteBuffer byteBuffer = ByteBuffer.allocate(1024);while (socketChannel.read(byteBuffer)!=-1){byteBuffer.flip();fileChannel.write(byteBuffer);byteBuffer.clear();}byteBuffer.put("数据已经接受完毕...".getBytes());byteBuffer.flip();socketChannel.write(byteBuffer);fileChannel.close();socketChannel.close();System.out.println("写入数据成功....");}//取消选择键iterator.remove();}}}
}

客户端

//客户端
public class BlockNIOClient {public static void main(String[] args) throws IOException, InterruptedException {//获取通道SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8090));FileChannel fileChannel = FileChannel.open(Paths.get("C:\\Users\\zhengyan\\Desktop\\test1\\x.txt"), StandardOpenOption.READ);//System.out.println("模拟10秒之后发送数据...");//可以开启两个客户端,一个睡10秒发送数据(先请求),一个不用睡眠(后请求),发现,必须等第一个用户处理完毕之后,第二个用户才可以被处理//Thread.sleep(20000);//分配缓冲区大小ByteBuffer byteBuffer = ByteBuffer.allocate(1024);//读取本地文件发送到服务器while (fileChannel.read(byteBuffer)!=-1){byteBuffer.flip();socketChannel.write(byteBuffer);byteBuffer.clear();}//告诉服务器,我的数据已经发送完毕socketChannel.shutdownOutput();//接受服务器返回来的消息StringBuffer stringBuffer = new StringBuffer();int len =-1;while ((len=socketChannel.read(byteBuffer))!=-1){byteBuffer.flip();stringBuffer.append(new String(byteBuffer.array(),0,len));byteBuffer.clear();}System.out.println(stringBuffer);socketChannel.close();fileChannel.close();}
}

假如有三个连接到来了,一个socker通道监听连接是否到来(白色方格),三个socker通道是因为连接到来了,被注册到select中监听数据是否到来(黄色方格),此时select不断的遍历,首先select将其中的一个socker通道(在linux中是fd(int)文件描述符)复制一份到操作系统(这一步是性能的瓶颈所在,让操作提供来看看我这个通道有没有数据到来,或者连接请求的到来),此时操作系统(内核)还会执行别的应用进程,什么执行我们这个检测操作是由操作系统决定(又浪费了一部分时间)。然后一步一步将select选择器中的所有的socket通道全部遍历(select选择器中的socker通道数目越多,性能越差),有的socker通道不活跃,也被检测了,就非常损耗性能。

图中绿色的是select选择器(维护了socker通道),处于应用层,放在用户空间

epoll

epoll有一段特殊的内存空间(操作系统和应用程序共用)

图中绿色的是epoll选择器(维护了socker通道,实现方式是红黑树和链表),处于应用程序和内核共享空间

epoll的第一个优点:不需要额外的复制操作

epoll的第一个优点:采用事件通知,取代了之前的轮询(select)

转载于:https://www.cnblogs.com/yanxiaoge/p/11563609.html

web----epoll实现原理相关推荐

  1. 十个问题理解Linux epoll工作原理

    作者:dustinzhou,腾讯 IEG 运营开发工程师 epoll 是 linux 特有的一个 I/O 事件通知机制.很久以来对 epoll 如何能够高效处理数以百万记的文件描述符很有兴趣.近期学习 ...

  2. java 网页应用 原理_【转载】Web应用工作原理

    问题描述: Web应用工作原理 问题解决: 前言 什么是web应用程序?web应用程序又是如何进行工作的呢?什么是动态网页技术?又有 哪些动态网页技术呢?这次这篇文章需要探求总结的. Web应用 我们 ...

  3. 十个问题理解Linux epoll工作原理:惊群,

    目录 Question 1:是否所有的文件类型都可以被 epoll 监视?不是 Question 2:ep->wq 的作用是什么? Question 3:什么是 epoll 惊群? Questi ...

  4. Web应用工作原理、动态网页技术

    我们知道应用程序有两种模式,C/S模式和B/S模式.C/S模式是客户端/服务器模式,这类 应用程序一般独立的运行.B/S模式是浏览器/服务器模型,需要借助浏览器来运行. web应用程序一般就是B/S模 ...

  5. Web服务器工作原理详解(基础篇)

    概述:Web服务器概念较为广泛,我们最常说的Web服务器指的是网站服务器,它是建立在Internet之上并且驻留在某种计算机上的程序.Web服务器可以向Web客户端(如浏览器)提供文档或其他服务,只要 ...

  6. WebRTC源码研究(4)web服务器工作原理和常用协议基础

    文章目录 WebRTC源码研究(4)web服务器工作原理和常用协议基础 前言 做WebRTC 开发为啥要懂服务器开发知识 1. Web 服务器简介 2. Web 服务器的类型 3. Web 服务器的工 ...

  7. web渗透-Web服务通信原理

    Web服务通信原理 目录 一.基本知识介绍 1.常见的服务器系统 2. 绝对路径与相对路径 3.CMD命令(伪DOS)win+R 4.网络方面 二.网页浏览流程 三.常见的web容器 WEB容器是什么 ...

  8. web服务:原理与技术01

    电子服务系统设计复习总结01 前言 本文档原意为考试复习所用,基于 <web服务:原理与技术> 课本. 第一章 1.什么是WS (Web Service) ​ ①当服务使用因特网作为通信手 ...

  9. WebRTC源码研究(4)web服务器工作原理和常用协议基础(转载)

    前言 前面3篇博客分别对WebRTC框架的介绍,WebRTC源码目录,WebRTC的运行机制进行了介绍,接下来讲解一点关于服务器原理的知识.后面博客会写关于WebRTC服务器相关的开发,目前git上面 ...

  10. 【高阶知识】用户态协议栈之Epoll实现原理

    Epoll 是 Linux IO 多路复用的管理机制.作为现在 Linux 平台高性能网络 IO 必要的组件.内核的实现可以参照:fs/eventpoll.c . 为什么需要自己实现 epoll 呢? ...

最新文章

  1. php类退出魔术方法,php类中常用的魔术方法
  2. 日记-2017-7-24-cp-css-django/media
  3. [AX2012]发送广播邮件
  4. Acknowledgement Modes
  5. APUE Chapter 1 - UNIX System Overview
  6. 方便微信公众号等手机网页调试插件eruda和vConsole
  7. 互联网晚报 | 9月3日 星期五 | vivo正式公布自研芯片V1;天猫公布今年双11节奏;网易云音乐去除歌曲“独家”标志...
  8. python bool类型如何与整数比较_Python入门必读bool类型和比较运算符
  9. hsqldb和mysql_HSQLDB的研究与性能测试(与Mysql对比)
  10. 如何看待不会写代码的架构师?
  11. linux驱动初探之字符驱动
  12. 教你在Linux备份文件名加上当前时间
  13. oracle 脚本怎么写,wincc与 oracle 数据通讯脚本如何写-工业支持中心-西门子中国...
  14. Google Earth Engine(GEE)——中国区域NOAA数据风速代码下载
  15. 机器学习分类算法之支持向量机
  16. 美团的2020年:千亿美元帝国的贪吃蛇游戏,气势汹汹也危机重重
  17. 给想上MIT的牛学生说几句
  18. vue中使用市区(地区)联动 复制三步完成
  19. 雷达图人格php源码,061 实例15-霍兰德人格分析雷达图
  20. 说谎者的辩白 -卢梭

热门文章

  1. 页面性能优化参考建议
  2. mos 控制交流_电机控制器母线电容的设计选型
  3. node.js之文件读写模块,配合递归函数遍历文件夹和其中的文件
  4. 将字符串中的字符按Z字形排列,按行输出
  5. 配置HAProxy支持https协议
  6. JZOJ 8.15 B组总结
  7. saltstack-部署
  8. OC-NSFileManager和NSFileHandle的使用
  9. Spring中配置数据源的4种形式 ---转
  10. discuz中又拍云在ie8,chrome22下不能上传的问题