本文在我的博客《查理的书架》最早发布,并在第一时间更新到51CTO的《Nathan的技术空间》上。
   这是我整理P2PSim这个仿真软件包的第二篇笔记。第一篇是《P2PSim在g++ 4.3下的编译》,在第一篇里面介绍了P2PSim 0.3在编译和按照中的碰到的问题以及解决方式。本篇主要给出P2PSim的实现架构,帮助需要进行代码分析的朋友对P2PSim能有个大体的构架了解。在些这篇时候,作者也还未完成对整体代码的通读,所以对全局的掌握还不充分,如有错误,请各位指出和包涵。

P2PSim简述
    这是一个比较简单的p2p模拟软件包,是MIT的一个老兄搞的玩也。在2006年出了最后一版0.3后再没更新了。需要的朋友可去 http://pdos.csail.mit.edu/p2psim/下载。国内不少paper用这个软件包来做仿真,网上也有不少的代码分析笔记,比较详细的是kikiKind在CSDN上的p2psim学习笔记,但是写到后来就晦涩难懂了,完全不是给旁人看的。他给出了p2psim中类的继承关系图,以及关于vividi这个错误的fix。那个类图的资料在P2Psim的官网上很难找到链接了,所以这是kikikind朋友的最大贡献。但是他给出的贴图却是错误的,把第一张图贴了两遍,第二张图给漏了。然后所有网络转载都一样错。此外我在g++ 4.3上碰到更多的错误,他都没有提及,因此不是很全面,此外他在对libtask以及main函数的分析都很粗略,让人很难跟。综合来说,这个笔记是他写给他自己看的,而不是给网友看的。我个人不是很满意,所以我在这把他所遗漏和错误的地方都补上。希望对各位有用。在本篇笔记里面,我从便于各位读者理解学习的顺序来组织内容,而不是从代码分析的学习次序来说明。
    首先是P2Psim的实现基础。这个软件包的实现是基于单进程多任务方式工作的。他本质上是基于一个叫LibTask的C语言软件包来实现在单个进程内进行多个任务的调度和切换。这个包在他的源代码的/libtask目录下。 这个包是MIT开发的,目前在google code的网站上有登记,地址是 http://code.google.com/p/libtask/,可以在这个网站上查到这个库的基本api的说明。可以直接看这个说明来理解这个库的实用,而不需要去看/libtask目录下的代码来分析到底这个库在做什么。此外,在P2PSim里面,作者把这个库封装到了Threadmanager和Thread两个类。前者Threadmanager用来封装全局的task的pool的,而后者封装了各个task的api。这样P2PSim就实现了C++这级的多任务调度。
    其次,我把kikikind老兄的类继承图重新贴一遍,来帮助大家理解程序架构。在这个图里面,我们看到从threaded类一共派生出EventQueue, Network,和EventGenerator三个类,这三个类就是程序在运行时候的3个主要并发任务。
P2Psim分析笔记(2)-程序架构简述_第1张图片
 
P2Psim分析笔记(2)-程序架构简述_第2张图片
P2Psim分析笔记(2)-程序架构简述_第3张图片
至于图中的其他部分,等以后的具体分析的时候再慢慢说明。
    因此,综上所述,P2Psim是一个根据libtask所提出的架构所写的一个程序,因此在/p2psim目录下,main.c程序里面没有main函数,而是taskmain函数,这个函数会被libtask作为第一个task而调用启动,功能类似main函数,连调用参数都差不多。然后在这个taskmain中,间接建立了上述其他几个并发任务。
    到这里,读者应该对p2psim的大体构架有个简单认识了。 下次我打算把taskmain函数里面的初始化顺序介绍一下。