epoll模型

彻底搞懂 netty 线程模型

笑着哭i 提交于 2019-12-04 17:23:09
编者注:Netty是Java领域有名的开源网络库,特点是高性能和高扩展性,因此很多流行的框架都是基于它来构建的,比如我们熟知的Dubbo、Rocketmq、Hadoop等。本文就netty线程模型展开分析讨论下 : ) IO模型 BIO:同步阻塞IO模型; NIO:基于IO多路复用技术的“非阻塞同步”IO模型。简单来说,内核将可读可写事件通知应用,由应用主动发起读写操作; AIO:非阻塞异步IO模型。简单来说,内核将读完成事件通知应用,读操作由内核完成,应用只需操作数据即可;应用做异步写操作时立即返回,内核会进行写操作排队并执行写操作。 NIO和AIO不同之处在于应用是否进行真正的读写操作。 reactor和proactor模型 reactor:基于NIO技术,可读可写时通知应用; proactor:基于AIO技术,读完成时通知应用,写操作应用通知内核。 netty线程模型 netty的线程模型是基于Reactor模型的。 netty单线程模型 Reactor 单线程模型,是指所有的 I/O 操作都在同一个 NIO 线程上面完成的,此时NIO线程职责包括:接收新建连接请求、读写操作等。 在一些小容量应用场景下,可以使用单线程模型( 注意,Redis的请求处理也是单线程模型,为什么Redis的性能会如此之高呢?因为Redis的读写操作基本都是内存操作,并且Redis协议比较简洁

nginx配置优化提高并发量

有些话、适合烂在心里 提交于 2019-12-04 15:27:23
1 nginx配置优化提高并发量 worker_processes 2; 这个按照CPU的核数来决定 2 worker_connections 65535; 这个一般设置65535即可 每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections。 3 keepalive_timeout 60; keepalive 设置超时时间 一般设置60 4. use epoll; 使用epoll 的I/O 模型 来源: https://www.cnblogs.com/newmiracle/p/11871487.html

聊聊C10K问题及解决方案

*爱你&永不变心* 提交于 2019-12-03 07:04:30
#0 系列目录# 聊聊远程通信 Java远程通讯技术及原理分析 聊聊Socket、TCP/IP、HTTP、FTP及网络编程 RMI原理及实现 RPC原理及实现 轻量级分布式 RPC 框架 使用 RMI + ZooKeeper 实现远程调用框架 深入浅出SOA思想 微服务、SOA 和 API对比与分析 聊聊同步、异步、阻塞与非阻塞 聊聊Linux 五种IO模型 聊聊IO多路复用之select、poll、epoll详解 聊聊C10K问题及解决方案 #1 C10K问题# 大家都知道 互联网的基础就是网络通信 ,早期的互联网可以说是一个小群体的集合。互联网还不够普及,用户也不多。一台服务器同时在线100个用户估计在当时已经算是大型应用了。所以并不存在什么C10K的难题。互联网的爆发期应该是在www网站,浏览器,雅虎出现后。最早的互联网称之为Web1.0,互联网大部分的使用场景是下载一个Html页面,用户在浏览器中查看网页上的信息。这个时期也不存在C10K问题。 Web2.0时代到来后就不同了,一方面是普及率大大提高了,用户群体几何倍增长。另一方面是互联网不再是单纯的浏览万维网网页,逐渐开始进行交互,而且应用程序的逻辑也变的更复杂,从简单的表单提交,到即时通信和在线实时互动。C10K的问题才体现出来了。 每一个用户都必须与服务器保持TCP连接才能进行实时的数据交互

epoll反应堆模型代码

匿名 (未验证) 提交于 2019-12-02 23:57:01
libevent函数库核心思想 /*** epoll_loop.c ***/ #include <stdio.h> #include <sys/epoll.h> #include <sys/socket.h> #include <arpa/inet.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include <time.h> #define MAX_EVENTS 2014 #define BUFLEN 4096 #define SERV_PORT 8080 void recvdata ( int fd , int events , void * arg ); void senddata ( int fd , int events , void * arg ); struct myevent_s { int fd ; int events ; void * arg ; void (* call_back )( int fd , int events , void * arg ); int status ; char buf [ BUFLEN ]; int len ; long last_active ; }; int g

python 并发编程之异步IO

匿名 (未验证) 提交于 2019-12-02 22:51:30
关于异步的一些基本了解请 参考这篇文章 , 或者 内核态和用户态 由于需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,或者获取外围设备的数据,操作系统划分出两个权限等级:用户态和内核态。 内核态:当一个任务(进程)执行系统调用而陷入内核代码中执行时,称进程处于内核运行态(内核态)。 用户态:当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。 五种 IO 模型中, IO 复用的技术较为成熟,因此使用也比较广泛。而最为理想的是异步 IO,整个过程没有阻塞,而且有通知。 IO 多路复用模型有三种:select poll epoll,它们的性能是层层递增。 2.1 select sokect 是通过一个 select() 系统调用来监视多个文件描述符,当 select() 返回后,该数组中就绪的文件描述符便会被该内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。 select 的优点是支持跨平台,缺点在于单个进程能够监视的文件描述符的数量存在最大限制。 另外 select() 所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟使得大量 TCP 连接处于非活跃状态,但调用 select() 会对所有 socket 进行一次线性扫描,所以这也浪费了一定的开销。 文件描述符 fd

epoll模型详解

若如初见. 提交于 2019-11-30 10:30:53
首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。 不管是文件,还是套接字,还是管道,我们都可以把他们看作流。 之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现在假定一个情形,我们需要从流中读数据, 但是流中还没有数据,(典型的例子为,客户端要从socket读如数据,但是服务器还没有把数据传回来),这时候该怎么办? 阻塞:阻塞是个什么概念呢?比如某个时候你在等快递,但是你不知道快递什么时候过来,而且你没有别的事可以干(或者说接下来的事要等快递来了才能做);那么你可以去睡觉了,因为你知道快递把货送来时一定会给你打个电话(假定一定能叫醒你)。 非阻塞忙轮询:接着上面等快递的例子,如果用忙轮询的方法,那么你需要知道快递员的手机号,然后每分钟给他挂个电话:“你到了没?” 很明显一般人不会用第二种做法,不仅显很无脑,浪费话费不说,还占用了快递员大量的时间。 大部分程序也不会用第二种做法,因为第一种方法经济而简单,经济是指消耗很少的CPU时间,如果线程睡眠了,就掉出了系统的调度队列,暂时不会去瓜分CPU宝贵的时间片了。 为了了解阻塞是如何进行的,我们来讨论缓冲区,以及内核缓冲区,最终把I/O事件解释清楚。缓冲区的引入是为了减少频繁I/O操作而引起频繁的系统调用 (你知道它很慢的)

高级IO

有些话、适合烂在心里 提交于 2019-11-28 06:24:22
高级IO: 五种IO模型:阻塞IO; 非阻塞IO; 信号驱动IO;异步IO;多路转接IO IO操作分为两个过程:等待/数据拷贝 阻塞IO: 发起IO调用后,若不具备IO条件,则等待IO条件具备,拷贝数据后返回 非阻塞IO: 发起IO调用后,若不具备IO条件,则立即报错返回,若具备IO条件则立即拷贝数据后返回 信号驱动IO: 先定义IO信号处理,若IO条件具备则直接信号通知进程,发起调用,拷贝数据后返回 异步IO: 先定义IO信号处理,发起异步IO调用,直接返回。让别人进行IO等待,等待IO条件具备后拷贝数据 (与信号驱动的区别是拷贝数据是由别人来完成的)信号通知进程IO完成 ** 阻塞:为了完成功能发起调用,如果当前不具备完成条件,则一直等待,直到完成后返回。 非阻塞:为了完成功能发起调用,如果当前不具备完成条件,直接报错返回;通常需要循环处理 阻塞与非阻塞:调用功能当前不具备完成条件是否立即返回。 同步:为了完成功能发起调用,如果当前不具备完成条件,则自己等待完成功能后返回 异步:为了完成功能发起调用,但是功能由别人来完成 同步与异步的区别:功能是否由自己来完成 同步操作通常都是阻塞操作 异步包含两种: 异步阻塞操作:等待别人完成操作 异步非阻塞操作:不等待别人完成操作 同步与异步的优缺点: 同步:流程控制简单,但是效率相对较低 异步:流程控制较难,但是效率相对较高 多路转接IO

深入理解Android消息机制

时光毁灭记忆、已成空白 提交于 2019-11-26 15:53:23
在日常的开发中,Android 的消息机制作为系统运行的根本机制之一,显得十分的重要。 从 Handler 发送消息开始 查看源码,Handler的post、send方法最终都会走到 代码 public final boolean sendMessageDelayed(Message msg, long delayMillis) { if (delayMillis < 0) { delayMillis = 0; } return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis); } sendMessageDelayed 会走到 代码 private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { msg.target = this; if (mAsynchronous) { msg.setAsynchronous(true); } return queue.enqueueMessage(msg, uptimeMillis); } 这里可以设置 Message 为异步消息 查看 queue 的 enqueueMessage 方法, 我们剥离出核心代码: 代码 if (p == null ||