Chức năng chính của file này là xử lý các tham số dòng lệnh và lưu vào một mảng tĩnh để xử lý sau.
Về mặt cấu trúc trong file chứa class MainWrapper là class chứa hàm
public static int Main(String[] args) sẽ được gọi đến đầu tiên khi chạy
chương trình. Ngoài ra, trong lớp này còn khai báo một mảng tĩnh public static
ArrayList cmdline_arguments dùng để lưu giá trị các tham số dòng lệnh. Nhiệm vụ chính trong hàm Main là đọc vào các tham số dòng lệnh, lưu nó vào mảng tĩnh đã được khai báo ở trên (chi tiết các tham số và ý nghĩa của các tham số có thể xem cụ thể trong file mã nguồn), sau đó tạo ra một thực thể new
WorkloadProcessor(workload_file) để xử lý file nằm trong thư mục workloads đã nói ở trên. Nội dung chi tiết về WorkloadProcessor sẽ được nêu ngay sau đây.
4.2.2. File WorkloadProcessor.cs:
Chức năng của file này là đọc nội dung file workload (*.wl), dịch nội dung các dòng tương ứng thành các chức năng hoặc gán tham số cho chương trình, tạo ra một thực thể Simulator và khởi động vòng lặp để xử lý các sự kiện của chương trình mô phỏng
Về mặt cấu trúc, trong nội dung của file mã nguồn chỉ có 3 phương thức:
void ProcessWorkload(string workloadfile): Đọc vào nội dung của file workload theo từng dòng, bỏ qua những dòng nào bắt đầu bằng kí tự ‘#’ (kí tự # để chỉ những dòng đó chỉ là những dòng chú thích), gọi phương thức GetTimeOfJob để lấy ra thời gian lệnh đó được thực hiện và kiểm tra
kiểm tra xem thời gian thực hiện lệnh trong nội dung của dòng đó có còn hiệu lực hay không, nếu còn thì gọi đến hàm ProcessJob để thực hiện.
public void ProcessJob(string jobstring):Xử lý nội dung trong
từng dòng và thực hiện các chức năng tương ứng với từ khóa. Khi xem nội dung của phương thức này, chúng ta có thể hiểu thêm ý nghĩa của các từ khóa chứa trong file workload, đồng thời cũng biết được cách thức viết một dòng trong file workload sao cho chính xác và phù hợp với ý định của mình. Hai từ không thể thiếu khi viết file workload đó là "process_cmdline_args" dùng để chỉ cho chương trình biết cần xử lý các tham số dòng lệnh (đã được xử lý và lưu bởi hàm Main()), và "initialize" dùng để bắt đầu “chạy” chương trình mô phỏng. Thiếu đi 2 từ khóa này thì chương trình mô phỏng không hoạt động được như ý. Như thế, 2 dòng luôn luôn phải có trong file workload “now process_cmdline_args end” là và “now
initialize end” . Ngoài ra còn có từ khóa "setparam" dùng để gán
giá trị các tham số của chương trình. Chi tiết hơn có thể xem trong file mã nguồn. Thông tin và ý nghĩa của các tham số trong chương trình sẽ được nêu trong phần mô tả file SimParameter.cs.
private long GetTimeOfJob(string job): Phương thức đọc lấy
thời gian thực hiện của mỗi dòng lệnh trong file workload (lấy giá trị đầu tiên từ trái sang phải – chính là giá trị time được mô tả trong cấu trúc file workload đầu vào đã nói ở phần trước).
4.2.3. File Sim.cs:
Chứa lớp đại diện cho sự mô phỏng của chương trình, với hàng đợi các sự kiện và xử lý sự theo băng thông.
Về mặt cấu trúc, trong file có chứa 2 lớp và một giao diện:
public interface TimerEvent: Khai báo mẫu cho một sự kiện được xử lý
trong chương trình, để được lưu vào hàng đợi và xử lý, các sự kiện cần tuân theo mẫu này.
public class WorkloadGenerator : Tạo ra các thông số môi trường cho
các thử nghiệm ( ví dụ như sự phân phối băng thông của các nút, thời gian tham gia và rời khỏi mạng của các nút … tùy thuộc các tham số đầu vào).
public class Sim: Đây chính là lớp đại diện cho toàn bộ một chương trình mô phỏng. Trong lớp này cần chú ý đến:
private EventQueue triggers : Cây lưu giữ các sự kiện sẽ được xử lý
của chương trình mô phỏng. Khi chương trình chạy sẽ duyệt cây từ gốc và xử lý các sự kiện.
private SortedList nodes : Chứa danh sách toàn bộ các nút tham gia
trong hệ thống.
public void RaiseSimulationEvent(long ms, TimerEvent
obj): Phương thức thêm một sự kiện vào trong hàng đợi, với đầu vào là nội dung của sự kiện và thời gian diễn ra sự kiện, phương thức này rất quan trọng và được dùng để xây dựng nên hàng đợi của chương trình mô phỏng.
public void AssignBandwidth(Node node): Gán băng thông cho
một nút.
public Node CreateNode(): Thêm một nút vào danh sách các nút và gán
băng thông cho nút đó (chuẩn bị cho một nút tham gia vào mạng).
public void KillNode(Node node): Xóa đi một nút trong danh sách
các nút đã lưu (sử dụng trong trường hợp nút rời khỏi mạng).
public bool ProcessTill: Đây chính là phương thức tạo ra vòng lặp
xử lý cho chương trình mô phỏng. Nó sẽ duyệt lần lượt các sự kiện trong hàng đợi và xử lý cho đến khi hết sự kiện hoặc hết thời gian quy định. Trong phương thức còn có chức năng xuất ra màn hình console một số thông tin về tiến trình thực hiện các thử nghiệm ở các thời điểm nhất định.
4.2.4. File ProtocolMain.cs:
Chứa các sự kiện và chức năng điều khiển chương trình mô phỏng bằng cách đưa vào những sự kiện thích hợp tại những thời điểm hợp lý
Về mặt cấu trúc, trong nội dung file bao gồm các lớp:
public class CreateNodeEvent : TimerEvent: Khai báo và xử lý sự
kiện tạo ra một nút mới. Sự kiện được gọi đến và xử lý khi có một nút tham gia mạng.
public class KillNodeEvent : TimerEvent: Khai báo và xử lý sử kiện
hủy bỏ một nút. Được sử dụng khi muốn một nút rời mạng.
public class ScheduleSomeJoinsEvent : TimerEvent: Khai báo và
public class ProtocolSim: Lớp chính trong file này, định nghĩa các cách thức xảy ra của các sự kiện trong chương trình. Một số phương thức cần chú ý trong lớp này là:
public static void CreateNode(): Tạo ra một nút.
public static void KillNode(Node n): Hủy một nút.
private static void CreateSeeds(int n_seeds): Tạo ra các
seed trong thời điểm bắt đầu (initial seeds).
public static void Initialize(): Bắt đầu chương trình mô phỏng.
public static void ScheduleSomeJoins(): Lập lịch cho toàn bộ
các nút trong quá trình tham gia vào mạng. Các giá trị được sử dụng trong hàm này được thiết lập thông qua các tham số của chương trình.
public static void SchedulePFCJoins(): lập lịch cho các nút
khác tham gia vào mạng. Có thể đọc chi tiết hơn trong phần VIII.A của [4] (phần nói về Post-Flash Crowd), trong khóa luận này, tôi sẽ tận dụng chức năng này để thực hiện các thử nghiệm.
4.2.5. File Node.cs:
Nội dung của file này được xem là “lõi” của toàn bộ hệ thống, trong file có lớp biểu diễn toàn bộ đời sống của 1 nút từ khi được tạo ra và tham gia vào mạng đến khi rời khỏi hệ thống.
Về mặt cấu trúc, trong file có nhiều lớp, nhưng quan trọng nhất vẫn là lớp Node, đó là sự mô phỏng cho mỗi nút tham gia vào hệ thống. và trong lớp này cần chú ý đến:
private LinkCap m_LinkCap : Chứa thông tin về băng thông download
và upload của nút.
private Hashtable m_Connections: Chứa toàn bộ kết nối của nút hiện
tại đến các nút hàng xóm.
private ArrayList m_Uploads : Chứa danh sách các liên kết đang
upload.
private ArrayList m_Downloads : Chứa danh sách các liên kết dang
download.
private PieceInfo[] m_PieceInfoArray : Chứa thông tin về toàn
private bool m_AmSeed : Cờ để xác định xem nút có phải là seed hay không.
public Node(Sim s, Oracle ora, int n_pieces) : Phương thức
khởi tạo, trong này cho ta một cái nhìn tổng quan về một nút, và giá trị các thuộc tính của nút khi được khởi tạo.
public void JoinNetwork() : Phương thức biểu diễn các hành động
của một nút khi nó gia nhập vào hệ thống. Và lập lịch cho các hoạt động của nút.
public void BecomeSeed() : Phương thức được sử dụng khi một nút
hoàn thành download và ở lại thành seed trong hệ thống.
private int FindPieceToDownload(Connection conn): Trong
phương thức này có cài đặt quy tắc chọn piece theo Local Rarest First đã nói trong phần cơ chế của BitTorrent.
public float GetTotalDownloadRate(),public float
GetTotaluploadRate(): Trả về tốc độ download và upload của nút.
public void Dump(StreamWriter stream): Phương thức xuất ra
thông tin về một nút, được sử dụng để ghi vào file output *.out.bw.
Ngoài ra còn rất nhiều thuộc tính và phương thức khác, có thể xem trực tiếp trong nội dung file mã nguồn.
4.2.6. File SimParameters.cs
Đây là file liệt kê hầu hết các tham số được sử dụng bởi chương trình mô phỏng. Khi tiến hành các thử nghiệm, cần lưu ý nhiều đến file này.
Về mặt cấu trúc, trong file có chứa lớp chính là public class
SimParameters, trong lớp này có các thuộc tính được dùng làm tham số cho chương trình mô phỏng. Các tham số đã được mô tả khá kĩ trong file mã nguồn, ở đây, ta sẽ liệt kê ra một vài tham số quan trọng:
public static long simulationTime: Tổng thời gian tiến hành một
thử nghiệm
public static long joinTime : Thời gian để các nút tham gia vào hệ
thống.
public static float joinRate : Tốc độ các nút tham gia vào hệ
public static int fileSize : Dung lượng của file sử dụng, tính theo kilobit.
public static int blockSize : Độ lớn của mỗi piece, tính theo
kilobit.
public static double seedLeavingProbability : Tỉ lệ nút rời
mạng sau khi hoàn thành download ( giá trị này luôn nằm trong khoảng từ 0 đến 1).
public static int maxUploads: Số lượng kết nối upload đồng thời
của 1 nút.
public static int nInitialSeeds : Số lượng seed trong thời điểm
bắt đầu mọi sự kiện, các seed này chính là nguồn cung cấp nội dung file cho toàn bộ hệ thống.
4.2.7. Các file khác
Ngoài các file chính ở trên đã nêu, còn có một số file khác trong thư mục mã nguồn như Logger.cs, file này có chức năng chính là tạo ra các file text đầu ra của chương trình hay Choker.cs là file mô phỏng lại chiến lược TFT của BitTorrent …
Chương 5. Các thí nghiệm mô phỏng và đánh giá