天天看點

P2Psim分析筆記(4)-Topology 和Network

  在上篇的分析理,taskmain的第三步是讓Topology類來分析topology_file,進而啟動了Network對象。這次,我主要介紹這部分的詳細流程。主要内容包括對Topology類以及子類Euclidian拓撲類的機制分析,Failure Model類以及Network類的互動。搞清楚這些,基本就把P2PSim的啟動機制搞清楚了。按照慣例,我在這裡給出了所涉及的流程的大體流程圖。

P2Psim分析筆記(4)-Topology 和Network

    這部分的調用是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執行個體開了一個channel(libtask中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函數。圖中的黃綠色箭頭表示出這個聯系。