多路复用服务器模型

select模块作用:select系统调用用来检测多个文件描述状态变化,程序会一直在select中等待直到超时或者被监视文件描述符中的一个或多个状态发生改变。

select函数:select(rlist,wlist,xlist[,timeout]),返回值:(rlist,wlist,xlist)

rlist:读取socket列表,判断是否有可以读的socket;

wlist:写入socket列表,判断是否有可以写的socket;

xlist:异常socket列表,判断是否有异常的socket;

如果有socket可以读,可以写,或者异常,select返回相应socket列表

select如何判断可读:

  1. 将检测的socket加入到rlist中,然后调用select等待数据;
  2. 如果有客户端连接或者对方数据,那么select就会立刻返回;
  3. 如果是新的链接调用accept接受新的socket,并将该socket计入到rlist或者wlist中;
  4. 如果有数据,那么就接收数据;

select如何判断可以写:

  1. 将检测的socket加入到wlist中,调用select等待;
  2. 如果socket可以写,返回可以写的socket列表;
  3. 调用send方法,发送数据;

select如何判断异常:

  1. 将检测的socket加入到xlist中,调用select等待;
  2. 如果socket有异常,返回异常的xlist列表;
  3. 处理异常socket;

select多路复用服务器优点和缺点:

优点:

  1. 不需要频繁的创建和销毁进程和线程,节省了系统的开销和负担;
  2. select采用轮训方式处理收发数据,处理效率高于多进程和多线程模型;

缺点:

  1. 当个进程监控的最多文件描述符有限的(系统默认1024个)
  2. 需要维护一个文件描述符列表
  3. 对于文件描述符扫描是线性的,当每次对这个结构进行扫描时时间会增加
  4. 内核把文件描述符消息通知给用户空间需要进行拷贝;

epoll模式

  1. 是linux下多路复用IO接口select/poll的增强版本
  2. 它所支持的文件描述符的上限是最大可以打开文件的数目
  3. epoll只会对“活跃”的socket进行操作,不会因为文件描述符的增加导致效率线性下降
  4. epoll是通过内核于用户空间mmap同一块内存实现,使用mmap加速内核与用户空间的消息传递;
时间: 2024-11-10 14:26:16

多路复用服务器模型的相关文章

Python之路【第七篇续】:I/O多路复用

回顾原生Socket 一.Socket起源: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用[打开][读写][关闭]模式来操作. socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) “他是所有WEB服务器的祖宗” pupepet.ansible.他们也可以通过输入命令然后返回结果这个也是基于Socket来实现的. 二.socket和file的区别:    file模块是针

服务器模型---socket!!!

/*********************服务器模型******************/ 一.循环服务器:循环服务器在同一时刻只可以相应一个客户端请求: 二.并发服务器:并发服务器在同一时刻可以相应多个客户端的请求. /****************循环服务器**************/ 1. UDP服务器: UDP循环服务器的实现非常简单:UDP服务器每次从套接字上读取一个客户端的请求,处理, 然后将结果返回给客户机. 可以用下面的算法来实现. socket(...); bind(..

服务器模型

硬件服务器:主机 集群 厂商 :IBM   HP  联想  浪潮 软件服务器 :编写的服务端应用程序,在硬件服务器上运行,一般依托于操作系统,给用户提供一套完整的服务 httpserver --> 处理http 请求 webserver -->网站的后端应用服务器程序 邮箱服务器 -->邮件处理 ftp 文件服务器 -->文件上传下载 功能 :网络连接 | 逻辑处理 | 数据交互 | 数据传输 | 协议的实现 结构 : c / s  客户端服务器模型      b/ s 浏览器服务

服务器模型??

1.循环服务器模型:循环处理客户端,处理完一个继续处理下一个. 缺点:不能同时处理多个请求,不允许某个客户端长期占用服务器资源 udp是不需要进行连接的,所以循环服务器模型更加适合udp通信. 2.并发服务器模型:每有一个客户端就创建一个进程/线程处理客户端的具体请求,而主进程/线程继续接收其他客户端的连接. 3.io多路复用:  一个socket同时监控多个io事件,当哪个io事件就绪就执行哪个io事件,形成一种并发的效果. 4.协程服务器模型:协程,微线程.单程.是一种用户态的轻量级线程.

多路复用之select、epoll、poll

IO的多路复用:一个进程可以监视多个描述符,一旦某个描述符读就绪或写就绪,能够通知进程程序进行相应的读写操作 使用场景: 1.当客户处理多个描述符(网络套接口)或一个客户同时处理多个套接口 2.TCP服务器既要处理监听套接口又要处理已经连接的套接口 3.一个服务器处理多个服务或多个协议也要使用I/O复用 与多进程和多线程相比,I/O多路复用最大优点系统开销小,系统也不必创建进程或线程,因而也不用维护这些进程和线程 支持I/O多路复用的系统调用:select.poll.epoll本质上都是同步IO

Unix C语言编写基于IO多路复用的小型并发服务器

背景介绍 如果服务器要同时处理网络上的套接字连接请求和本地的标准输入命令请求,那么如果我们使用accept来接受连接请求,则无法处理标准输入请求;类似地,如果在read中等待一个输入请求,则无法处理网络连接的请求. 所谓I/O多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但 select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而还

非阻塞IO服务器模型

我们来考虑一个情形,你跟千千万万个玩家是魔兽世界的超级粉丝,每周末准时组团打boss.每当周末游戏服务器就亚历山大,因为起码几十万用户同时在线.如果用我们的多线程阻塞服务器作为游戏服务器是否可行呢?先分析游戏服务器有哪些特点: ①  网络游戏并非像网页一样,打开一旦下载完就可以关闭连接结束.网游必须是有一个持久有状态的连接,每一个客户端都需要跟服务器存在一个持久的连接,以便快速及时发送消息.而随着并发用户数量的增加,多线程阻塞服务器不可能为每一个客户端分配一个线程. ②  跟一般的应用服务器不同

自动化运维Python系列之IO多路复用、SocketServer源码分析

IO多路复用 IO多路复用是指:通过一种机制,可以监视多个描述符,一旦某个系统描述符就绪(一般是读就绪或者写就绪)能够通知程序进行相应的读写操作 实例化例子就是在SocketServer模块中,客户端和服务端建立好连接,此时服务端通过监听conn这条链路,一旦客户端发送了数据,conn链路状态就发生变化,服务端就知道有数据要接收... Linux系统中同时存在select.pull.epoll三种IO多路复用机制 windows中只有select机制 1)select select本质上是通过设

IO多路复用——select

IO多路复用 是同步IO的一种,用一个进程一次等待多个IO就绪事件的发生,加大概率,尽可能高效的等. 适用场景 (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用. (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现. (3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用. (4)如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用. (5)如果一个服务器要处理多个服务或多个协议,一般要使用I/O