epoll

JAVA BIO,NIO,Reactor模式总结

寵の児 提交于 2020-04-27 18:11:46
传统同步阻塞I/O(BIO) 在NIO之前编写服务器使用的是同步阻塞I/O(Blocking I/O)。下面是一个典型的线程池客服端服务器示例代码,这段代码在连接数急剧上升的情况下,这个服务器代码就会不好使了,因为serverSocket.accept(),以及IO的read(),write()方法都是同步阻塞的,虽然通过线程池,避免频繁创建线程开销,但是该系统过于依赖线程,一个是线程的创建和销毁很耗时,再者线程的切换开销很大,尤其是在高并发的情况下系统压力不堪设想。 BIO线程池客服端服务器示例代码 /** * BIO服务器 * @author monkjavaer * @date 2019/7/17 13:55 */ public class BioServer { public static final int PORT = 8888; public static void main(String[] args) { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(PORT); Socket socket = null; ThreadFactory namedThreadFactory = new ThreadFactory() { @Override public Thread

TCP accept返回的socket,服务端TCP连接数限制

时光总嘲笑我的痴心妄想 提交于 2020-04-27 04:28:16
http://www.cppblog.com/aa19870406/archive/2012/07/15/183595.html socket accept()返回的socket描述符的端口和listen描述符端口是一样的吗? as you know,一个socket是由一个五元组来唯一标示的,即(协议,server_ip, server_port, client_ip, client_port)。只要该五元组中任何一个值不同,则其代表的socket就不同。这里忽略协议的区别,在同一协议的基础上,服务器端的listen socket的端口可以看成(server_ip, server_port, ***, ***),其中***是通配符,它跟任何一个client_ip, client_port值都不同,可以简单看成是(0,0)对,当然实现不是这样的。这样在服务器端accept之后,返回的连接socket的四元组就是(server_ip, server_port, client_ip, client_port),这里的client_ip,client_port因连接的客户端的不同而不同。所以accept返回的socket和listen socket是不同的,不同之处就在于四元组中的客户端ip和port,而服务器端的server_ip和server_port还是相同的,也就是accpet(

【面试题】Netty相关(转)

依然范特西╮ 提交于 2020-04-27 04:23:59
转自https://blog.csdn.net/baiye_xing/article/details/76735113 1.BIO、NIO和AIO的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。 伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 AIO:一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理, BIO是面向流的,NIO是面向缓冲区的;BIO的各种流是阻塞的。而NIO是非阻塞的;BIO的Stream是单向的,而NIO的channel是双向的。 NIO的特点:事件驱动模型、单线程处理多任务、非阻塞I/O,I/O读写不再阻塞,而是返回0、基于block的传输比基于流的传输更高效、更高级的IO函数zero-copy、IO多路复用大大提高了Java网络应用的可伸缩性和实用性。基于Reactor线程模型。 在Reactor模式中,事件分发器等待某个事件或者可应用或个操作的状态发生,事件分发器就把这个事件传给事先注册的事件处理函数或者回调函数,由后者来做实际的读写操作。如在Reactor中实现读:注册读就绪事件和相应的事件处理器

Java BIO NIO 与 AIO

 ̄綄美尐妖づ 提交于 2020-04-27 04:14:24
回顾 上一章我们介绍了操作系统层面的 IO 模型。 阻塞 IO 模型。 非阻塞 IO 模型。 IO 复用模型。 信号驱动 IO 模型(用的不多,知道个概念就行)。 异步 IO 模型。 并且介绍了 IO 多路复用的底层实现中,select,poll 和 epoll 的区别。 几个概念 我们在这里在强调一下几个概念。 一个 IO 操作的具体步骤: 对于操作系统来说,进程是没有直接操作硬件的权限的,所以必须请求内核来帮忙完成。 等待数据准备好,对于一个套接字上得操作,这一步骤关系到数据从网络到达,并将其复制到内核某个缓冲区。 将数据从内核缓冲区复制到进程缓冲区。 同步和异步的区别在于第二个步骤是否阻塞,如果从内核缓冲区复制到用户缓冲区的过程阻塞,那么就是同步 IO,否则就是异步 IO。所以上面提到的前四种 IO 模型都是同步 IO,最后一种是异步 IO。 阻塞和非阻塞的区别在于第一步,发起 IO 请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞 IO,否则就是非阻塞 IO。所以上面提到的第一种 IO 模型是阻塞 IO,其余的都是非阻塞 IO。 Java IO API 介绍完操作系统层面的 IO 模型,我们来看看,Java 提供的 IO 相关的 API。 Java 中提供三种 IO 操作的 API,阻塞 IO(BIO,同步阻塞),非阻塞 IO(NIO,同步非阻塞)和异步 IO (AIO

NIO selector多路复用器

十年热恋 提交于 2020-04-27 02:21:34
基本流程与C语言一样: socket 设置非阻塞、bind绑定端口、listen监听连接、epoll_create、添加socket到epoll监听EPOLLIN、epoll_wait等待连接事件就绪的连接 accpet新连接。得到socket且设置非阻塞、添加到epoll监听EPOLLIN 新的socket EPOLLIN事件就绪。读取数据。 如果程度是 -1 说明客户端关闭连接。JAVA中需要调用 channel.cancel() 否则是正常数据输入 selectionKey.remove() public void testScannerServer() throws IOException { System.out.println("服务端开启"); ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); // 非阻塞 serverSocketChannel.configureBlocking(false); serverSocketChannel.bind(new InetSocketAddress(8092)); Selector selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey

Linux性能优化实战学习笔记:第三十五讲

冷暖自知 提交于 2020-04-26 22:36:24
一、上节回顾 前面内容,我们学习了 Linux 网络的基础原理以及性能观测方法。简单回顾一下,Linux网络基于 TCP/IP 模型,构建了其网络协议栈,把繁杂的网络功能划分为应用层、传输层、网络层、网络接口层等四个不同的层次,既解决了网络环境中设备异构的问题,也解耦了网络协议的复杂性。 基于 TCP/IP 模型,我们还梳理了 Linux 网络收发流程和相应的性能指标。在应用程序通过套接字接口发送或者接收网络包时,这些网络包都要经过协议栈的逐层处理。我们通常 用带宽、吞吐、延迟、PPS 等来衡量网络性能。 今天,我们主要来回顾下经典的 C10K 和 C1000K 问题,以更好理解 Linux 网络的工作原理,并进一步分析,如何做到单机支持 C10M 注意,C10K 和 C1000K 的首字母 C 是 Client 的缩写。C10K 就是单机同时处理 1 万个请求(并发连接 1 万)的问题,而 C1000K 也就是单机支持处理 100 万个请求(并发连接100 万)的问题。 二、C10K C10K 问题最早由 Dan Kegel 在 1999 年提出。那时的服务器还只是 32 位系统,运行着Linux 2.2 版本(后来又升级到了 2.4 和 2.6,而 2.6 才支持 x86_64),只配置了很少的 内存(2GB)和千兆网卡。 1、怎么在这样的系统中支持并发 1 万的请求呢? 1

实践《TCP/IP网络编程》PDF+代码+《图解TCP/IP》PDF+对比分析

泄露秘密 提交于 2020-04-26 17:04:30
我认为,在初学编程阶段,任何让代码更健壮的部分都是对初学者的一个藩篱。只有只剩骨架的代码,才能明白编程的步骤 和结构。 学习计算机网络、TCP/IP网络编程,建议学习《TCP/IP网络编程》,只讲骨架,是非常适合初学者学习的,对网络编程的讲解 清晰直白,完全适合新手入门,写出了网络编程的每一个步骤,而且代码没有添加过多的异常处理以及其他让代码更健壮的 部分。 实践学习: 《TCP/IP网络编程》PDF,421页,带目录,文字可复制。配套源代码。尹圣雨 著,金国哲 译。 下载: https://pan.baidu.com/s/1Y9m9NwcakSJg_gKuxjIFCg 提取码: 55q4 《TCP/IP网络编程》共三部分,25章内容。 第一部分主要介绍网络编程基础知识。此部分主要论述Windows和Linux平台网络编程必备基础知识,未过多涉及不同操作系 统特性。 第二部分和第三部分与操作系统有关。第二部分主要是Linux相关内容,而第三部分主要是Windows相关内容。从事Windows 编程的朋友浏览第二部分内容后,同样可以提高技艺。 第四部分对全书内容进行总结,包含了作者在自身经验基础上总结的学习建议。 不局限于简单的背书式网络编程,且在最后的推荐进阶学习中再次强调了系统编程的重要。兼顾了Linux与Windows平台,讲 了select、epoll、组播等内容

Linux IO模式及 select、poll、epoll详解

时光怂恿深爱的人放手 提交于 2020-04-26 12:21:57
一、前言 注:本文是对众多博客的学习和总结,可能存在理解错误。请带着怀疑的眼光,同时如果有错误希望能指出。 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。 二、概念说明 在进行解释之前,首先要说明几个概念: 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 I/O 2.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。 2.2 进程切换 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行,这种行为被称为进程切换。因此可以说

nginx配置详解【转载】

一笑奈何 提交于 2020-04-24 22:52:16
序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。 Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。 Nginx的稳定性、功能集、示例配置文件和低系统资源的消耗让他后来居上,在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。 牛逼吹的差不多啦,如果你还不过瘾,你可以百度百科或者一些书上找到这样的夸耀,比比皆是。 Nginx常用功能 1、Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。 这里我给来2张图,对正向代理与反响代理做个诠释,具体细节,大家可以翻阅下资料。 Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。 2、负载均衡

华为程序员Java开发十年,精心整理了一套深入浅出Nginx文档

纵饮孤独 提交于 2020-04-24 12:06:39
Nginx是什么? Nginx是一个开源且高性能、可靠的HTTP中间件、代理服务 其他的HTTP服务: HTTPD-Apache基金会 IIS-微软 GWS-Google(不对外开放) 近几年,Nginx的市场占有率越来越高,一度飙升,为什么呢?接下来我们就知道了! 我们为什么选择Nginx? 1. IO多路复用epoll(IO复用) 如何理解呢?举个例子吧! 有A、B、C三个老师,他们都遇到一个难题,要帮助一个班级的学生解决课堂作业。 老师A采用从第一排开始一个学生一个学生轮流解答的方式去回答问题,老师A浪费了很多时间,并且有的学生作业还没有完成呢,老师就来了,反反复复效率极慢。 老师B是一个忍者,他发现老师A的方法行不通,于是他使用了影分身术,分身出好几个自己同一时间去帮好几个同学回答问题,最后还没回答完,老师B消耗光了能量累倒了。 老师C比较精明,他告诉学生,谁完成了作业举手,有举手的同学他才去指导问题,他让学生主动发声,分开了“并发”。 这个老师C就是Nginx。 轻量级 功能模块少 - Nginx仅保留了HTTP需要的模块,其他都用插件的方式,后天添加 代码模块化 - 更适合二次开发,如阿里巴巴Tengine CPU亲和 把CPU核心和Nginx工作进程绑定,把每个worker进程固定在一个CPU上执行,减少切换CPU的cache miss,从而提高性能。