web----epoll实现原理

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web----tcp三次握手

1、首先为什么需要握手 首先我们看一下TCP报文段的结构 TCP报文段中的窗口这16位字段部分&#xff0c;这里窗口的作用就是为了实现流量的控制&#xff0c;为什么会有流量的控制的引入&#xff1f;&#xff1f;&#xff1f;它是这样来的&#xff1a;若是发送方发送数据的速度大于…

吉他谱----see you again

指弹谱 转载于:https://www.cnblogs.com/yanxiaoge/p/11567740.html

一棵大树好乘凉

2004.5.6 发表于加西 【光的演绎, 风光篇】 转载于:https://www.cnblogs.com/chahua/archive/2009/07/14/1523160.html

吉他谱----再见

弹唱 转载于:https://www.cnblogs.com/yanxiaoge/p/11568911.html

Linux监控工具介绍系列——smem

smem工具介绍 smem是Linux系统上的一款可以生成多种内存耗用报告的命令行工具。与现有工具不一样的是smem可以报告实际使用的物理内存&#xff08;PSS&#xff09;&#xff0c;这是一种更有意义的指标。可以衡量虚拟内存系统的库和应用程序所占用的内存数量。 由于大部分的物理…

GC算法 垃圾收集器

概述 垃圾收集 Garbage Collection 通常被称为“GC”&#xff0c;它诞生于1960年 MIT 的 Lisp 语言&#xff0c;经过半个多世纪&#xff0c;目前已经十分成熟了。 jvm 中&#xff0c;程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭&#xff0c;栈帧随着方法的进入…

Nginx----原理

原理 master-workers的机制的好处  首先&#xff0c;对于每个worker进程来说&#xff0c;独立的进程&#xff0c;不需要加锁&#xff0c;所以省掉了锁带来的开销&#xff0c;同时在编程以及问题查找时&#xff0c;也会方便很多。其次&#xff0c;采用独立的进程&#xff0c;可…

JVM架构和GC垃圾回收机制--面试

JVM架构和GC垃圾回收机制详解 JVM架构图分析 下图&#xff1a;参考网络书籍&#xff0c;如有侵权请见谅 &#xff08;想了解Hadoop内存溢出请看&#xff1a; Hadoop内存溢出(OOM)分类、参数调优化&#xff09; JVM被分为三个主要的子系统 &#xff08;1&#xff09;类加载器…

java中线程池的几种实现方式

1、线程池简介&#xff1a; 多线程技术主要解决处理器单元内多个线程执行的问题&#xff0c;它可以显著减少处理器单元的闲置时间&#xff0c;增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为&#xff1a;T1 创建线程时间&#xff0c;T2 在线程中…

JVM架构和GC垃圾回收机制详解

JVM架构图分析 下图&#xff1a;参考网络书籍&#xff0c;如有侵权请见谅 &#xff08;想了解Hadoop内存溢出请看&#xff1a; Hadoop内存溢出(OOM)分类、参数调优化&#xff09; JVM被分为三个主要的子系统 &#xff08;1&#xff09;类加载器子系统&#xff08;2&#xff0…

IIS不能发布asp.net 应用程序

IIS不能发布asp.net 应用程序最近在写程序的时候&#xff0c;突然项目经理想发布一下网站看一下做的效果当我发布的时候遇到 下面的错误&#xff1a;&#xff1a;使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮&#xff0c;或以后重试。 名称以无效字符开头的…

前端学习(41):背景实现视觉差效果

首先准备三张图片 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible&quo…

CAS原理分析

在JDK 5之前Java语言是靠synchronized关键字保证同步的&#xff0c;这会导致有锁&#xff08;后面的章节还会谈到锁&#xff09;。 锁机制存在以下问题&#xff1a; &#xff08;1&#xff09;在多线程竞争下&#xff0c;加锁、释放锁会导致比较多的上下文切换和调度延时&…

深入理解HashMap(原理,查找,扩容)

面试的时候闻到了Hashmap的扩容机制&#xff0c;之前只看到了Hasmap的实现机制&#xff0c;补一下基础知识&#xff0c;讲的非常好 原文链接&#xff1a; http://www.iteye.com/topic/539465 Hashmap是一种非常常用的、应用广泛的数据类型&#xff0c;最近研究到相关的内容&…

uml 类图整理

1.五分钟读懂UML类图 http://www.cnblogs.com/shindo/p/5579191.html 2.UML类关系&#xff08;依赖&#xff0c;关联&#xff0c;聚合&#xff0c;组合的区别&#xff09; https://www.jianshu.com/p/eefa0b5b4922 2.1 关联 1、关联关系 关联关系又可进一步分为单向关联、…

web控件开发系列(四) 自定义控件属性(下)

控件在WEB开发时经常要用到&#xff0c;虽然有部分已经存在工具箱里&#xff0c;但有时总需要根据自己的要求&#xff0c;开发一些合适自己的控件。接上一节,已经说过了控件的属性, 例如&#xff0c;我们需要一组属性的集合时&#xff0c;这时我们需要用到的就是复杂属性了&…

23设计模式学习

1.什么设计模式 1.1模式是解决相似问题的核心1.2设计模式软件设计过程中解决一类问题的方案总结来说&#xff1a;设计模式 &#xff1a;软件设计过程中解决一类问题的一种方案&#xff1b; 2.什么是面向对象的设计模式 面向对象设计模式描述了面向对象设计过程中、特定场景下…

移植u-boot-2012.04.01到jz2440开发板

今天我给大家分享一下如何移植一个纯净的uboot到jz2440开发大版&#xff0c;通过记录学习分享&#xff0c;与大家一起进步&#xff01;&#xff01;&#xff01; 1.首先我们在uboot官网下载u-boot-2012.04.01.tar.bz2&#xff0c;建立source insight工程。将下载好的uboot通过…

温习了一下java线程状态方面的知识总结一

好长时间没有复习线程状态这块&#xff0c;读并发编程实战正好看着这块&#xff0c;顺便复习一下&#xff1a; 1.线程的五种状态&#xff1a; 2.线程五种状态的转换图&#xff1a; wait()会立刻释放synchronized(obj)中的锁以便其它线程可以执行obj.notify 但是notify() 不会立…