本篇,我们继续来看看seda的开源项目sandstorm,这次我们主要关注aDisk包的实现:

AFile-通过上一篇我们对SimpleSink的介绍可以看出这是一个对于队列“槽端”的实现,事实上你会发现它并没有真正提供实现,这是一个文件对外的异步访问接口。既然它实现了SinkIF(因为SimpleSink实现了该接口,所以被其继承),那它就可以入队所有对于某一文件的特定请求。

AFileImpl-该类是一个内部类,只提供了包级别的访问权限,它表示了对于AFile的“实现”。这里实现之所以加引号,意思是这里并没有提供真正的实现,它其实还是一个抽象类,定义了一些接口方法而已。真正的实现类会继承该抽象类。

AFileTPImpl-它就是真正的实现类,继承自AFileImpl,它内部有一个队列用来存储事件。并且它使用一个线程池在文件上执行阻塞的I/O。从图上可以看到它同时还实现了QueueElementIF接口,说明它可以是一个事件。

备注:从图上可以看到AFile与AFileImpl都继承了SimpleSink,而AFileTPImpl继承自AFileImpl。感觉关系有些乱了。我之前看也是这么认为,但仔细看了之后,其实会发现,还是有些合理的。AFile是一个文件对外的“接口”,包含了对于文件的操作,这些方法内部都是调用了AFileImpl的实现者处理的,而具体调用哪个实现者并不是它关系的问题,应该由管理器来负责。这里共同的目的都是为了保证AFile的简单,纯粹以及内部实现的可扩展性。

下面列出了,对于文件操作的一系列事件:

这里有两个抽象的事件基类:AFileRequest、AFileCompletion,他们都实现了QueueElementIF接口。

先介绍一下这两个抽象事件基类:

AFileRequest-它代表I/O请求的抽象基类,能够入AFile的enqueue()方法。

AFileCompletion-它表示I/O完成事件的抽象基类

AFileRequest的派生类:

AFileReadRequest-表示文件的读请求;

AFileWriteRequest-表示文件的写请求;

AFileFlushRequest-对于一个给定的文件,flush所有的I/O 事件

AFileSeekRequest-对于一个给定位置的给定文件,的查找事件

AFileCloseRequest-关闭一个给定的文件要触发该事件

AFileCompletion的派生类:

AFileIOCompleted-完成事件包括了对于之前的一个I/O请求已经完成

AFileIOExceptionOccurred-该完成事件包括在引发I/O请求时产生的IOException

AFileIOExceptionOccurred-一个在给定的文件上执行I/O操作但已经到达EOF位置的完成事件

AFileTPEventHandler-它是一个事件处理器(实现了EventHandlerIF),用来被AFileTPImpl层调用

AFileTM-内部抽象类,它用来表示一个AFile的线程管理器

AFileTPStageWrapper-它是AFileTPImpl的包装实现,实现了StageWrapperIF。(事实上该StageWrapper并没有一个真实的事件队列,AFileTPTM创建的线程将给予每个AFile提供队列)

AFileTPTM-它继承了TPSThreadManager,同时实现了ThreadManagerIF以及ProfilableIF接口。

(注:TPSThreadManager同样实现了ThreadManagerIF接口,它提供了每个stage,每个source有一个线程池的线程管理器)。它是一个为AFileTPImpl提供的ThreadManager,它管理一个用来在磁盘文件上执行阻塞I/O的线程池。

AFileMgr-它是一个内部类,用来给Sandstorm运行时和aDisk类库之间提供一个访问接口。应用程序不应该使用该类。

其实,作为磁盘I/Ostage的实现,它基本包含了对几个核心package的实现(api/api.internal)。它们大致的对应关系如下图所示:

SEDA源码解读(三)相关推荐

  1. ORB SLAM2源码解读(三):Frame类

    文章目录 前言 构造函数 双目相机 RGBD相机 单目相机 ExtractORB:提取特征点 ComputeBoW:计算词袋数据 SetPose:设置相机外参 isInFrustum:判断一个MapP ...

  2. SEDA源码解读(二)

    接着上一篇的话题,本篇继续探讨SEDA的实践项目--sandstorm. 首先,看看package里面的类文件: ResponseTimeControllerIF:该接口代表一个响应时间的控制器,通常 ...

  3. Malloc源码解读三——Bins与Arena

    继上一章的了解,我们继续了解我们的malloc.在上一章的了解到了,大部分的宏定义与解释.在这里我们将要看Malloc中Bins与Aerna的整体设计,和一些最新一版Malloc源码修改,不同之处.先 ...

  4. jQuery源码解读三选择器

    直接上jQuery源码截取代码 // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ i ...

  5. BaseRecyclerViewAdapterHelper源码解读(四) 上拉加载更多

    上拉加载 上拉加载无需监听滑动事件,可自定义加载布局,显示异常提示,自定义异常提示. 此篇文章为BaseRecyclerViewAdapterHelper源码解读第四篇,开源库地址,如果没有看过之前3 ...

  6. Bert系列(三)——源码解读之Pre-train

    https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...

  7. faster rcnn源码解读(三)train_faster_rcnn_alt_opt.py

    转载自:faster rcnn源码解读(三)train_faster_rcnn_alt_opt.py - 野孩子的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/u ...

  8. faster rcnn fpn_Faster-RCNN详解和torchvision源码解读(三):特征提取

    我们使用ResNet-50-FPN提取特征 model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True) ...

  9. Bert系列(二)——源码解读之模型主体

    本篇文章主要是解读模型主体代码modeling.py.在阅读这篇文章之前希望读者们对bert的相关理论有一定的了解,尤其是transformer的结构原理,网上的资料很多,本文内容对原理部分就不做过多 ...

最新文章

  1. 参考答案:03 向量空间
  2. 深度学习在工业推荐如何work?Netflix这篇论文「深度学习推荐系统Netflix案例分析」阐述DL在RS的优劣与经验教训...
  3. 基于redis AE异步网络架构
  4. java异常基本知识
  5. python调试_Python调试坑
  6. [转]如何让DIV固定在页面的某个位置而不随着滚动条随意滚动
  7. C语言中忽略scanf的价值,c语言的scanf接收到底是忽略空格还是不忽略呢?
  8. 手机APP脚本录制(LoadRunner 12)
  9. 动网论坛“数据库连接出错”处理记-间歇博客
  10. 浏览器-09 javascript引擎和Chromium网络栈
  11. 整数输入问题一百二十九:阿基米德特性
  12. 《中国人工智能学会通讯》——1.20 聊天机器人研究存在的挑战
  13. Bolt界面引擎元对象(UIObject)的动态创建
  14. c语言延时函数的理解
  15. 火星探险 (Mars)
  16. Array Shrinking
  17. Matplotlib画图之调整字体大小
  18. java邮件附件名称乱码_Java邮件开发(三):解决附件名为乱码及显示友好名称
  19. H.266/VVC-VTM代码学习18-自适应QP设置(Adaptive QP)
  20. **2021,靠谱的网赚项目,遇上靠谱的你,谁说赚钱不轻松**

热门文章

  1. 你有用过 Github 的 Gist 吗?
  2. 那些很棒的 blog and site 优秀的博客和网站推荐
  3. DCL(数据控制语言)和TCL(事务控制语言)
  4. 网站压力测试--abtest测试详解abtest
  5. CA(Certificate Authority)及其伪造的可能性分析
  6. 带滤波器的PID控制仿真-3(Simulink仿真)
  7. 计算机英语nic,计算机与网络英语词汇(N2)
  8. Linux libusb
  9. libusb系列-007-Qt下使用libusb1.0.26源码
  10. 多台电脑共享上网的方法:在Windows XP中设置Internet连接共享