Ceph源码分析之Async模块:1、异步通信核心模块EventCenter+Epoll
来源:互联网 发布:怎样修改淘宝卖家地址 编辑:程序博客网 时间:2024/04/30 01:07
概述
EventCenter是Async异步消息通信的核心模块,通过事件/回调模型向上提供异步消息通信,每个Async下的worker线程负责处理一个EventCenter的事件集合。EventCenter针对不同类型的事件使用不同的事件监听来处理事件回调。
详细设计
事件类型
目前EventCenter共支持4种类型的事件,每个worker线程在进入事件处理逻辑的时候,会分别对这4种事件类型的事件进行处理
- file_events:fd类事件
- time_events/event_map:定时器类事件
- external_events/external_num_events:外部事件(时间为0的定时事件)
- pollers:轮询类事件(目前是DPDk模块在使用)
事件操作
event_center对外提供创建/删除:fd、time、external 3种类型的事件,poller事件则需要EventCenter::Poller的派生类自行实现poll方法。下面介绍下4种事件的监听方式:
fd类事件
支持dpdk、epoll、kqueue、select4种监听方式。以epoll为例子,则是封装的epoll_create/epoll_ctl/epoll_wait接口来向EventCenter提供监听操作接口。(定义在EventEpoll.cc/h)
time类事件
通过定时器来监听
外部事件
外部事件实际上是定时时间为0的时间,也就是立马执行,设计这个事件的主要目的切换线程上下文,来避免死锁问题。
- pollers
派生类的poll轮询
事件的处理
每个worker的线程负责处理EventCenter的底层监听事件集合,因此对EventCenter事件的处理主要在每个worker的线程函数,每个事件的处理逻辑如下:
- 处理fd类事件
通过底层epoll_wait取得可以处理的事件集合,然后再根据注册的读写事件分别调用对应的cb(不会主动将已经注册的事件去除掉,需要上层连接调用注销事件才能删除fd类事件)。
处理time类事件
检测时间是否到达,到达则调用对应cb处理external_events
external_events类事件,不需要条件,只要有,就处理,重点在于:会清空外部事件。处理pollers
调用每个poolers[i]->poll()方法来轮询
Pipe管道设计
fd类事件的监听方式,比如epoll,在使用epoll_wait的时候可能存在阻塞(timeout)会使线程睡眠,对于有些需要马上处理的消息,则线程无法及时处理,因此center就设计了一对Pipe管道,通过监听管道的写事件来唤醒睡眠的线程。管道的创建是在EventCenter初始化的时候
EventCenter::init(...) ..... notify_receive_fd = fds[0]; notify_send_fd = fds[1];
在启动worker线程处理的时候,会在set_owner接口里面创建管道的读端监听事件。
notify_handler = new C_handle_notify(this, cct); int r = create_file_event(notify_receive_fd, EVENT_READABLE, notify_handler);
管道的写端则是在wakeup接口里面
int n = write(notify_send_fd, &buf, sizeof(buf));
因此通过这种机制就可以唤醒线程
global_center设计
global_center是为了维护一个全局的EventCenter表,它通过单例模式来实现一个唯一的全局变量。具体实现是:在启动每个worker线程处理的时候,每个worker都会调用
EventCenter::set_owner
这个接口来设置owner属性和添加EventCenter给global_center表
事件回调的设计
EventCenter封装了事件的回调基类EventCallback/EventCallbackRef,对于上层使用者来说,注册的事件回调必须是这个基类的派生类,封装这个基类最主要的逻辑是调用do_request接口,因此每个事件回调核心实现都在其do_request里面去实现即可。
结束
EventCenter的设计模型还是比较简单,但是是Async模块实现异步通信的核心,下个章节来介绍Async中间通信模型。
涉及源码:${ceph}/src/msg/async/Event*
- Ceph源码分析之Async模块:1、异步通信核心模块EventCenter+Epoll
- Ceph源码分析之Async模块:2、上层通信模型
- Nginx源码分析-Epoll模块
- Nginx源码分析-Epoll模块
- Nginx源码分析-Epoll模块
- Nginx源码分析-Epoll模块
- Nginx源码分析-Epoll模块
- Nginx源码分析-Epoll模块
- Nginx event核心模块之epoll模块详解(一)
- Nginx event核心模块之epoll模块详解(二)
- Nginx event核心模块之epoll模块详解(三)
- async模块的异步处理
- ceph源码分析之消息通信机制
- 430之通用异步串口通信模块
- Node.JS核心模块之module分析
- Nginx源码分析 - Event事件篇 - epoll事件模块
- nodejs模块小记之--async
- 核心模块之事件模块
- 阿里笔试_ //如果有人n分钟内,连续发帖M次,将本人封杀掉
- Java入门教程之图书管理系统(由简入繁)(三)
- Linux运维第二十二讲
- struts2使用html的布局
- 设计一个一百亿的计算器
- Ceph源码分析之Async模块:1、异步通信核心模块EventCenter+Epoll
- 性能优化:使用SparseArray和ArrayMap代替HashMap
- K-means之C++及OpenCV实现
- UVa 12435
- C++利用vector容器实现最大最小元问题
- make your own phpstorm epa
- Something about Telephone Interview
- 21 Essential JavaScript Interview Questions
- 博客