我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:四肖中特 > 反向复用 >

网络socket编程--多路复用

归档日期:06-11       文本归类:反向复用      文章编辑:爱尚语录

  同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成

  后才能继续执行;而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册

  阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作在没有接收完数据或者没有得到结果之前不

  会返回,需要彻底完成后才返回到用户空间;而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完

  在Linux下进行网络编程时,服务器端编程经常需要构造高性能的IO模型,常见的IO模型有五种:

  目前操作系统多为采用IO多路复用的模型模拟异步IO的方式,即我们重点介绍IO多路复用。

  IO多路复用:IO多路复用模型是建立在内核提供的多路分离函数select基础之上的,使用select函数可以避免同步非阻塞IO模型中轮询等待的问题,此外poll、epoll都是这种模型。在该种模式下,用户首先将需要进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回。当数据到达时,socket被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视socket,以及调用select函数的额外操作,效率更差。但是,使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket,然后不断地调用select读取被激活的socket,即可达到在同一个线程内同时处理多个IO请求的目的。

  select系统调用是用来让我们的程序监视多个文件句柄(socket 句柄)的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变

  说明: select监视并等待多个文件描述符的属性发生变化,它监视的属性分3类,分别是readfds(文件描述符有数据到来可读)、

  writefds(文件描述符可写)、和exceptfds(文件描述符异常)。调用后select函数会阻塞,直到有描述符就绪(有数据可读、可写、

  或者有错误异常),或者超时( timeout 指定等待时间)发生函数才返回。当select()函数返回后,可以通过遍历 fdset,来找到

  1.select函数的返回值是就绪描述符的数目,超时时返回0,出错返回-1;

  2.第一个参数max_fd指待测试的fd个数,它的值是待测试的最大文件描述符加1。Linux内核从0开始到max_fd-1扫描文件描述符,如果有数据出现事件(读、写、异常)将会返回;假设需要监测的文件描述符是8,9,10,那么Linux内核实际也要监测0~7,此时真正带测试的文件描述符是0~10总共11个,即max(8,9,10)+1,所以第一个参数是所有要监听的文件描述符中最大的+1。

  3.中间三个参数readset、writeset和exceptset指定要让内核测试读、写和异常条件的fd集合,如果不需要测试的可以设为NULL;

  4.最后一个参数是设置select的超时时间,如果设置为NULL则永不超时;

  : 待测试的描述集的总个数。 但要注意, 待测试的描述集总是从0, 1, 2, ...开始的。 所以, 假如你要检测的描述符为8,

  9, 10, 那么系统实际也要监测0, 1, 2, 3, 4, 5, 6, 7, 此时真正待测试的描述符的个数为11个, 也就是max(8,

  在Linux内核有个参数__FD_SETSIZE定义了每个FD_SET的句柄个数中,这也意味着select所用到的FD_SET是有限的,也正是这个原因select()默认只能同时处理1024个客户端的连接请求:

  似,与 select() 在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是 poll() 没有最大文件

  描述符数量的限制(但是数量过大后性能也是会下降)。poll() 和 select() 同样存在一个缺点就是,包含大量文件描述符的数组

  被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增

  第一个参数用来指向一个struct pollfd类型的数组,每一个pollfd结构体指定了一个被监视的文件描述符,指示poll()监视多个文

  件描述符。每个结构体的events域是监视该文件描述符的事件掩码,由用户来设置这个域。revents域是文件描述符的操作结果

  事件掩码,内核在调用返回时设置这个域,events域中请求的任何事件都可能在revents域中返回。下表列出指定 events 标志以

  第三个参数 timeout指定等待的毫秒数,无论I/O是否准备好,poll都会返回。timeout指定为负数值表示无限超时,使poll()

  一直挂起直到一个指定事件发生;timeout为0指示poll调用立即返回并列出准备好I/O的文件描述符,但并不等待其它的事件。

  系统调用epoll_create()创建了一个新的epoll实例,其对应的兴趣列表初始化为空。若成功返回文件描述符,若出错返回-1。

  参数size指定了我们想要通过epoll实例来检查的文件描述符个数。该参数并不是一个上限,而是告诉内核应该如何为内部数据结

  作为函数返回值,epoll_create()返回了代表新创建的epoll实例的文件描述符。这个文件描述符在其他几个epoll系统调用中用

  来表示epoll实例。当这个文件描述符不再需要时,应该通过close()来关闭。当所有与epoll实例相关的文件描述符都被关闭

  时,实例被销毁,相关的资源都返还给系统。从2.6.27版内核以来,Linux支持了一个新的系统调用epoll_create1()。该系统调用

  执行的任务同epoll_create()一样,但是去掉了无用的参数size,并增加了一个可用来修改系统调用行为的flags参数。目前只支

  持一个flag标志:EPOLL_CLOEXEC,它使得内核在新的文件描述符上启动了执行即关闭标志。

  第二个参数evlist所指向的结构体数组中返回的是有关就绪态文件描述符的信息,数组evlist的空间由调用者负责申请;

  第四个参数timeout用来确定epoll_wait()的阻塞行为,有如下几种:

  如果timeout等于-1,调用将一直阻塞,直到兴趣列表中的文件描述符上有事件产生或者直到捕获到一个信号为止。

  如果timeout等于0,执行一次非阻塞式地检查,看兴趣列表中的描述符上产生了哪个事件。

  如果timeout大于0,调用将阻塞至多timeout毫秒,直到文件描述符上有事件发生,或者直到捕获到一个信号为止。

  数组evlist中,每个元素返回的都是单个就绪态文件描述符的信息。events字段返回了在该描述符上已经发生的事件掩码。

  data字段返回的是我们在描述符上使用epoll_ctl()注册感兴趣的事件时在ev.data中所指定的值。注意,data字段是唯一可获知同

  这个事件相关的文件描述符的途径。因此,当我们调用epoll_ctl()将文件描述符添加到感兴趣列表中时,应该要么将ev.date.fd设

  为文件描述符号,要么将ev.date.ptr设为指向包含文件描述符号的结构体。

  1.IO多路复用:每一次网络通信都是一个Socket的I/O流,对于服务器而言,有两种方法1.传统的多进程并发模型(每进来一个新的I/O流会分配一个新的进程管理。)2.方法二就是I/O的多路复用(单线...博文来自:微小的鱼的博客

  一直以来,PHP很少用于socket编程,毕竟是一门脚本语言,效率会成为很大的瓶颈,但是不能说PHP就无法用于socket编程,也不能说PHP的socket编程性能就有多么的低,例如知名的一款PHPs...博文来自:zhang197093的博客

  文章参考自:(秋叶原—MikeVS麦克《Linux系统编程——I/O多路复用selec...博文来自:mick_seu的博客

  IO多路复用所谓的I/O多路复用,就是可以监控多个socket上的IO请求。允许多个socket在可读或可写准备好时,应用能被通知到,这样应用就可以一次非阻塞的处理多个socket相关的IO请求。IO...博文来自:changtao381的专栏

  除了可以采用多进程和多线程方法实现并发服务器之外,还可以采用I/O多路复用技术。通过该技术,系统内核缓冲I/O数据,当某个I/O准备好后,系统通知应用程序该I/O可读或可写,这样应用程序可以马上完成相...博文来自:蚂蚁的坚持

  1.多路复用多路复用(multiplexing),简称复用,是通信技术中的基本概念链路/网络资源(如带宽)划分为“资源片”将资源片分配给各路“呼叫”(calls)资源片可能“闲置”(idle)(无共享...博文来自:HIT-LSQ的博客

  什么是多路复用技术呢?多路复用(multiplexing),简称复用,是通信技术中的基本概念。 事实上,多路复用技术的原理就是,把通信资源或者说是链路、信道资源进行的划分,分成一系列的资源片。把这些资...博文来自:suxiaorui的博客

  其实在之前的TCP之中,我们编程实现了多进程,多线程机制下的TCP服务器,但是对于这种的TCP服务器而言,存在太大的资源局限性。所以我们可以是用I/0模型中的多路复用I/O模型来进行编程。他的具体思想...博文来自:tongtong

  转载自:同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是...博文来自:Fury97的博客

  计算机网络-多路复用与多路分用 1多路复用/分用如果某层的一个协议对应直接上层的多个协议/实体,则需要复用/分用。 2分用如何工作?  无连接分用(UDP)  面向连接的分用(TCP)   基础知识,...博文来自:Rage_的博客

  时分多路复用(TDM)信号分割的参量是信号占用的时间,故要使复用的各路信号在时间上互不重叠,在传输时把时间分成小的时隙,每一时隙由复用的一个信号占用。频分多路复用(FDM)首先,传输媒体的可用带宽被划...博文来自:大道至简

  文件I/O方式比较1.阻塞式文件IO2.非阻塞式文件IO3.多路复用IO4.信号驱动IO(也叫驱动异步IO)IO阻塞与非阻塞操作阻塞:如果没有数据可操作,该函数调用将阻塞,导致对应进程暂停执行,当有数...博文来自:ygl的记录博

  电路交换中的多路复用为了高效合理地利用资源,通常采用多路复用技术,使多路信号共享。同一条线路进行传输,即利用一条物理链路同时传输多路信号。多路复用的方法模拟信号频分复用FDM(FrequencyDiv...博文来自:WaitForFlower

  数据交换分为电路交换、报文交换和分组交换,下面我们来讨论一下三者之间的优缺点。电路交换:典型的网络是:电话网络三个阶段:建立连接(呼叫/建立电路连接)通信释放连接(拆除电路)特点:独...博文来自:u013031092的专栏

  本章节是用基本的Linux基本函数加上epoll调用编写一个完整的服务器和客户端例子,可在Linux上运行,客户端和服务端的功能如下:客户端从标准输入读入一行,发送到服务端服务端从网络读取一行,然后输...博文来自:一缕阳光的博客

  与node很像这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程采用多路I/O复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非...博文来自:maqingbin8888的专栏

  实现一个基本的流式套接字客户端/服务器通信程序,客户端和服务器按如下步骤交互:(1)客户端向服务器发出日期时间请求字符串,如:%D%Y%A%T等。(2)服务器从网络接收到日期时间请求字符串后,根据字符...博文来自:小张的专栏

  本页内容1.多路复用介绍    多路复用即一个信道传输多路信号博文来自:LazyChun的专栏

  五种IO模型在冯诺依曼计算机体系结构中,输入输出设备是其中的两大组件,那么今天我们就来谈谈计算机中IO(输入输出)模型IO分为阻塞IO、非阻塞IO、信号驱动IO、IO多路转接、异步IO阻塞IO阻塞IO...博文来自:GangStudyIT的博客

  Socket编程中的select多路复用阻塞方式(block),顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,假如事件没有发生,进程或线程就被阻塞,函数不能立即返回。非阻塞方式(n...博文

  epoll的相关系统调用1、intepoll_create(intsize);创建一个epoll描述符,该描述符占用一个fd值,程序退出前必须调用close()关闭,参数size为最大监听事件数2、i...博文来自:我们的征途是星辰大海

  1.介绍本篇文章将IO多路复用(多线程)中的单Reactor+多线程网络模型做了改进,把Reactor拆成两个角色MainReactor及SubReactor,以提升效能与资源利用率​​。MainRe...博文来自:怪盗基德

  这是在做C语言聊天平台解决服务器和多客户端网络连接的主要本分代码和思路...博文来自:null

  多路复用I/O的优缺点    多路复用I/O技术由操作系统提供支持,并提供给各种高级语言进行使用。它针对阻塞式同步I/O和非阻塞式同步I/O而言有很多优势,最直接的效果就是它绕过了I/O在操作系统层面...博文来自:TomWu的博客

  Intellij IDEA 如何通过数据库表生成带注解的实体类图文详细教程06-08

本文链接:http://pebeducation.com/fanxiangfuyong/377.html