reactor & proactor 笔记

1. 基本概念

  1.1 同步/异步,针对应用程序和内核交互而言。
    同步:进程触发IO操作等待或轮询查看IO操作是否完成;
    异步:进程触发IO操作后仅需自身的处理,IO操作完成后会得到通知(异步的特点)

  1.2 阻塞/非阻塞:针对进程访问数据
    阻塞:调用数据访问函数后一直等待
    非阻塞:调用数据访问函数后立即返回

  同步阻塞IO:传统的IO方式,进程发起一个IO操作后等待其完成;
  同步非阻塞IO:进程发起一个IO操作后返回做其他处理,但进程需要不断询问IO操作是否完成,如JAVA
NIO
  异步阻塞IO:进程发起IO后等待内核通知,但仍然阻塞如select函数
  异步非阻塞IO:发起IO操作后立即返回,然后等待内核的IO操作通知,当前java无支持

  因此阻塞非阻塞本质上只针对同步有意义。

2. reactor &
proactor

  2.1 reactor

    1. 注册就绪时间和关联的事件处理器;
    2.
事件分离器等待事件发生;
    3.
当发生读就绪事件时,事件分离器调用相应的时间处理器;

  2.2 proactor

    1. 等待事件
    2.
读数据,由proactor完成
    3.
把已经准备好的数据给用户处理函数(用户代码)
    4.
用户处理数据

备注:与reactor不同的是proactor关注的是读/写完成事件

时间: 2024-11-08 23:52:24

reactor & proactor 笔记的相关文章

两种高性能I/O设计模式(Reactor/Proactor)的比较

综述 这篇文章探讨并比较两种用于TCP服务器的高性能设计模式. 除了介绍现有的解决方案,还提出了一种更具伸缩性,只需要维护一份代码并且跨平台的解决方案(含代码示例),以及其在不同平台上的微调. 此文还比较了java.c#.c++对各自现有以及提到的解决方案的实现性能. 系统I/O 可分为阻塞型, 非阻塞同步型以及非阻塞异步型[1.2]. 阻塞型I/O意味着控制权只到调用操作结束了才会回到调用者手里. 结果调用者被阻塞了, 这段时间了做不了任何其它事情. 更郁闷的是,在等待IO结果的时间里,调用者

libevent之Reactor模式

通过前边的一篇博文轻量级网络库libevent初探,我们知道libevent实际上是封装了不同操作系统下的/dev/poll.kqueue.event ports.select.poll和epoll事件机制,从而给我们提供一个统一的接口. libevent采用了Reactor I/O 设计模式,而Reactor是基于同步I/O机制的,所以libevent实际是一个基于同步I/O机制的库. 对于I/O设计模式,与Reactor相对应的还有Proactor.下边我们先来看下这两者的不同之处. Rea

IO多路复用和Reactor模式

1. Reactor和Preactor模式 Reactor用于同步IO,Preactor用于异步IO Reactor通常会和Connector模式一起使用,进一步解耦连接的建立与连接以后的逻辑 2. Reactor模式中的主要角色 2.1. Reactor Reactor是IO事件的派发者. 2.2. Acceptor Acceptor接受client连接,建立对应client的Handler,并向Reactor注册此Handler. 2.3. Handler 和一个client通讯的实体,按这

开发之技能

软件开发之技能梳理 编程开发本质是运用程序和计算机来解决现实中的各种问题,因此,编程开发人员的才智发挥载体是计算机或者说计算设备,直接武器是程序.程序员用来进行编程开发所需要的技能,归结起来主要如下: 1.  理解计算模型和框架: 顺序计算.并发计算 (并行计算.分布式计算): 理解应用所基于的计算模型和框架是非常重要的.传统应用通常基于顺序计算,而现代商业应用,比如云计算,通常基于分布式计算架构: 大规模的科学计算应用, 比如基因序列计算, 则基于并行计算. 2.  高效的数据处理:熟悉常用数

理解Java NIO

基础概念• 缓冲区操作缓冲区及操作是所有I/O的基础,进程执行I/O操作,归结起来就是向操作系统发出请求,让它要么把缓冲区里的数据排干(写),要么把缓冲区填满(读).如下图• 内核空间.用户空间 上图简单描述了数据从磁盘到用户进程的内存区域移动的过程,其间涉及到了内核空间与用户空间.这两个空间有什么区别呢? 用户空间就是常规进程(如JVM)所在区域,用户空间是非特权区域,如不能直接访问硬件设备.内核空间是操作系统所在区域,那肯定是有特权啦,如能与设备控制器通讯,控制用户区域的进程运行状态.进程执

ZeroC ICE的远程调用框架 ThreadPool

ThreadPool提供Reactor/Proactor服务,并且强偶合了Reactor(反应器)/Proactor(前摄器).不同于Reactor/Proactor使用线程池 进行事件处理的设计.如ACE框架的ACE_TP_Reactor.同时ThreadPool提供一个共享的工作分派队列,可以用作Half-Async/Half-sync并发模式的线程池. ThreadPool为池中每个线程定制了一至的线程循环,运行在池中的线程者必须进行这个循环,接受线程池的统一控制.此外ThreadPool

org.apache.kafka.common.network.Selector

org.apache.kafka.common.client.Selector实现了Selectable接口,用于提供符合Kafka网络通讯特点的异步的.非阻塞的.面向多个连接的网络I/O. 这些网络IO包括了连接的创建.断开,请求的发送和接收,以及一些网络相关的metrics统计等功能. 所以,它实际上应该至少具体以下功能 使用 首先得谈一下Selector这东西是准备怎么让人用的.这个注释里说了一部分: A nioSelector interface for doing non-blocki

软件开发之技能梳理

编程开发本质是运用程序和计算机来解决现实中的各种问题,因此,编程开发人员的才智发挥载体是计算机或者说计算设备,直接武器是程序.程序员用来进行编程开发所需要的技能,归结起来主要如下: 1.  理解计算模型和框架: 顺序计算.并发计算 (并行计算.分布式计算): 理解应用所基于的计算模型和框架是非常重要的.传统应用通常基于顺序计算,而现代商业应用,比如云计算,通常基于分布式计算架构: 大规模的科学计算应用, 比如基因序列计算, 则基于并行计算. 2.  高效的数据处理:熟悉常用数据结构和算法设计,能

Java的中BIO、NIO、AIO-2

Java的中BIO.NIO.AIO-2 java 举个栗子 接上一篇接着说,C/S模式.Reactor模式.Proactor模式是服务器处理IO常用的处理模型,这一篇就来解释一下这几种模式: 以一个餐饮为例,每一个人来就餐就是一个事件,他会先看一下菜单,然后点餐.就像一个网站会有很多的请求,要求服务器做一些事情.处理这些就餐事件的就需要我们的服务人员了. 在多线程处理的方式会是这样的: 一个人来就餐,一个服务员去服务,然后客人会看菜单,点菜. 服务员将菜单给后厨. 二个人来就餐,二个服务员去服务