精华内容
下载资源
问答
  • Linux IO模型漫谈(5)- IO复用模型之select - 轩脉刃 - 博客园 Linux IO模型漫谈(5)- IO复用模型之select - 轩脉刃 - 博客园 Linux IO模型漫谈(5)- IO复用模型之select 2012-06-07...

    Linux IO模型漫谈(5)- IO复用模型之select - 轩脉刃 - 博客园

        Linux IO模型漫谈(5)- IO复用模型之select
        2012-06-07 09:05 by 轩脉刃, 1177 阅读, 0 评论, 收藏, 编辑

        首先需要了解的是select函数:
        select函数

        #include<sys/select.h>

        #include<sys/time.h>

        int select (int maxfd , fd_set *readset ,fd_set *writeset, fd_set *exceptionset , const struct timeval * timeout);

        返回:就绪描述字的正数目,0——超时,-1——出错

        参数解释:

        maxfd: 最大的文件描述符(其值应该为最大的文件描述符字 + 1)

        readset: 内核读操作的描述符字集合

        writeset:内核写操作的描述符字集合

        exceptionset:内核异常操作的描述符字集合

        timeout:等待描述符就绪需要多少时间。NULL代表永远等下去,一个固定值代表等待固定时间,0代表根本不等待,检查描述字之后立即返回。

        注意:readset,writeset,exceptionset都是值-结果参数,意思就是他们传进入指针进去,函数根据指针可以修改对应的fd_set


    posted on 2013-03-22 10:48  lexus 阅读( ...) 评论( ...) 编辑 收藏

    转载于:https://www.cnblogs.com/lexus/archive/2013/03/22/2975030.html

    展开全文
  • 1.基本原理。 2.多路IO复用的流程。 3.多路IO复用的优势。 4.select()接口优缺点。 5.多路IO复用模型的问题。

    基本原理:

    多路IO复用的基本原理是有个函数(select、poll、epoll)会不断地轮询所负责的所有socket,当某个socket由数据到达了,就通知用户进程。

    多路IO复用的流程:

    多路IO复用
    当用户调用了select,那么整个进程会被阻塞,而同时,内核会“监视”select负责的所有socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从内核拷贝到用户进程。

    多路IO复用的优势:

    多路IO复用相比于阻塞IO的优势在于它可以同时处理多个连接。如果select()发现某句柄捕捉到了“可读事件”,服务器程序应及时做recv()操作,并根据接收到的数据准备好待发送数据,并将对应的句柄值加入writefds,准备下一次的“可写事件”的select()检测。同样,如果select()发现某句柄捕捉到“可写事件”,则程序应及时做send()操作,并准备好下一次的“可读事件”检测准备。

    select()接口优缺点:

    1. 相比于其他模型,使用select()的事件驱动模型只有单线程(进程)执行,占用资源少,不消耗太多CPU资源,同时能够为多客户端提供服务。如果试图建立一个简单的事件驱的服务器程序,这个模型有一定的参考价值。
    2. 但是,当需要探测的句柄值较大时,select()接口本身需要消耗大量时间去轮询各个句柄。如果需要实现更高效的服务器程序,则更推荐使用类似epoll这样的接口。

    多路IO复用模型的问题:

    该模型将事件探测事件响应夹杂在一起,一旦事件响应的执行体过于庞大,则对整个模型实灾难性的,可使用异步IO接口,如aio_read、aio_write。

    展开全文
  • 上文描述了最简易的非阻塞IO,采用的是轮询的方式,这节我们使用IO复用模型。 阻塞IO 过去我们使用IO复用与阻塞IO结合的时候,IO复用模型起到的作用是并发监听多个fd。 以简单的回射服务器为例,我们只监听了某fd...

    上文描述了最简易的非阻塞IO,采用的是轮询的方式,这节我们使用IO复用模型。

     

    阻塞IO

     

    过去我们使用IO复用与阻塞IO结合的时候,IO复用模型起到的作用是并发监听多个fd

    以简单的回射服务器为例,我们只监听了某fd是否可读,一旦fd有数据,我们立刻read,然后将其write给对方。

    在阻塞IO里面,我们总是认为fd是可写的。因为即使底层的IO缓冲区已满,稍微等待片刻即可。这与read卡在一个无数据的fd上是两种情况。所以从这个角度出发,是不需要监听fd的写事件的

    总之,在阻塞IO中,收到数据然后write,这二者是同时使用的。

     

    非阻塞IO

     

    到了非阻塞IO里面,事情就远远不是这么简单了。此时,IO绝不仅仅是并发监听fd。

    因为在这种情况下,如果某fd的write缓冲区满了,write会立刻返回-1,并且返回EWOULDBLOCK。所以数据的收和发未必可以同时进行,所以对于write操作,我们需要一个buffer来暂存数据。当fd可写时,才可以写入数据。

    对于read一端,同样需要一个buffer,原因是因为,在阻塞IO中,假设双方协定好处理分包问题,对方发过来一个len为4000,然后我们需要调用readn函数确保收到足够的4000字节,这其中由于网络的拥塞,readn内部可能需要调用多次read系统调用。所以这中间需要短暂的等待。

    到了非阻塞IO中,无法再使用readn反复调用read,否则就变成了轮询操作。如果数据收不满咋办?需要暂存起来,放到一个buffer中,由用户手工处理信息。

    综上,非阻塞IO的read和write端都需要buffer

    详细的叙述请参考muduo库作者陈硕的Muduo 设计与实现之一:Buffer 类的设计

     

    Buffer的设计

     

    Buffer肯定要有输入和输出,所以我设计buffer的格式如下:

    buffer1

    readindex表示要从Buffer中读取数据的起始位置。writeIndex则表示向Buffer中存放数据的起点。所以writeIndex – readIndex 是Buffer中数据的大小,而end – writeIndex 则表示Buffer中剩余的空间

    注意,每当buffer中的数据读完时,我们便重置指针,readIndex = writeIndex = begin

     

    使用非阻塞IO编写回射服务器的客户端

     

    这里的逻辑是:用户从stdin输入数据,然后发给sockfd,随后从sockfd接收数据,输出给stdout。

    所以这里我们要监听四次,stdin的读事件,sockfd的读和写事件,stdout的写事件。

    注意这里需要两个buffer,因为存在两个数据流

    stdin  -> Buffer –> sockfd

    sockfd –> Buffer –> stdout

    所以我们用到两个缓冲区:

    一个用于向sockfd发送数据。

    buffer2

    一个用于从sockfd接收数据。

    buffer3

     

    后续将持续讲解Non-Blocking IO,直到完成完整的客户端和服务端。

    未完待续。

    转载于:https://www.cnblogs.com/inevermore/p/4046283.html

    展开全文
  • Nginx采用的是多进程单线程和多路IO复用模型。使用了I/O多路复用技术的Nginx,就成了”并发事件驱动“的服务器。这里再强调下重点, 多进程单线程 多路IO复用模型 一、多进程单线程 Nginx 自己实现了对epoll的...

    Nginx现在是非常火爆的web服务器,她使用更少的资源,支持更多的并发连接数,她实现了linux的epoll模型,能够支持高达 50,000 个并发连接数的响应。Nginx采用的是多进程单线程和多路IO复用模型。使用了I/O多路复用技术的Nginx,就成了”并发事件驱动“的服务器。这里再强调下重点,

    • 多进程单线程
    • 多路IO复用模型

    一、多进程单线程

    Nginx 自己实现了对epoll的封装,是多进程单线程的典型代表。使用多进程模式,不仅能提高并发率,而且进程之间是相互独立的,一 个worker进程挂了不会影响到其他worker进程。

    master进程管理worker进程:

    1. 接收来自外界的信号。
    2. 向各worker进程发送信号。
    3. 监控woker进程的运行状态。
    4. 当woker进程退出后(异常情况下),会自动重新启动新的woker进程。

    注意worker进程数,一般会设置成机器cpu核数。因为更多的worker只会导致进程之间相互竞争cpu,从而带来不必要的上下文切换。

    二、IO多路复用模型epoll

    多路复用,允许我们只在事件发生时才将控制返回给程序,而其他时候内核都挂起进程,随时待命。

    epoll通过在Linux内核中申请一个简易的文件系统(文件系统一般用B+树数据结构来实现),其工作流程分为三部分:

    1. 调用 int epoll_create(int size)建立一个epoll对象,内核会创建一个eventpoll结构体,用于存放通过epoll_ctl()向epoll对象中添加进来的事件,这些事件都会挂载在红黑树中。
    2. 调用 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) 在 epoll 对象中为 fd 注册事件,所有添加到epoll中的事件都会与设备驱动程序建立回调关系,也就是说,当相应的事件发生时会调用这个sockfd的回调方法,将sockfd添加到eventpoll 中的双链表。
    3. 调用 int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout) 来等待事件的发生,timeout 为 -1 时,该调用会阻塞知道有事件发生。

    注册好事件之后,只要有fd上事件发生,epoll_wait()就能检测到并返回给用户,用户执行阻塞函数时就不会发生阻塞了。

    epoll()在中内核维护一个链表,epoll_wait直接检查链表是不是空就知道是否有文件描述符准备好了。顺便提一提,epoll与select、poll相比最大的优点是不会随着sockfd数目增长而降低效率,使用select()时,内核采用轮训的方法来查看是否有fd准备好,其中的保存sockfd的是类似数组的数据结构fd_set,key 为 fd,value为0或者1(发生时间)。

    能达到这种效果,是因为在内核实现中epoll是根据每 sockfd 上面的与设备驱动程序建立起来的回调函数实现的。那么,某个sockfd上的事件发生时,与它对应的回调函数就会被调用,将这个sockfd加入链表,其他处于“空闲的”状态的则不会。在这点上,epoll 实现了一个"伪"AIO。

    可以看出,因为一个进程里只有一个线程,所以一个进程同时只能做一件事,但是可以通过不断地切换来“同时”处理多个请求。

    例子:Nginx 会注册一个事件:“如果来自一个新客户端的连接请求到来了,再通知我”,此后只有连接请求到来,服务器才会执行 accept() 来接收请求。又比如向上游服务器(比如 PHP-FPM)转发请求,并等待请求返回时,这个处理的 worker 不会在这阻塞,它会在发送完请求后,注册一个事件:“如果缓冲区接收到数据了,告诉我一声,我再将它读进来”,于是进程就空闲下来等待事件发生。

    这样,基于 多进程+epoll, Nginx 便能实现高并发。

    三、worker进程工作流程

    当一个 worker 进程在 accept() 这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,一个完整的请求。一个请求,完全由worker进程来处理,而且只会在一个worker进程中处理。优点:

    1. 节省锁带来的开销。每个worker进程都彼此独立地工作,不共享任何资源,因此不需要锁。同时在编程以及问题排查上时,也会方便很多。
    2. 独立进程,减少风险。采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。当然,worker进程自己也能发生意外退出。

    四、对惊群效应的处理

    Nginx提供了一个accept_mutex这个东西,这是一个加在accept上的一把互斥锁。即每个worker进程在执行accept()之前都需要先获取锁,accept()成功之后再解锁。有了这把锁,同一时刻,只会有一个进程执行accpet(),这样就不会有惊群问题了。accept_mutex是一个可控选项,我们可以显示地关掉,默认是打开的。

    五、为什么nginx 采用多进程,而非多线程结构

    Nginx 要保证它的高可用 高可靠性, 如果Nginx 使用了多线程的时候,由于线程之间是共享同一个地址空间的,当某一个第三方模块引发了一个地址空间导致的断错时 (eg: 地址越界), 会导致整个Nginx全部挂掉; 当采用多进程来实现时, 往往不会出现这个问题.

    展开全文
  • IO复用模型epoll

    千次阅读 2018-09-18 10:59:53
    epoll是Linux多路复用IO接口select/poll的加强版,e对应的英文单词就是enhancement【增强】 定义:epoll是一种当文件描述符的内核缓冲区非空的时候,发出可读信号进行通知,当写缓冲区不满的时候,发出可写信号通知...
  • Nginx采用的是多进程单线程和多路IO复用模型。使用了I/O多路复用技术的Nginx,就成了”并发事件驱动“的服务器。这里再强调下重点, 多进程单线程 多路IO复用模型 一、多进程单线程 Nginx 自己实现了对epoll的....
  • 1.IO概念 IO(Input/Output,输入/输出)即数据的...IO有内存IO、网络IO和磁盘IO三种,通常说IO指的是后两种 Linux中进程无法直接操作I/O设备,必须通过系统调用请求kernel来协助完成I/O动作,内核会为I/O设备...
  • 网络IO复用模型

    2019-04-27 15:06:54
     如果是epoll模型,可以改用edge trigger,问题是如果漏掉了一次accept(2),程序在也不会收到新连接  准备一个空闲的描述符。遇到这种情况,先关闭这个空闲文件,获得一个文件描述符名额,再accept(2)拿到...
  • C++实现基于IO复用模型的echo服务器

    千次阅读 2015-08-09 17:32:33
    IO复用,即IO multiplexing,是使用select/poll/epoll这一系列的多路选择器,可使进程或线程能够处理多个连接;实质上不是复用IO,而是多个IO复用进程或线程; 编程模型 (1)单进程IO复用服务器,它适合IO...
  • 1. 什么是多路IO复用: 其实就是通过一种机制,可以监视多个描述符(Linux中一切皆文件,打开一个文件就需要一个文件描述符,同样,在套接字中建立一个连接也需要一个描述符,这个描述符在计算机中是有个数限制的)...
  • IO复用模型中多个socket在select中被阻塞了,当数据在内核中准备就绪的时候再去通知阻塞中的socket去真正调用read方法,这样跟用多线程去实用IO阻塞模型有什么区别?多线程同样也是阻塞啊,性能提升体现在哪?望哪位...
  • unix网络编程
  • select函数理解加IO复用 归纳总结核心部分就是用到的那3个结构体. 3个结构体里面分别都存储着指向各自数组的指针,这些数组是已bit(1比特位)为单位的数组. 这些数组里面存储的值只有0或者1; ...
  • vlc使用了live555开源库,但是只是播放网络视频流的时候用live555作为 接受,对于串流rtsp功能,为自行实现的一个服务端程序,单线程IO复用服务端模型。这里分析下这个服务端的源码 位于 src/network/httpd.c ...
  • 多路IO复用模型 select epoll 等

    千次阅读 2012-03-23 18:40:56
    多路IO复用提供了对大量文件描述符进行就绪检查的高性能方案。 selectselect诞生于4.2BSD,在几乎所有平台上都支持,其良好的跨平台支持是它的主要的也是为数不多的优点之一。select的缺点(1)单个进程能够监视的...
  • 多路IO复用模型 select epoll

    千次阅读 2016-11-21 13:40:03
    官方测试的是5w并发连接但在实际生产中可制成2-4w并发连接数,得益于nginx使用最新的epoll(linux 2.6内核)和kqueue(freebsd)网络I/O模型.而apache使用的则是传统的select模型,其比较稳定的prefork模式为多进程模式,...
  • IO模型介绍 常用的5种IO模型:blocking IOnonblocking IOIO multiplexingsignal driven IOasynchronous IO 再说一下IO发生时涉及的对象和步骤: *对于一个network IO (这里我们以read举例),它会涉及到两个系统对象:*...
  • IO模型IO复用

    2020-04-15 14:41:19
    文章目录五中网络IO模型阻塞IO非阻塞IO复用IO异步IO信号驱动IOIO复用函数调用selectpollepollepoll的工作模式LT模式ET模式 五中网络IO模型 IO的执行分为等待数据和拷贝数据两个阶段。 阻塞IO 指IO操作彻底完成后才...
  • 2.4 IO复用模型 2.5 小结 3 异步IO模型 4 五种IO模型对比 1 什么是I/O 程序是由数据+指令构成的,运行程序的过程可以分成下面这几步: 1.将代码加载到内存中,逐条运行内存中的代码 2.在运行代码的过程中...
  • IO复用(模型/阻塞/同步/异步)second60 20180209IO5种模型?什么是阻塞/非阻塞?什么是轮询?什么是同步和异步?套接字就绪的条件?拒绝攻型服务? IO复用:内核一旦发现进程指定的一个或多个IO条件就绪,就通知进程...
  • 网络编程----IO复用之select模型

    千次阅读 2017-04-06 22:35:03
    前一篇文章提到了,多线程/多进程虽然能够在一定程度上解决并发,但是由于进程/线程的切换消耗系统资源,多余并发量比较大的服务无法支持,因此为了解决大并发场景,需要一种...本文介绍一种IO复用模型,select模型,
  • 多路IO复用并发服务器模型d````````````````
  • IO模型IO多路复用

    2020-02-10 01:52:41
    文章目录Linux下的五大网络IO模型引言IO模型阻塞IO非阻塞IOIO复用信号驱动IO异步IO深入IO复用模型select基础原理运行机制与说明存在问题poll基础原理运行机制与说明存在问题epoll基础原理运行机制与说明具体描述工作...
  • 多路IO复用并发服务器模型 ppt 信息安全 产品开发实践 课件
  • linux IO模型IO复用
  • IO模型浅析-阻塞、非阻塞、IO复用、信号驱动、异步IO、同步IO 原文地址 IO模型浅析-阻塞、非阻塞、IO复用、信号驱动、异步IO、同步IO 正文 IO模型 在《UNIX网络变成卷1:套接字联网API》这本书中,提到了五种I/O模型...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 64,462
精华内容 25,784
关键字:

io复用模型