非阻塞IOserver型号
让我们来考虑一个场景,你和百万玩家的魔兽世界的忠实粉丝。时间之旅打每到周末boss。
每当周末比赛server在亚历山大,因为至少在同一时间数十万用户在线。
假设我们的多-threaded果酱server作为游戏server这是可行的?本场比赛首先分析server有什么特点:
① 网络游戏并不是像网页一样。打开一旦下载完就能够关闭连接结束。
网游必须是有一个持久有状态的连接,每个client都须要跟server存在一个持久的连接。以便高速及时发送消息。而随着并发用户数量的添加,多线程堵塞server不可能为每个client分配一个线程。
② 跟一般的应用server不同,CS结构的网络游戏一般把复杂的逻辑处理放到了client。而在游戏server端仅仅处理比較简单的逻辑,甚至仅仅是传递消息。像这样简单的逻辑我们居然给每个请求分配一条线程。这是不是严重脱离实际了?
③ 网游讲求的是响应快,消息交换及时,而且能进行双向通信。那必定须要频繁请求跟响应,假如我们已经採用了长久连接。但server并非每次都有新数据,并不须要发送给client,那我们还占了一条线程,是不是太浪费了?
从以上几点分析。像网游这种场合,我们传统的多线程server显然已经力不从心。线程池能在一定程度上缓解频繁的IO调用带来的资源占用,但池有一定的限制大小。在面对成千上万的client请求大并发情况下。却始终不是最佳方案。有没有可能用一个或少量的线程就能够维护非常多持久连接呢?以下介绍一种新的server模型——非堵塞server模型。
非堵塞server模型最重要的一个特点是,在调用某个接口后马上返回,而不会堵塞等待。如图2-6-2-1中所展示,当多个client向server请求时。server端会保存一个socket连接列表,然后有一个专门的线程对这个列表进行轮询。
假设发现某个socket有数据可读。就调用该socket的对应的读操作。反之,发现socket有数据可写的话,就调用该socket的对应的写操作;假设发现某个socket已经中断,就调用socket关闭操作。为了有更好地性能。还能够结合线程池,一旦检測到有须要处理(读数据、写数据、关闭)的socket就启动另外一条线程负责处理。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3lhbmd6aGl6aG91/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
图2-6-2-1 非堵塞server模型
这样看来,无论多少个socket连接都能够被一条线程管理起来。一条线程负责遍历这些socket列表,处理再交给线程池,非常好地利用了堵塞的时间,处理能力得到提升。
但这样的模型涉及到遍历全部的socket列表,同一时候须要处理数据的拼接。空暇时也占用较多CPU资源,仍然不适于大并发场景。再稍做改进——事件驱动模型。它的核心是事件驱动,线程遍历的并不是socket列表。取而代之的是检測事件。对检測出来的事件进行逐一响应。极大提高了检測效率。自然处理能力也更强。
喜欢研究java的同学能够交个朋友,以下是本人的微信号:
版权声明:本文博主原创文章,博客,未经同意不得转载。
非阻塞IOserver型号的更多相关文章
- 阻塞IO、非阻塞IO的区别
1.类与类之间的关系:依赖,实现,泛化(继承),关联,组合,聚合. 1)依赖(虚线):一个类是 另一个类的函数参数 或者 函数返回值. 2)实现(实线加小圆):对纯虚函数类(抽象类)的实现. 3)继承 ...
- 如何解读 Java IO、NIO 中的同步阻塞与同步非阻塞?
原文链接:如何解读 Java IO.NIO 中的同步阻塞与同步非阻塞? 一.前言 最近刚读完一本书:<Netty.Zookeeper.Redis 并发实战>,个人觉得 Netty 部分是写 ...
- 哪5种IO模型?什么是select/poll/epoll?同步异步阻塞非阻塞有啥区别?全在这讲明白了!
系统中有哪5种IO模型?什么是 select/poll/epoll?同步异步阻塞非阻塞有啥区别? 本文地址http://yangjianyong.cn/?p=84转载无需经过作者本人授权 先解开第一个 ...
- 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
- 非阻塞/异步(epoll) openssl
前段时间在自己的异步网络框架handy中添加openssl的支持,当时在网络上搜索了半天也没有找到很好的例子,后来自己慢慢的摸索,耗费不少时间,终于搞定.因此把相关的资料整理一下,并给出简单的例子,让 ...
- 同步与异步 & 阻塞与非阻塞
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 一.同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用 ...
- 网络IO之阻塞、非阻塞、同步、异步总结
网络IO之阻塞.非阻塞.同步.异步总结 1.前言 在网络编程中,阻塞.非阻塞.同步.异步经常被提到.unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一 ...
- (转)NIO与AIO,同步/异步,阻塞/非阻塞
原文地址: http://www.cnblogs.com/enjoy-ourselves/p/3793771.html 1.flip(),compact(),与clear()的使用 flip()内部实 ...
- Linux下的串口编程及非阻塞模式
本篇介绍了如何在linux系统下向串口发送数据.包括read的阻塞和非阻塞.以及select方法. 打开串口 在Linux系统下,打开串口是通过使用标准的文件打开函数操作的. #include < ...
随机推荐
- Service组件 总结 + 绑定理Service三种实现方式 Messager + Binder + AIDL
在Android中进程按优先级可以分为五类,优先级从高到低排列: - 前台进程 该进程包含正在与用户进行交互的界面组件,比如一个Activity - 可视进程 该进程中的组件虽然没有和用户交互,但是仍 ...
- session深入解读
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:尽管session机制在web应用程序中被採用已经非常长时间了.可是仍然有非常多人不清楚 ...
- Redis深入之数据结构
Redis主要数据结构 链表 Redis使用的C语言并没有内置这样的数据结构,所以Redis构建了自己的链表实现.列表键的底层实现之中的一个就是链表,一个列表键包括了数量比較多的元素,列表中包括的元素 ...
- Conversion to Dalvik format failed with error 1
主要和添�的第三方的包有关系. ======================================= 出现,Conversion to Dalvik format failed with e ...
- linux下查找某个文件
参考http://blog.csdn.net/gray13/article/details/6365654 一.通过文件名查找法: 举例说明,假设你忘记了httpd.conf这个文件在系统的哪个目录 ...
- HTML5 CSS3 诱人的实例 : 网页载入进度条的实现,下载进度条等
今天给大家带来一个比較炫的进度条,进度条在一耗时操作上给用户一个比較好的体验,不会让用户认为在盲目等待,对于没有进度条的长时间等待,用户会任务死机了,毫不犹豫的关掉应用:一般用于下载任务,删除大量任务 ...
- GRUB2配置详解:默认启动项,超时时间,隐藏引导菜单,配置文件详解,图形化配置
配置文件详解: /etc/default/grub # 设定默认启动项,推荐使用数字 GRUB_DEFAULT=0 # 注释掉下面这行将会显示引导菜单 #GRUB_HIDDEN_TIMEOUT=0 # ...
- svn创建并应用补丁
有时,我们不能提交临时局部变化,而我们需要回滚到svn最新的版本号.然,这些变化,我们要保持.提交或发送给其他同事的未来review. 怎么做?非常easy,只需要两个步骤: (1)创建一个补丁文件并 ...
- Android项目包装apk和apk反编译,xml反编译
一.项目和一般原则其不足之处包 (1)开发一个简单的项目.当发布了APK档.假设我们不使用签名的方式,直接地bin文件夹中找到*.apk档.非常方便,但是,当我们在使用的用户,可能有其他方案覆盖安装. ...
- 使用CMakeLists.txt 判断编译器是否支持C++11
#将下面的内容添加到CMakeLists.txt当中include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++11&quo ...