`
冰糖葫芦
  • 浏览: 298225 次
社区版块
存档分类
最新评论

反应堆模式(一):阻塞式IO应用

 
阅读更多


 这里我假设一个简单的情景,比如一个运行在单cpu机器上的单线程ruby应用。实际上,操作系统把CPU时间切分为多个片段并做规律性的上下文切换。

在单线程应用例如运行在ruby on rails的应用,所有请求都通过一个单独的线程来处理。当这个单独的线程做IO相关处理如数据库查询或者网络调用,那么即使这个应用/线程可以处理其他请求相关的工作也还是会被这些IO操作所阻塞。

一个避免以上问题出现的方法就是为在同一个服务下运行多个应用程序。所以,当一个应用程序的线程被阻塞时,其他应用的线程可以继续使用CPU来处理其他请求。下图中有两个应用在竞争CPU的使用时间,其中第二个应用的CPU消耗时间在a1到a2之间,但是我们还是可以看到CPU在时间段a1到t1、a2到 t2之间还是空闲的。

为了使CPU没有任何空闲时间,我们可以再增加更多的应用,但是这会增加不必要的上下文切换进而导致性能进一步降低。如下图的例子中,第三个应用即使还在处理一个请求还需要更多CPU运行时间,但是还是会和第二个应用程序之间的线程进行切换。

如上图所示,我们注意到了两个问题:

1.CPU会从一个仍然需要CPU处理的应用中切换出来

2.CPU仍然会为一个等待IO操作的应用分配时间

这两个问题都是由于抢占式的线程切换。为了达到CPU的合理分配使用,应用需要以合作的方式来请求CPU时间或者放弃CPU时间,而不是通过抢占式来上线文切换。

C10K的问题

在2000年初,单个服务器一次不能处理超过10000个连接。这对应用来说是个限制,开发者不能在单个服务中做超过10000连接的应用。人们发现解决这个问题的方案就是在每个线程中使用非阻塞IO。非阻塞IO是在C10K问题清单中被作为一个可扩展问题来关注的。

 

反应堆模式针对以上问题提供了一个解决方案就是使用epoll模型。

http://en.wikipedia.org/wiki/Nonpreemptive_multitasking
http://en.wikipedia.org/wiki/Preemption_(computing)
http://en.wikipedia.org/wiki/Reactor_pattern

 

在第二部分我们将关注使用非阻塞IO作为解决CPU使用率最大化问题的一种方式。

 

(未完,待续...)

 

 

 

1.本文由程序员学架构翻译,由mathew同学校审;仅用于交流学习使用。

2.本文译自Venkatesh CM在Reactor Pattern Part 1 - Applications with Blocking I/O的博客。

3. 转载请务必注明本文出自:程序员学架构(微信号:archleaner )

4.关注公众号请扫码:

 

  • 大小: 38.7 KB
3
1
分享到:
评论

相关推荐

    Linux服务器源码.zip

    反应堆模式是一种常见的事件驱动设计模式,它通过一个事件循环来监控多个事件源。当事件发生时,反应堆会调用相应的回调函数进行处理。在这个服务器中,libevent就是实现反应堆模式的关键组件。 4. **线程池**: ...

    nio

    - 异步I/O的一种实现方式,区别于反应堆模式。 - 应用程序不直接对I/O请求进行处理,而是提交一个描述了I/O操作的异步操作给操作系统,由操作系统来完成实际的I/O操作,然后通过回调、事件通知或者其它方式通知...

    程序员的面试模板及技巧资料.pdf,这是一份不错的文件

    面试中,问题不仅局限于这些,还可能涉及到最新的技术趋势,如反应式编程、微服务、云原生等。准备面试时,不仅要掌握这些基础知识,还要关注行业动态,不断学习新技术。通过阅读相关书籍,如《Java编程面试揭秘》等...

    如何利用Java开发高性能、高并发Web应用.ppt

    9. **异步处理**:通过异步非阻塞IO(如NIO)和反应式编程,可以在处理高并发请求时,减少等待时间,提高系统吞吐量。 10. **代码重构**:定期进行代码审查和重构,消除冗余代码,减少不必要的计算和资源消耗,保持...

    linux网络编程.zip

    5. **05day反应堆线程池**: 反应堆(Reactor)模式是并发编程的一种设计模式,常用于处理I/O事件。线程池则是为了提高系统效率,避免频繁创建和销毁线程带来的开销。这部分可能讲述如何结合二者构建高效的网络服务...

    Java进阶诀窍

    7. **IO流**:掌握`InputStream`、`OutputStream`、`Reader`、`Writer`的基本用法,理解NIO(非阻塞I/O)和AIO(异步I/O)的优势,以及`Files`和`Path`类的使用。 8. **网络编程**:理解Socket编程,包括TCP和UDP...

    JAVA面试 试题及答案 相关内容

    Java是一种广泛使用的面向对象的编程语言,其设计目标是具有高度的可移植性、健壮性和安全性。在Java面试中,面试官通常会考察应聘者的编程基础、数据结构与算法、多线程、集合框架、异常处理、IO流、网络编程、设计...

    java知识管理.pdf

    Java知识管理是一个广泛的领域,它...以上只是Java知识管理的一部分,随着技术的发展,新的概念和技术如模块化(Jigsaw)、Lambda表达式、反应式编程等不断涌现,持续学习和更新知识是每个Java开发者必须面对的挑战。

    oracle的javappt

    13. **设计模式**:讲解常见的设计模式,如工厂模式、单例模式、观察者模式、装饰器模式等,以及它们在实际开发中的应用。 14. **Spring框架**:如果PPT涉及到企业级开发,可能会讲解Spring框架的基础知识,如依赖...

    AgarioClone:受网络游戏Agar.io启发的Passion项目

    AgarioClone是一个基于Java开发的游戏项目,灵感来源于热门的在线多人游戏Agar.io。Agar.io是一款简单却极具策略性的游戏,玩家控制一个细胞在地图上移动,通过吞噬其他细胞来增长自己的体积,同时避免被更大的细胞...

    Linux高性能服务器编程

    9.2 poll系统调用 9.3 epoll系列系统调用 9.3.1 内核事件表 9.3.2 epoll_wait函数 9.3.3 LT和ET模式 9.3.4 EPOLLONESHOT事件 9.4 三组IO复用函数的比较 9.5 IO复用的高级应用一:非阻塞connect 9.6 IO复用...

    java必备宝典(经典必备)

    后续版本还增加了模块化系统(Jigsaw)、反应式编程支持等。 以上只是部分Java编程中的核心知识点,这份"java必备宝典(经典必备)"很可能会涵盖这些内容以及更多高级主题,如并发编程、网络编程、分布式系统等。...

    剖析Python的Twisted框架的核心特性

    而关于proactor(主动器)和reactor(反应堆),这里有一篇推荐博客有比较详细的介绍。 就reactor模式的网络IO而言,应该是同步IO而不是异步IO。而Dave第一章中提到的异步,核心在于:显式地放弃对任务的控制权而不是被...

    java经典面试题与世界500强面试题

    5. **IO/NIO**:流的分类、字符编码、缓冲区、过滤器,以及Java NIO(非阻塞I/O)的优势和使用。 6. **网络编程**:TCP/UDP协议,Socket编程,HTTP/HTTPS协议的理解及其应用。 7. **设计模式**:单例、工厂、抽象...

    java入门教程 乐意的可以下来看看

    后续版本也不断添加了新功能,如模块系统、反应式编程支持等。 通过这份Java入门教程,你将逐步了解并掌握Java编程的基础概念和核心技能。在实践中不断学习和探索,你将成为一名熟练的Java开发者。

    5. **IO/NIO**:Java的输入输出(IO)和非阻塞I/O(NIO)库提供了处理文件、网络数据传输的能力。 6. **多线程**:Java提供了内置的多线程支持,理解线程的创建、同步、通信对于构建并发程序至关重要。 7. **JVM**...

    Java

    - **反应式编程**:如Reactor,用于异步非阻塞编程。 7. **Java生态** - **Spring框架**:企业级应用的主流框架,提供依赖注入、AOP等功能。 - **Apache Hadoop**:基于Java的大数据处理框架。 - **Android开发...

    SQLServer2008查询性能优化 2/2

    最后以一个实际的工作负载将所有技巧联系起来,并且提供了“宝典”式的最佳实践列表。 《SQL Server 2008查询性能优化》适合于关心数据库应用系统性能的开发人员和数据库管理人员阅读。通过阅读《SQL Server 2008...

    SQLServer2008查询性能优化 1/2

    最后以一个实际的工作负载将所有技巧联系起来,并且提供了“宝典”式的最佳实践列表。 《SQL Server 2008查询性能优化》适合于关心数据库应用系统性能的开发人员和数据库管理人员阅读。通过阅读《SQL Server 2008...

Global site tag (gtag.js) - Google Analytics