在上篇的分析理,taskmain的第三步是讓Topology類來分析topology_file,從而啟動了Network對象。這次,我主要介紹這部分的詳細流程。主要內容包括對Topology類以及子類Euclidian拓撲類的機制分析,Failure Model類以及Network類的交互。搞清楚這些,基本就把P2PSim的啟動機制搞清楚了。按照慣例,我在這裡給出了所涉及的流程的大體流程圖。
這部分的調用是taskmain函數中的Topology::parse(topology_file)引起的。在pase函數中,首先從topology_file裡面讀出了topology的名字,例如Euclidian拓撲, 以及對應的failure模型。至於failure模型,好像是用來制定數據傳輸中的丟包策略的。這個目前不是我的興趣所在,所以我也懶得去仔細分析了。如果在topology_file裡面不指定的話,在這裡會默認提供一個無丟包的nullfailure模型。
在生成topology和failure模型中,他們的構造函數都不會做什麼特別的工作。然後這兩個對象top和fm被作為參數來構造Network的對象實例。在Network對象的構造中,topology和failure模型會被保存到Network對象裡面。以後只能有Network的實例來訪問了。最後Network對象構造中會調用thread來讓run函數作為一個task來跑。這個函數中,Network實例開了一個channellibtask中task進行通信的機制),然後就不斷從這個channel讀取來自topology對象的Node也就是peer)信息。然後存到自己的_nodes成員中,這個成員是IPaddress 和Node指針的一個map。
最後,Topology::parse)調用了topology對象的parse完成了topology_file的剩余部分的解析。這裡要注意toplogy對象top指針 )是指向Topology類的一個子類的對象,比如Euclidian類的對象。 接下來,我們拿Euclidian拓撲來舉例,這個對象按照
IPaddress x,y
的格式來解析peer在空間中的位置,以及用ipaddress來標識peer。解析出每條記錄,都通過工廠模式,構造出一個Node類的子類的對象,除了保存在自己的_nodes成員中也是一個IPaddress 到node的map),通過channel發送給Network對象的run函數。圖中的黃綠色箭頭表示出這個聯系。
本文出自 “Nathan的技術空間” 博客,請務必保留此出處http://nathanxu.blog.51cto.com/50836/247545