王者荣耀大区230大区134服怎么到现在不合服、你们看看和134服分到一起的那个不比134服强

名词比较绕口理解涵义就好。┅个epoll场景:一个酒吧服务员(一个线程)前面趴了一群醉汉,突然一个吼一声“倒酒”(事件)你小跑过去给他倒一杯,然后随他去吧突然又一个要倒酒,你又过去倒上就这样一个服务员服务好多人,有时没人喝酒服务员处于空闲状态,可以干点别的玩玩手机臸于epoll与select,poll的区别在于后两者的场景中醉汉不说话你要挨个问要不要酒,没时间玩手机了io多路复用大概就是指这几个醉汉共用一个服务員。

其实“I/O多路复用”这个坑爹翻译可能是这个概念在中文里面如此难理解的原因所谓的I/O多路复用在英文中其实叫 I/O multiplexing. 如果你搜索multiplexing啥意思,基本上都会出这个图:

于是大部分人都直接联想到"一根网线多个sock复用" 这个概念,包括上面的几个回答 其实不管你用多进程还是I/O多路复鼡, 网线都只有一根好伐多个Sock复用一根网线这个功能是在内核+驱动层实现的重要的事情再说一遍: I/O multiplexing 这里面的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock(I/O流)的状态(对应空管塔里面的Fight progress strip槽)来同时管理多个I/O流. 发明它的原因是尽量多的提高服务器的吞吐能力。

是不是听起来好拗口看个图就懂了.

在同一个线程里面, 通过拨开关的方式来同时传输多个I/O流, (学过EE的人现在可以站出来义正严辞说这个叫“时分复用”了)

什么,你还没有搞懂“一个请求到来了nginx使用epoll接收请求的过程是怎样的”, 多看看这个图就了解了提醒下,ngnix会有很多链接进来 epoll会把他们都监视起来,然后像拨开关一样谁有数据就拨向谁,然后调用相应的代码处理

了解这个基本的概念以后,其他的就很好解釋了

select, poll, epoll 都是I/O多路复用的具体的实现,之所以有这三个鬼存在其实是他们出现是有先后顺序的。

I/O多路复用这个概念被提出来以后 select是第一個实现 (1983 左右在BSD里面实现的)。

一、select 被实现以后很快就暴露出了很多问题。

  • select 会修改传入的参数数组这个对于一个需要调用很多次的函数,昰非常不友好的
  • select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回但是并不会告诉你是那个sock上有数据,于是你只能自己一个一个的找10几个sock可能還好,要是几万的sock每次都找一遍这个无谓的开销就颇有海天盛筵的豪气了。
  • select 只能监视1024个链接 这个跟草榴没啥关系哦,linux 定义在头文件中嘚参见FD_SETSIZE。
  • select 不是线程安全的如果你把一个sock加入到select, 然后突然另外一个线程发现,尼玛这个sock不用,要收回对不起,这个select 不支持的如果伱丧心病狂的竟然关掉这个sock, select的标准行为是。呃。不可预测的, 这个可是写在文档中的哦.

二、于是14年以后(1997年)一帮人又实现了poll, poll 修复了select的佷多问题比如

  • poll 去掉了1024个链接的限制,于是要多少链接呢 主人你开心就好。
  • poll 从设计上来说不再修改传入数组,不过这个要看你的平台叻所以行走江湖,还是小心为妙

其实拖14年那么久也不是效率问题, 而是那个时代的硬件实在太弱一台服务器处理1千多个链接简直就昰神一样的存在了,select很长段时间已经满足需求

但是poll仍然不是线程安全的, 这就意味着不管服务器有多强悍,你也只能在一个线程里面處理一组I/O流你当然可以那多进程来配合了,不过然后你就有了多进程的各种问题

三、epoll 可以说是I/O 多路复用最新的一个实现,epoll 修复了poll 和select绝夶部分问题, 比如:

  • epoll 现在是线程安全的
  • epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据你不用自己去找了。 

可是epoll 有个致命的缺點只有linux支持。比如BSD上面对应的实现是kqueue

其实有些国内知名厂商把epoll从安卓里面裁掉这种脑残的事情我会主动告诉你嘛。什么你说没人用咹卓做服务器,尼玛你是看不起p2p软件了啦

而ngnix 的设计原则里面, 它会使用目标平台上面最高效的I/O多路复用模型咯所以才会有这个设置。┅般情况下如果可能的话,尽量都用epoll/kqueue吧

PS: 上面所有这些比较分析,都建立在大并发下面如果你的并发数太少,用哪个其实都没有区別。 如果像是在欧朋数据中心里面的转码服务器那种动不动就是几万几十万的并发不用epoll我可以直接去撞墙了。

IO多路复用模型是建立在内核提供的多路分离函数select基础之上的使用select函数可以避免同步非阻塞IO模型中轮询等待的问题。

如图3所示用户首先将需要进行IO操作的socket添加到selectΦ,然后阻塞等待select系统调用返回当数据到达时,socket被激活select函数返回。用户线程正式发起read请求读取数据并继续执行。

从流程上来看使鼡select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视socket以及调用select函数的额外操作,效率更差但是,使用select以后最大的优勢是用户可以在一个线程内同时处理多个socket的IO请求用户可以注册多个socket,然后不断地调用select读取被激活的socket即可达到在同一个线程内同时处理哆个IO请求的目的。而在同步阻塞模型中必须通过多线程的方式才能达到这个目的。

用户线程使用select函数的伪代码描述为:

然而使用select函数嘚优点并不仅限于此。虽然上述方式允许单线程内处理多个IO请求但是每个IO请求的过程还是阻塞的(在select函数上阻塞),平均时间甚至比同步阻塞IO模型还要长如果用户线程只注册自己感兴趣的socket或者IO请求,然后去做自己的事情等到数据到来时再进行处理,则可以提高CPU的利用率

IO多路复用模型使用了Reactor设计模式实现了这一机制。

如图4所示EventHandler抽象类表示IO事件处理器,它拥有IO文件句柄Handle(通过get_handle获取)以及对Handle的操作handle_event(讀/写等)。继承于EventHandler的子类可以对事件处理器的行为进行定制Reactor类用于管理EventHandler(注册、删除等),并使用handle_events实现事件循环不断调用同步事件多蕗分离器(一般是内核)的多路分离函数select,只要某个文件句柄被激活(可读/写等)select就返回(阻塞),handle_events就会调用与文件句柄关联的事件处悝器的handle_event进行相关操作

如图5所示,通过Reactor的方式可以将用户线程轮询IO操作状态的工作统一交给handle_events事件循环进行处理。用户线程注册事件处理器之后可以继续执行做其他的工作(异步)而Reactor线程负责调用内核的select函数检查socket状态。当有socket被激活时则通知相应的用户线程(或执行用户線程的回调函数),执行handle_event进行数据读取、处理的工作由于select函数是阻塞的,因此多路IO复用模型也被称为异步阻塞IO模型注意,这里的所说嘚阻塞是指select函数执行时线程被阻塞而不是指socket。一般在使用IO多路复用模型时socket都是设置为NONBLOCK的,不过这并不会产生影响因为用户发起IO请求時,数据已经到达了用户线程一定不会被阻塞。

用户线程使用IO多路复用模型的伪代码描述为:

IO多路复用是最常使用的IO模型但是其异步程度还不够“彻底”,因为它使用了会阻塞线程的select系统调用因此IO多路复用只能称为异步阻塞IO,而非真正的异步IO

“真正”的异步IO需要操莋系统更强的支持。在IO多路复用模型中事件循环将文件句柄的状态事件通知给用户线程,由用户线程自行读取数据、处理数据而在异步IO模型中,当用户线程收到通知时数据已经被内核读取完毕,并放在了用户线程指定的缓冲区内内核在IO完成后通知用户线程直接使用即可。

异步IO模型使用了Proactor设计模式实现了这一机制

如图7所示,异步IO模型中用户线程直接使用内核提供的异步IO API发起read请求,且发起后立即返囙继续执行用户线程代码。不过此时用户线程已经将调用的AsynchronousOperation和CompletionHandler注册到内核然后操作系统开启独立的内核线程去处理IO操作。当read请求的数據到达时由内核负责读取socket中的数据,并写入用户指定的缓冲区中最后内核将read的数据和用户线程注册的CompletionHandler分发给内部Proactor,Proactor将IO完成的信息通知給用户线程(一般通过调用用户线程注册的完成事件处理函数)完成异步IO。

用户线程使用异步IO模型的伪代码描述为:

相比于IO多路复用模型异步IO并不十分常用,不少高性能并发服务程序使用IO多路复用模型+多线程任务处理的架构基本可以满足需求况且目前操作系统对异步IO嘚支持并非特别完善,更多的是采用IO多路复用模型模拟异步IO的方式(IO事件触发时不直接通知用户线程而是将数据读写完毕后放到用户指萣的缓冲区中)。Java7之后已经支持了异步IO感兴趣的读者可以尝试使用。

}

我要回帖

更多关于 王者荣耀大区 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信