要了解epoll模型,就要一个一个知识点由浅至深地去探索。

1.IO复用技术

IO流请求操作系统内核,有串行处理和并行处理两种概念。

串行处理是前面一个操作处理地时候,后面的所有操作都需要等待。因此,必须考虑以并行处理的方式来完成整个IO流的请求,实现最大的并发和吞吐。这里就用到了IO复用技术。

IO复用技术就是让一个Socket来做复用完成整个IO流的请求。实现IO流的请求其中一种方式就是多线程,但是多线程会占用大量资源,不便于管理,因此又出现了IO多路复用技术。

2.IO多路复用技术

IO多路复用是指多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这里的复用指的是复用同一个线程。

对操作系统内核而言,多路复用其实是要完成操作系统IO的请求,对于IO文件的请求,当一个IO流要进行对应的文件处理的时候,要获取一组文件的描述符,当文件描述符还没就绪的时候,它就一直在等待,直到描述符就绪,就马上上报系统的一个通知的机制,以此来告诉主应用程序它已经准备就绪了,你可以来操作了。这种方式就是IO多路复用方式。

3.IO多路复用技术的实现

IO多路复用技术的实现方式有select、poll和epoll,它们都是linux内核下的常见多路复用模型。

其中最早出现的是select模型。

4.select模型

多路复用其实就是内核态对IO请求的时候,会主动地发送所需要处理的文件对象就绪时文件的就绪信息给应用端,应用端在FD(File Description)没有就绪之前都是block,也就是阻塞对应的Socket请求,也会维护一个FD的列表。当内核态发送可用的信息,FD就绪之后,应用端采用select这种模式,会一直在遍历所维护的FD文件描述符的列表,以等到唤醒对应的线程完成对应的数据拷贝。select模型能够监视文件描述符的数量存在最大限制,且在整个过程中,select模型采用的是线性遍历的模式,这种模式效率低下。

5.epoll模型

epoll模型优化和完善了select模式的缺点,每当FD就绪,采用系统的回调函数直接将FD放入,效率高,无监视文件描述符的数量限制。

6.epoll模型的原理

设想一个场景:有100万用户同时与一个进程保持着TCP连接,而每一时刻只有几十个或几百个TCP连接是活跃的(接收到TCP包),也就是说,在每一时刻,进程只需要处理这100万个连接中的一小部分连接。那么,如何才能高效地处理这种场景呢?进程是否在每次询问操作系统收集有事件发生的TCP连接时,把这100万个连接告诉操作系统,然后由操作系统找出其中有事件发生的几百个连接呢?实际上,在Linux内核2.4版本之前,select或poll事件驱动模型就是这样处理的。

这里有个非常明显的问题,即在某一时刻,进程收集有事件的连接时,其实这100万连接中的大部分是没有事件发生的。因此,如果每次收集事件时,都把这100万连接的套接字传给操作系统(这首先就是用户态内存到内核态内存的大量复制),而由操作系统内核寻找这些连接上有没有未处理的事件,将会是巨大的资源浪费,然而select和poll就是这样做的,因此它们最多只能处理几千个并发连接。

而epoll就厉害了,它会在Linux内核中申请一个简易的文件系统,把原先的一个select或poll调用分成了3个部分:

1.调用epoll_create创建一个epoll对象(在epoll文件系统中给这个句柄分配资源,一棵红黑树和一个准备就绪list链表)。

2.调用epoll_ctl向epoll对象中添加这100万个连接的套接字。就是把socket放到红黑树上,给内核中断处理程序注册一个回调函数,然后告诉内核如果这个句柄的中断到了,就把这个socket放到准备就绪list链表里。

3.调用epoll_wait收集发生事件的TCP连接。到准备就绪list链表中处理socket,并把数据返回给用户。

这样,只需要在进程启动的时候建立1个epoll对象,并在需要的时候向它添加或删除连接即可。因此在实际收集事件时,epoll_wait的效率会非常高,因为调用epoll_wait时并没有向它传递这100万个连接,内核也不需要去遍历所有的连接,只需要到就绪list链表中去处理socket就行了。

"曾经以为拥有一点点可能的人,终究还是不可能。"

nginx中的epoll模型的更多相关文章

  1. Nginx 所使用的 epoll 模型是什么?

    对于 Nginx,相信有过 Web 服务部署经验的同学都不陌生,它有以下特点: 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 相较于 A ...

  2. Nginx源码研究三:Epoll在NGINX中的使用

    Web服务器在面对高并发的情况下,网络的IO一般选择IO复用,像apache选择的Select/poll.Nginx在linux 2.6后选择Epoll做网路IO,提高了WEB服务的并发能力. 在本章 ...

  3. nginx中时间的管理

    nginx出于性能考虑採用类似lib_event的方式,自己对时间进行了cache,用来降低对gettimeofday()的调用,由于一般来说server对时间的精度要求不是特别的高,只是假设须要比較 ...

  4. Nginx 中 nginx.conf 详解

    #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全局错误日志定义类型,[ debug | ...

  5. 并发编程-epoll模型的探索与实践

    前言 我们知道nginx的效率非常高,能处理上万级的并发,其之所以高效离不开epoll的支持, epoll是什么呢?,epoll是IO模型中的一种,属于多路复用IO模型; 到这里你应该想到了,sele ...

  6. nginx中使用srcache_nginx模块构建缓存

    nginx中可以将lua嵌,让nginx执行lua脚本,可以处理高并发,非阻塞的处理各种请求,openresty项目中可以使用nignx可以直接构建 srcache_nginx + redis 缓存, ...

  7. Epoll模型详解

    Linux 2.6内核中提高网络I/O性能的新方法-epoll I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数. 1.为什么select落后    首先,在Lin ...

  8. 【转】select和epoll模型的差异

    http://www.cppblog.com/converse/archive/2008/10/12/63836.html epoll为什么这么快 epoll是多路复用IO(I/O Multiplex ...

  9. linux epoll模型

    原文:http://yjtjh.blog.51cto.com/1060831/294119 Linux I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数.Linux ...

随机推荐

  1. .Net中Log4Net的使用

    2018-08-23 .Net中Log4Net的使用 一.log4net 分类型记录日志存放多个日志文件 1.在webconfig里添加配置 1.1 在<configSections> 中 ...

  2. Java开发笔记(四十六)类的构造方法

    前面介绍了如何定义一个简单的类,以及它的成员属性和成员方法,从示例代码可以看到,不管是OrangeSimple还是OrangeMember,都要先利用关键字new创建一个实例,然后才能通过实例名称访问 ...

  3. MySQL高级特性——绑定变量

    从MySQL 4.1 版本开始,就支持服务器端的绑定变量,这大大提高了客户端和服务器端数据传输的效率 介绍 当创建一个绑定变量 SQL 时,客户端会向服务器发送一个SQL语句的原型.服务器端收到这个S ...

  4. JavaWeb - 模仿SpringMVC抽取 BaseServlet + 封装表单参数

    模仿SpringMVC抽取一个BaseServlet,接收所有请求,然后自动封装表单参数和分发到对应的servlet执行,下面用一个页面表单提交,转发显示的项目做示例. 1)首先准备一个Entity, ...

  5. JavaScript(三)

    本文转载自:https://blog.csdn.net/xiaogeldx/article/details/85455011 JavaScript的math对象 math方法 sqrt:开方 abs: ...

  6. ArcGIS 网络分析[1] 利用自定义点线数据(shp或数据库)创建网络数据集【小白向】

    前言 似乎除了官方介绍的例子,我还没有在网上见过一篇介绍如何“使用自己的数据”创建“网络数据集”的文章. 究其原因,是因为当前的高质量的线数据或保密,或采集困难. 有介绍几何网络的,有介绍如何用官方S ...

  7. asyncio异步IO--协程(Coroutine)与任务(Task)详解

    摘要:本文翻译自Coroutines and Tasks,主要介绍asyncio中用于处理协程和任务的方法和接口.在翻译过程中,译者在官方文档的基础上增加了部分样例代码和示意图表,以帮助读者对文档的理 ...

  8. 智能POS常见问题整理

    智能POS预警值为小于所设的数量,H5就会变为锁定状态 智能POS查看数据库方法: 商米D1:设置-存储设备和USB-内部存储设备-浏览-winboxcash tablet.db为智能POS数据库 W ...

  9. SQL 创建分区表

    (以项目中实际使用的GNSS库为例) 背景:数据量巨大,定时创建月表存放数据,月表中数据存放在不同的文件组中来提高查询效率   一.创建数据库,添加文件组 除了逻辑文件和物理文件的分离之外,SQL S ...

  10. c/c++ 网络编程 UDP 改变IP地址

    网络编程 UDP 改变IP地址 在程序里动态改变主机的IP地址 1,改变ipv4的地址 #include <stdio.h> #include <string.h> #incl ...