初探高性能网络I/O框架库模型(Linux)

原创 2015年11月20日 22:27:44
一般的高性能网络I/O框架库包含这样几个组件:句柄(Handle)、事件多路分离器(EventDemultiplexer)、事件处理器(EventHandler)、具体事件处理器(ConcreteEventHandler)、Reactor。

1、句柄
I/O框架库需要处理的对象,包括I/O事件、定时器事件、信号事件,通常称为事件源。一个事件源通常会和一个句柄绑定起来,句柄的作用是,当内核检测到某一就绪事件后,内核通过句柄通知应用程序这一事件。在Linux中句柄就是文件描述符,信号对应的句柄就是对应的信号值。

2、事件多路分离器
事件的到来是无序、异步的,我们无法预知程序合适会接收到一个连接请求、或者其他的已监听事件。所以程序需要循环的等待并处理事件,这就是事件循环。在事件循环中实现事件循环,一般是通过I/O多路复用技术实现的。I/O框架库一般将系统支持的各种I/O复用系统调用封装成统一的接口,称为事件多路分离器。事件多路分离器的demultiplexer函数是等待事件的核心方法,其封装了select、poll、epoll_wait等函数。
    下面看一下I/O框架组件图:
节约时间直接从资料上找来的,比较标准
此外,事件多路分离器还需要实现register_event和remove_event方法,以供调用者往事件多路分离器中注册和删除事件。
3、事件处理器和具体事件处理器
事件处理器一般用来处理事件对应的业务,它通常包含一个或多个handle_event回调函数,这些回调函数在事件循环中被执行。I/O框架库提供的事件处理器通常是一个接口,用户需要继承它来实现自己的事件处理器,这就是具体事件处理器。因此,事件处理器中的回调函数一般被申明为虚函数,以支持用户扩展。
此外,事件处理器一般还提供一个get_handle方法,他返回与该事件处理器关联的句柄。那么事件处理器和句柄之间有什么关系?当事件多路分离器检测到事件时它是通过句柄通知应用程序的。因此,我们必须将事件多路分离器与句柄绑定,这样在事件发生时才能获取到正确的事件处理器。
4、Reactor
Reactor是I/O框架库的核心,还有另一种模式Proactor(基于异步I/O),以后有机会再跟大家分享,本篇主要探讨在Linux系统上使用最广泛的模式(Reactor)。它提供的几个主要方法是:
- handle_events。该方法执行事件循环。它重复如下过程:等待事件、依次处理事件对应的事件处理器。
- register_handler。该方法调用事件多路分离器中的register_event方法,来往事件多路分发器中注册一个事件。
- remove_handler。该方法调用事件多路分离器中的remove_event方法来删除事件多路分离器中的一个事件。

最后贴上I/O框架库的工作时序图:
这里写图片描述

最后的最后,以muduo开源网络I/O库为例,来看一下真正的开源项目是怎样基于上述模型封装的。先上muduo库的结构图:
这里写图片描述
EventLoop即为一个封装过的Reactor,Poller即为一个封装过的事件多路分离器,Channel和TcpConnection即为事件处理器和具体事件处理器,中间的DileDescriptor即为句柄(包含了Socket文件描述符,信号值等等)。
好了,以上就是今天的全部内容,本人也是刚刚开始Linux服务器端的学习,是时候开始对大二下半学期以及大三上这段时间的学习成果进行总结了。由于水平有限,如果大家看到哪里不对的欢迎来喷,我会第一之间改正,学习就是这样的一个过程,加油!!!

版权声明:本文为博主原创文章,未经博主允许不得转载。

spring(JDBC)事务配置

实现原理: 采用spring AOP技术实现spring事务的架构 事务的定义 事务的状态 说明:通过spring的事务处理架构,再通过配置文件具体的实现事务的类,就可以让 spring容器知...

Java____堆内存和栈内存

—————————————————存储器知识前瞻—————————————— 寄存器 寄存器是中央处理器内的组成部份。它跟CPU有关。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址...

Linux网络编程【六】:TCP协议高性能服务器(http)模型之I/O多路转接epoll

什么是epoll? epoll是linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大 量并发连接中只有少量活跃...

【Linux网络编程】I/O多路转接之 epoll 高性能简洁http服务器模型

和之前的select ,poll一样,服务器比较简陋,为了学习模型的基本框架,只向客户端回写一条html语句。启动服务器后,用手机或者电脑浏览器发起请求,服务端向浏览器写回html,响应字符串,然后可...

Linux网络编程【五】:TCP协议高性能服务器(http)模型之I/O多路转接select

I/O多路转接之select 系统提供select函数来实现多路复用输入/输出模型。select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。 select:该函数允许进程指示内核等待多个事...

【Linux网络编程】基于TCP协议 I/O多路转接(select) 的高性能回显服务器客户端模型

服务端代码: myselect.c #include #include #include #include #include #include #include #include ...

Linux网络编程【七】:TCP协议高性能服务器(http)模型之I/O多路转接poll

poll:poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构,其他的都差不多。 不同与select使⽤三个位图来表⽰...

唯快不破:高性能服务器框架--I/O模型

socket在创建的时候默认是阻塞的。我们可以通过socket系统调用的第二个参数传递SOCK_NONBLOCK标志,或者通过fcntl系统调用的F_SETFL命令,将其设置为非阻塞的。阻塞和非阻塞的...
  • zj6257
  • zj6257
  • 2017年11月30日 09:24
  • 10

高性能服务器框架--I/O模型

转载地址:http://www.linuxidc.com/Linux/2014-10/108476.htm          socket在创建的时候默认是阻塞的。我们可以通过socket系统调用的第...

【转载】高性能网络I/O框架-netmap源码分析(6)

高性能网络I/O框架-netmap源码分析(6) 作者:gfree.wind@gmail.com 原文地址: 因为最近比较忙,很久没有更新博客了,但是netmap源码分析还没有写完,今天...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:初探高性能网络I/O框架库模型(Linux)
举报原因:
原因补充:

(最多只允许输入30个字)