SEDA源码解读(二)



接着上一篇的话题,本篇继续探讨SEDA的实践项目——sandstorm。

首先,看看package里面的类文件:



                       

ResponseTimeControllerIF:该接口代表一个响应时间的控制器,通常情况下被stage的线程管理器执行,以执行事件准入控制策略来达到特定响应时间的目标。

StageStatsIF:该接口允许各种各样的系统组件在执行时记录以及收集关于stage的统计。

StageWrapperIF:它是一个应用程序stage的内部表示,一个applicationstage包含一个event handler和一组队列集合。

SystemManagerIF:它是一个内部接口,允许模块访问系统级别的特性。比如现在,它允许一个模块访问、创建、销毁一个线程管理器。它也允许一个模块创建一个属于它自己的stage。

ThreadManagerIF:该接口表示在跨一系列的stage上用来创建、管理以及调度线程。

接下来,我们再来看一下package:seda.sandstorm.core:
              

注:由于该package主要提供了对于api包中一些接口的实现,为了关系图的清晰,这里就没有再画出各个组件之间的关联关系。

BufferElement:可以看到该类实现了接口QueueElementIF,我们曾经在第一篇说过,每个事件都必须实现QueueElementIF接口,而这里我们可以将该类理解为一个事件的内存缓冲区(即一个事件的内存表示)。

NullElement:这是一个空事件,它可以在信号(第一篇有描述)中使用。

FiniteQueue:从图中的继承关系我们就可以看出,它是一个可监控的队列的实现(关于两个接口的说明,参见第一篇)。它用一个linked list实现了一个简单的队列。

MulticlassRateLimitingPredicate:该入队断言实现了多级输入速率策略。

QueueThresholdPredicate:该入队断言实现了关于队列大小的阈值策略。

RateLimitingPredicate:该入队断言实现了输入速率策略。

SimpleSink:它是一个抽象类,从继承关系可以看出,它实现了一个可监控的“队列槽端”(SinkIF),但它对于SinkIF大部分的管理方法都没有给予实质的实现。该类可以被继承,以实现简单的SinkIF(对于所有通常的案例大部分不需要有特殊的行为)。

ssLinkedList:它只是linked list的一个抽象,以支持非常有效的插入和删除,就如同一个枚举接口一样。该linked list中没有方法是同步的。

ssLinkedListComparator:该接口允许你查找ssLinkedList里面的元素。

ssLinkedListEqualityComparator:该类实现了ssLinkedListComparator以为ssLinkedList提供一个匹配对象的比较器。

ssTimer:该类给注册定时器事件提供一种方案,定时器事件将在未来的某个时间消失。未来的某个时间可以被标识为相对的或者绝对的。当定时器倒计时结束,一个事件会被放入队列。这里,没有办法取消一个定时器。事件将被提供保证,但它们提供的时间可能是“可变动的”,这取决于如何加载系统等。

TimeStampedEvent:这是一个对于那些希望追加一个时间戳的事件而产生的超类。它可以被用来记录和控制。

总结

上一篇我们梳理了api包。本篇梳理api.internel以及core包。总的来说,api提供了一些最基本的基层接口。

而本篇谈到的这两层,在api包上面提供了一些特定的实现。

三个包的关系如下:
                    

论文地址:

http://www.eecs.harvard.edu/~mdw/papers/seda-sosp01.pdf

项目源码见第一篇中的链接:

http://blog.csdn.net/yanghua_kobe/article/details/7423977



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