一个、select

方式作为收集,最多只能监控1024描述叙事断裂的文件,内部使用位操作,相应的位置1或设置0,必须是可读、可写、三类除单独的事件,内部查询方法。将全部的套接字从内核到用户空间之间进行拷贝。

二、poll

比select略微好一点,也是在指定时间内轮询一定数量的文件描写叙述符。以測试当中是否有就绪。

三、epoll_wait

把用户关心的文件描写叙述符上事件放在内核里的一个事件表中从而无需像select和poll那样每次调用都要反复传入文件描写叙述符集或者事件集。

epoll_wait函数假设检測到事件,就将全部就绪的时间从内核时间表中拷贝到它的第二个參数events指向的数组中,这个数组适用于输出epoll_wait检測到内核见到的就绪事件,这就极大地提高了应用程序索引就绪文件描写叙述符的效率。

事实上他的内部是一个红黑树和一个链表。红黑树中国记录了epoll_wait所关注的事件,当某一个描写叙述符上有事件发生事,就会触发一个回调,这个描写叙述符就会被加入到链表中。这个链表就是须要返回个用户空间的描写叙述符,所以每次从内核到用户空间中的传输描写叙述符的个数并非非常多。

LT和ET模式。

LT是电平触发模式,ET是边缘触发模式,默认情况下。使用LT模式,可是ET是高效的模式。

在某一个描写叙述符上可读或者可写时。用户空间開始读写,用户空间没有将缓冲区中的数据读完,那么在LT模式下回继续触发,在ET模式下仅仅触发一次。

EPOLLONESHOT事件

即使我们使用ET模式。一个socket上的某个事件还是可能被触发多次。这在并发程序中就会引起一个问题,比方一个县城或者进程读取完某个socket上的数据后開始处理这些数据。而在数据的处理过程中该socket上又有新数据可读(EPOLLIN再次被触发),此时另外一个线程被唤醒来读取这些新的数据,于是就出现了两个线程同一时候操作一个socket的局面。

这当然不是我们期望的。我们期望的是一个socket连接再任一时刻都仅仅被一个线程处理。这一点能够使用epoll的EPOLLONESHOT事件处理。

对于注冊了EPOLONESHOT事件的文件描写叙述符,操作系统最多触发其上注冊的一个可读 可写或者异常事件,这样,当一个在处理某个socket时,其它线程是不可能有机会操作该socket的。可是反过来思考,注冊了EPOLLONESHOT事件的socket一旦被某个线程处理完成,该线程就应该马上重置这个socket上的EPOLLONESHOT事件,以确保这个socket下一次可读时,其EPOLLIN事件能被触发。进而让其它工作线程有机会继续处理这个socket

四、上述三种I/O复用的差别

select的參数类型fd_set没有将文件描写叙述符和事件绑定,它不过一个文件描写叙述符的集合,因此select须要提供3个这样的类型的參数来分别传入和输出可读可写异常事件,这一方面使得select不能处理很多其它类型的数据按,因为内核对fd_set集合的在线改动。应用程序下次调用select前不得不重置这3个fd_set集合,poll的參数类型pollfd。他把文件描写叙述符和事件都定义在当中,不论什么事件都被统一管理,内核每次改动的是pollfd结构体的revents成员。二events成员保持不变,因此下次调用poll时应用程序无需重置pollfd类型的事件集參数。因为每次select和poll调用都返回真个用户注冊的事件集合,所以应用程序索引就绪文件描写叙述符的时间复杂度就是O(n),epoll在内核中维护了一个事件表,採用了一个独立的系统调用epoll_ctl来控制往当中加入
删除 改动时间,这样。每次epoll_wait调用都直接从内核事件表中取得用户注冊的时间。而无需重复从用户空间读入这些事件。epoll_wait系统调用的event參数仅用来返回就绪事件,这使得应用程序索引就绪文件描写叙述符的时间复杂度达到O(1).

从原理上将。select和poll採用的都是轮询的房还是,即每次调用都要扫描真个注冊文件描写叙述符结合,并将当中就绪的文件描写叙述符返回给用户程序,因此他们检測就绪事件的算法复杂度为O(n),epoll_wait採用回调的方式,内核检測到就绪的文件描写叙述符时,将触发回调函数。回调函数就将该文件描写叙述符上相应的时间插入内核就绪事件队列,内核最后在适当的时机将就绪事件队列中的内容复制到用户空间。因此epoll_wait无需轮询整个文件描写叙述符集合来检測哪些事件已经就绪,其算法事件复杂度为O(1).

五、非堵塞connect

当调用connect时,可能会出现下面三种错误:

ECONNERFUSED 目标port不存在,连接拒绝

ETIMEDOUT 连接超时

EINPROGRESS 这样的发生错误在对非堵塞的socket调用connect,而连接又没有马上建立时,在这样的情况下,我们能够调用slect poll epoll_wait等函数来监听这个连接失败的socket上的可写事件。当select poll函数返回后,再利用getsockopt来读取错误码并清除该socket上的错误。假设错误码为0,表示连接成功建立,否则连接失败。

就是在连接失败而且错误是EINPROGRESS时,立即使用一个I/O复用函数监听这个套接字 返回之后查看错误信息

这样的方法存在几处移植性问题。首先。非堵塞的socket可能导致connect始终失败,其次。select对处于EINPROGRESS状态下的socket可能不起作用,最后。对于出错的socket ,getsockeiopt在某些系统上的回报-1。在一些系统返回0,。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

高性能网络server--I/O复 select poll epoll_wait之间的差的更多相关文章

  1. 高性能网络服务器--I/O复用 select poll epoll_wait之间的区别

    一.select select采用的是集合的方式,最多只能访问1024个套接字.可读,可写,异常,三种访问,并且采用的是轮训的方式进行每次访问都需要从内核向用户空间拷贝 二.poll poll采用的是 ...

  2. select poll epoll之间的区别

    1.select poll每次循环调用时都需要将文件描述符和事件拷贝到内核空间,epoll只需要拷贝一次: (这种情况在对于描述符数量不大的情况下还可以,但是当描述符的数量达到十几万甚至上百万的时候, ...

  3. I/O复用中的 select poll 和 epoll

    I/O复用中的 select poll 和 epoll: 这里有一些不错的资料: I/O多路复用技术之select模型: http://blog.csdn.net/nk_test/article/de ...

  4. I/O多路复用之select,poll,epoll简介

    一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回 ...

  5. 聊聊select, poll 和 epoll_wait

    聊聊select, poll 和 epoll 假设项目上需要实现一个TCP的客户端和服务器从而进行跨机器的数据收发,我们很可能翻阅一些资料,然后写出如下的代码. 服务端 客户端 那么问题来了,如果有一 ...

  6. 多进程、协程、事件驱动及select poll epoll

    目录 -多线程使用场景 -多进程 --简单的一个多进程例子 --进程间数据的交互实现方法 ---通过Queues和Pipe可以实现进程间数据的传递,但是不能实现数据的共享 ---Queues ---P ...

  7. Python自动化 【第十篇】:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO

    本节内容: 多进程 协程 事件驱动与Select\Poll\Epoll异步IO   1.  多进程 启动多个进程 进程中启进程 父进程与子进程 进程间通信 不同进程间内存是不共享的,要想实现两个进程间 ...

  8. Linux下select, poll和epoll IO模型的详解

    http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll 介绍 Epoll 可是当前在 Linux 下开发大规模并发网络程序的热 ...

  9. select, poll, epoll的实现分析

    select, poll, epoll都是Linux上的IO多路复用机制.知其然知其所以然,为了更好地理解其底层实现,这几天我阅读了这三个系统调用的源码. 以下源代码摘自Linux4.4.0内核. 预 ...

随机推荐

  1. 直接插入排序---java实现

    思路:遍历无序的原数组,把第i个的后一个即i+1去与前面的i个逐个比较... 解法一: package com.sheepmu.text; import java.util.Arrays; /* * ...

  2. 【C语言】推断一个数的奇偶(位操作)

    //推断一个数的奇偶 #include <stdio.h> int is_signal(int num) { if (num & 1) return 1; else return ...

  3. 有人实践过 Phabricator 以及 Arcanist 作为 code review 的工具么?(转)

    作者:覃超链接:http://www.zhihu.com/question/19977889/answer/13539702来源:知乎 平时就经常实践. 整个公司的code review就是使用这个. ...

  4. ios 多线程开发(二)线程管理

    线程管理 iOS和OS X中每一个进程(或程序)由一个或多个线程组成.程序由一个运行main方法的线程开始,中间可以产生其他线程来执行一些指定的功能. 当程序产生一个新线程后,这个线程在程序进程空间内 ...

  5. Apache Commons Math3学习笔记(2) - 多项式曲线拟合(转)

    多项式曲线拟合:org.apache.commons.math3.fitting.PolynomialCurveFitter类. 用法示例代码: // ... 创建并初始化输入数据: double[] ...

  6. Bash多个配置文件通常用于

    Login shells阅读下面的启动文件: 文件 内容 /etc/profile 对全部用户开放的全局配置文件 ~/.bash_profile 某个用户个人的启动文件,能用作个人的全局设置 ~/.b ...

  7. js便签笔记(13)——jsonp事实上非常easy【ajax跨域请求】

    前两天被问到ajax跨域怎样解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了很多资料,原来如此.. . 为何一直知道jsonp,但一直迷迷糊糊的不明 ...

  8. 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 print-all-combinations-of-given-length

    // 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 /* Input: set[] = {'a', 'b'}, k = 3 Output: aaa aab aba ...

  9. LAN远程重启server安全方法

    原创文章.转载请注明出处.(百度经验:http://jingyan.baidu.com/article/454316abaadc41f7a7c03a13.html) 在局域网中,管理和操作server ...

  10. Android笔记 之 旋转木马的音乐效果

    一.前言-- 大家一定在百度音乐上在线听过歌,有没有注意到那个旋转唱片-- 就上面那个,当音乐在播放的时候,那个光碟轮子在转,就想旋转木马一般.感觉好好玩啊. 碰巧想起前阵子做音乐播放器,哎,那这个也 ...