要了解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. jQuery中关于全选、全不选和反选

    1.首先我们要获取当前点击的对象,然后得到点击事件,   判断他的状态如果是checked的话就把该第二行的选中,   否则就取消选中. 2.当第二列功能小项没有全部选中时,该行第一列的复选款也要取消 ...

  2. [Go] golang使用github里的imap类库

    1.在windows系统下,需要首先定义两个环境变量GOPATH和GOROOT, GOPATH是第三方类库的代码目录 , GOROOT是go的安装目录 2.按照我的定义 , 进入这个目录D:\gola ...

  3. Java开发笔记(四十四)本地日期时间与字符串的互相转换

    之前介绍Calendar的时候,提到日历实例无法直接输出格式化后的时间字符串,必须先把Calendar类型转换成Date类型,再通过格式化工具SimpleDateFormat获得字符串.而日期时间的格 ...

  4. 2018.12/17 function 的闭包

    1.闭包:函数在调用的时候会形成一个私有的作用域,对内部变量起到保护的作用,这就是闭包. 2.变量销毁: 1.人为销毁  var a=12; a=null 2.自然销毁  函数调用完成之后 浏览器会自 ...

  5. v8 GC机制

    1.为什么要分代 V8是Chrome浏览器的javascript解释器,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那 ...

  6. eclipse自定义工作区列表

    打开eclipse,在菜单栏上找到Window,点击Window--->Perspective--->Customize Perspective...,会看到 弹出来的一个窗口,然后点击最 ...

  7. Vue:如何在地图上添加自定义覆盖物(点)

    目录 如何在地图上添加自定义覆盖物(点) 首发日期:2019-1-25 如何在地图上添加自定义覆盖物(点) 此文重点是在地图上标点,所以就省去引入百度地图的步骤了. 先给一下最终的效果. 这个效果主要 ...

  8. 后台返回excel文件流,js下载

    /** 下载excel */ downloadExcel(data: Blob): void { var blob = new Blob([data], { type: 'application/vn ...

  9. Netty学习笔记(一) 实现DISCARD服务

    官方那个给出的介绍是:Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序.然后我们简单理解 ...

  10. 南京邮电大学java第四次实验报告

    实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 6 月 ...