关闭

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

标签: 高性能网络I-O框架架构设计linux框架
638人阅读 评论(1) 收藏 举报
分类:
一般的高性能网络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服务器端的学习,是时候开始对大二下半学期以及大三上这段时间的学习成果进行总结了。由于水平有限,如果大家看到哪里不对的欢迎来喷,我会第一之间改正,学习就是这样的一个过程,加油!!!

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11996次
    • 积分:256
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:1篇
    • 译文:0篇
    • 评论:3条
    最新评论