3.4.1 Giới thiệu
Nhƣ phần trên đã đề cập, trong mạng động, hình trạng mạng thay đổi liên tục và không thể dự báo trƣớc đƣợc. Do đó, các giải thuật xây dựng cây khung trong mạng tĩnh, nếu muốn mở rộng hoặc áp dụng cho mạng động, cần phải có sự điều chỉnh để đáp ứng lại sự thay đổi về hình trạng mạng.
Thông thƣờng, các giải thuật trong mạng động có thể đƣợc xây dựng bằng cách cải tiến các giải thuật tƣơng ứng trong mạng tĩnh theo mô hình sau đây:
- Áp dụng giải thuật trong mạng tĩnh tƣơng đƣơng để giải quyết bài toán
một cách bình thƣờng
- Khi phát hiện ra sự thay đổi trong topo mạng, tìm cách hủy toàn bộ kết
quả đạt đƣợc và khởi động lại thuật toán từ đầu.
Cách tiếp cận này đơn giản, dễ cài đặt các thuật toán trong mạng động dựa vào những thuật toán đã đƣợc nghiên cứu trong mạng tĩnh. Tuy nhiên, tính hiệu quả của phƣơng pháp này không cao. Nếu thuật toán tƣơng ứng trong mạng tĩnh có độ phức tạp lớn, thì độ phức tạp để đáp ứng với mỗi thay đổi trong topo mạng cũng lớn tƣơng ứng.
Nếu sử dụng phƣơng pháp này trong bài toán xây dựng cây khung tối thiểu, với mỗi thay đổi trong hình trạng mạng, toàn bộ cây khung sẽ bị hủy (kể cả khi cây khung đã xây dựng xong), thuật toán sẽ phải khởi động lại từ đầu để xây dựng cây khung mới. Nhƣ phần trên đã chứng minh, các thuật toán xây dựng cây khung phân tán hiện nay đều có độ phức tạp là O(E) (với E là số liên kết trong mạng). Vì vậy, độ phức tạp đáp ứng với mỗi thay đổi trong mạng trong trƣờng hợp này là O(E).
Nhƣợc điểm của phƣơng pháp trên là tính thiếu hiệu quả do không tận dụng đƣợc những kết quả đã có trong các lần thực hiện thuật toán trƣớc. Với mỗi sự thay đổi dù nhỏ trong hình trạng mạng, toàn bộ kết quả của thuật toán sẽ bị hủy. Vì vậy, nhóm tác giả Baruch Awerbuch, Israel Cidon, Shay Kutten đã đề xuất giải thuật Optimal Maintenance of a Spanning Tree (OMST)[12], đƣa ra một cách tiếp cận khác cho bài toán xây dựng cây khung trong mạng động. Bằng cách sử dụng lại những thành quả xây dựng cây khung đã đạt đƣợc, mỗi khi có
thay đổi trong mạng, các nút chỉ cần đáp ứng lại bằng cách thay đổi một số trạng thái của mình cho phù hợp, chứ không thay đổi tất cả hình trạng. Nhờ đó, độ phức tạp của phƣơng pháp này đối với mỗi thay đổi trong mạng giảm xuống con O(V) (V là số nút trong mạng). Tất nhiên, độ phức tạp khi xây dựng cây khung ban đầu vẫn là O(E).
3.4.2Tƣ tƣởng của giải thuật OMST
Thuật toán OMST đƣợc sử dụng để xây dựng cũng nhƣ bảo trì cây khung tối thiểu trong mạng động. Tƣơng tự nhƣ giải thuật GHS-83 trong mạng tĩnh, giải thuật này cũng dựa trên tƣ tƣởng kết hợp dần các mảnh MST lại thành cây MST. Các mảnh MST đƣợc kết hợp lại bằng cách chọn ra các liên kết ngoài có trọng số tối thiểu.
Tuy nhiên, nếu chúng ta chỉ sử dụng phƣơng pháp của giải thuật xây dựng cây khung tối thiểu trong mạng tĩnh, thì khi có một sự thay đổi trong hình trạng mạng, cây khung trong mạng có thể bị ảnh hƣởng và các nút trong mạng sẽ không có cơ sở nào để đáp ứng lại những thay đổi đó. Giải thuật OMST cố gắng phục hồi lại cây khung bị đứt gãy hoặc thay đổi hình trạng mạng, dựa trên thông tin về cây khung trƣớc lúc thay đổi, chứ không tìm cách xây dựng lại cây khung từ đầu
Để lƣu trữ thông tin về cây khung, giải thuật OMST đƣa ra một cấu trúc dữ liệu đặc biệt để lƣu trữ trên mỗi nút, sử dụng để khôi phục lại cây khung trong trƣờng hợp có những thay đổi trong mạng, gọi là “rừng ảo” và “cây ảo”:
- Rừng ảo”(forest replica) là một cấu trúc dữ liệu trên một nút, lƣu trữ
thông tin các liên kết trong cây MST hiện thời (rừng thật) của hệ thống. Nhƣ vậy, “rừng ảo” là một bản sao của cây MST hiện thời, đƣợc lƣu trữ trên một nút. Tất nhiên bản sao này có thể không hoàn toàn giống nhƣ cây MST thật (do hệ thống phân tán và các nút không biết trạng thái toàn cục trong mạng), nhƣng mỗi nút sẽ cố gắng xây dựng “rừng ảo” giống cây MST thật nhất có thể.
- “Cây ảo” (tree replica) là một cây con thuộc “rừng ảo” đƣợc lƣu trữ trên
Hìn h 12: “Rừng ảo” lƣu tại nút u
Nhƣ trên hình 12, nút u lƣu một “rừng ảo” bao gồm hai cây ảo. Một cây bao gồm 3 liên kết (u, v)(v, q)(q, w) và một cây (x,y). Trong đó, liên kết (x, y) không thuộc cây MST thật, nhƣng vẫn tồn tại trong “rừng ảo” của nút u.
Mỗi nút trong hệ thống sẽ lƣu một “rừng ảo” trong bộ nhớ cục bộ. “Rừng ảo” sẽ là cơ sở để các nút thực hiện thủ tục tìm kiếm liên kết ngoài tối thiểu cũng nhƣ kết hợp các mảnh MST lại với nhau. Vì vậy, trong quá trình thực hiện thuật toán, “rừng ảo” sẽ đƣợc đảm bảo sao cho giống “rừng thật” (cây MST hiện thời) nhất có thể.
Giải thuật OMST duy trì cấu trúc dữ liệu “rừng ảo” nhằm giảm độ phức tạp trong quá trình tìm kiếm liên kết ngoài có trọng số tối thiểu. Hai thủ tục quan trọng nhất trong giải thuật và liên quan trực tiếp đến cấu trúc dữ liệu này là UPDATE và FIND.
- Thủ tục UPDATE: có nhiệm vụ duy trì “rừng ảo” tại mỗi nút giống với
“rừng thật”. Với mỗi thay đổi trong topo mạng, thủ tục UPDATE sẽ đƣợc gốc của mỗi mảnh MST gọi, và các nút trong mạng sẽ thực hiện các thủ tục LOCAL_UPDATE để điều chỉnh lại “rừng ảo” của nút đó cho giống với “rừng thật”. Ta có thể chứng mình đƣợc, sau khi thực hiện thủ tục UPDATE, “cây ảo” của một nút u trong hệ thống sẽ giống hệt mảnh MST chứa u.
- Thủ tục FIND: dựa vào “rừng ảo” tại mỗi nút, các nút sẽ tìm đƣợc liên kết ngoài tối thiểu cục bộ và gửi về cho nút gốc. Từ đó, nút gốc sẽ chọn ra đƣợc liên kết ngoài tối thiểu của mảnh và thực hiện các biện pháp ghép mảnh.
Do mỗi nút có lƣu trữ “rừng ảo” trong bộ nhớ, thủ tục tìm kiến liên kết ngoài tối thiểu cục bộ sẽ có độ phức tạp thông báo là 0. Mỗi nút sẽ gửi thông báo cho nút gốc dọc theo mảnh MST hiện thời sau khi tìm kiếm xong. Vì vậy, độ phức tạp thông báo của thủ tục FIND là O(V). Đối với thủ tục UPDATE, chúng ta sẽ nghiên cứu kỹ cấu trúc dữ liệu và cách cài đặt của thủ tục này ở phần tiếp theo. Thủ tục này cũng có độ phức tạp là O(V).
Ngoài hai thủ tục UPDATE và FIND, trong giải thuật OMST còn một số thủ tục khác tƣơng tự giải thuật GHS-83 để xây dựng cây khung tối thiểu:
Thủ tục chuyển gốc CHANGE_ROOT: Sau khi tìm đƣợc liên kết ngoài
tối thiểu của mảnh, gốc của mảnh sẽ đƣợc chuyển xuống nút có liên kết ngoài đó. Việc chuyển gốc sẽ giúp quá trình kết hợp mảnh dễ dàng hơn.
Thủ tục kết hợp mảnh MERGE: Có thay đổi so với thủ tục tƣơng ứng
trong thuật toán GHS-83 để tránh tình trạng deadlock. Trong thủ tục này, khi 2 mảnh MST chọn 1 liên kết ngoài chung, mảnh có ID nhỏ hơn sẽ tiến hành việc yêu cầu kết nối. Giả sử mảnh u trong liên kết ngoài tối thiểu (u, v) có ID nhỏ hơn. Khi u trở thành gốc (qua thủ tục chuyển gốc), nó sẽ gửi 1 thông báo Request qua liên kết (u, v). Khi thông báo đến v, nút v có thể hoặc không phải là gốc, nhƣng vẫn tạm chấp nhận thông báo Request này. Đợi tới khi cây chứa v tìm thấy liên kết (u, v) và chuyển gốc lại cho nút v. v sẽ gửi một thông báo Accept lại cho u. Sau đó mới tiến hành kết hợp hai mảnh qua liên kết (u, v). Những trƣờng hợp thay đổi topo mạng trong quá trình kết hợp mảnh sẽ đƣợc xem xét sau đây.
Thủ tục xử lý khi cấu hình mạng thay đổi: Khi một liên kết trong mảnh
MST nối từ nút con đết nút cha bị đứt, nút con sẽ hủy bỏ liên kết này, trở thành gốc của mảnh mới và thực hiện các thủ tục để tìm liên kết ngoài nhỏ nhất nhƣ với các gốc thông thƣờng. Nếu thay đổi xảy ra trong quá trình thực hiện các thủ tục UPDATE và FIND, các nút sẽ có những biện pháp cụ thể để xử lý tƣơng ứng, tránh tình trạng deadlock. Ví dụ, khi một liên kết giữa nút cha và nút con bị đứt, nút cha sẽ không đợi thông báo phản hồi từ nút con qua liên kết này nữa. Các trƣờng hợp thay đổi cấu hình
mạng khác nhƣ các liên kết phục hồi lại, các liên kết ngoài bị đứt đều không ảnh hƣởng gì đến việc thực hiện thủ tục UPDATE và FIND.
Thủ tục xử lý khi cấu hình mạng thay đổi trong quá trình kết hợp mảnh:
Với các thuật toán trong mạng tĩnh thông thƣờng, khi một mảnh chọn đƣợc liên kết ngoài có trọng số nhỏ nhất, liên kết này sẽ không bao giờ bị thay đổi, và gốc của mảnh chỉ cần đợi cho đến khi nó đƣợc hấp thụ bởi một mảnh khác. Tuy nhiên trong mạng động, khi một mảnh đã chọn đƣợc liên kết ngoài tối thiểu, các liên kết bị đứt từ trƣớc có thể hồi phục, khiến cho liên kết đã chọn không còn có trọng số nhỏ nhất nữa, nhƣ minh họa ở hình 13, 14. Điều này nếu không đƣợc xử lý, sẽ dẫn đến tình trạng khóa chết trong giải thuật, khi 2 mảnh chọn ra 2 liên kết ngoài khác nhau và không thể kết hợp lại đƣợc.
Hình 13: Mảnh A chọn liên kết ngoài có trọng số 2
Hìn h 14: Mảnh B chọn liên kết ngoài có trọng số 1 (mới đƣợc thêm vào)
Vì vậy, giải thuật OMST đƣa ra phƣơng án giải quyết thông qua thủ tục ALERT. Khi một nút nào đó phát hiện thấy cấu hình mạng thay đổi, nó sẽ gửi
thông báo Alert tới cho gốc. Điều này cho phép gốc của cây biết rằng, cạnh ngoài có trọng số nhỏ nhất có thể đã bị thay đổi.
- Nếu gốc chƣa gửi thông báo Request, nó sẽ thực hiện lại việc tìm kiếm
cạnh ngoài nhỏ nhất từ đầu.
- Nếu gốc đã gửi thông báo Request và đã nhận đƣợc Accept, thông báo
Alert bị bỏ qua. Vì sau khi ghép 2 cây, gốc của cây sẽ tự động thực hiện Update.
- Nếu gốc đã gửi thông báo Request (và chƣa nhận đƣợc Accept), nó sẽ gửi
một thông báo Cancel cho mảnh kia.
o Nếu mảnh này đã gửi thông báo Accept, thì nó sẽ bỏ qua thông báo
Cancel, khi đó 2 mảnh sẽ vẫn đƣợc kết hợp lại làm một (Tƣơng tự trƣờng hợp đã nhận đƣợc Accept bên trên).
o Nếu mảnh này chƣa gửi Accept, nó sẽ gửi một thông báo Canceled,
chấp nhận việc hủy bỏ thông báo Request đã nhận đƣợc, nút gốc nhận đƣợc Canceled sẽ tiến hành tìm kiếm lại liên kết ngoài tối thiểu.
3.4.3 Chi tiết giải thuật OMST
Cũng giống nhƣ giải thuật GHS-83, các mảnh MST trong quá trình thực hiện giải thuật cũng liên tục tìm kiếm liên kết ngoài có trọng số tối thiểu qua thủ tục FIND. Sau đó tiến hành ghép các mảnh lại với nhau qua các liên kết đó. Quá trình này đƣợc lặp đi lặp lại cho tới khi chỉ còn một mảnh duy nhất, chính là cây khung của hệ thống.
Trong giải thuật chính, ngoài việc tìm kiếm các liên kết ngoài tối thiểu qua thủ tục FIND, các nút còn phải thực hiện thủ tục UPDATE để cập nhật lại cấu trúc dữ liệu của mình. Thủ tục UPDATE đƣợc gọi khi có thay đổi trong topo mạng hoặc trƣớc khi chúng ta tiến hành ghép mảnh. Lƣu ý, thủ tục UPDATE luôn đƣợc thực hiện trƣớc thủ tục FIND nhằm đảm bảo quá trình tìm kiếm diễn ra chính xác.
a) Thủ tục UPDATE
Thủ tục UPDATE là một trong hai thủ tục quan trọng nhất trong thuật toán. Nhiệm vụ của thủ tục này là cập nhật lại cấu trúc dữ liệu “rừng ảo” tại mỗi nút sao cho “rừng ảo” giống “rừng thật” (cây khung hiện tại) nhất có thể. Chúng ta có thể chứng minh đƣợc, sau khi thực hiện thủ tục UPDATE, ít nhất “cây ảo” của một nút sẽ giống hệt nhƣ mảnh MST chứa nút đó. Nhờ vậy, thủ tục FIND có thể tìm đƣợc liên kết ngoài tối thiểu của mảnh.
Để giảm độ phức tạp thông báo trong thủ tục UPDATE, mỗi nút không chỉ lƣu “rừng ảo” của nút mình, mà còn lƣu một tập “rừng ảo” của tất cả các nút
khác trong hệ thống. Cụ thể, mỗi nút sẽ lƣu lại một mảng Forest[] bao gồm toàn
bộ các “rừng ảo” của các nút khác mà nó biết trong mạng. Forest[u] là một bản
sao “rừng ảo” của nút u. Để tránh nhầm lẫn, chúng ta dùng ký hiệu Forestv[u] là
bản sao “rừng ảo” của nút u đƣợc lƣu tại nút v. Nhƣ vậy, một “rừng ảo” của nút nào đó có thể đƣợc lƣu ở toàn bộ các nút khác trên mạng. Các bản sao cục bộ này sẽ đƣợc điểu chỉnh cho khớp với nhau thông qua thủ tục UPDATE.
Thủ tục UPDATE đƣợc xử dụng để thay đổi “rừng ảo” tại mỗi nút cho khớp với “rừng thật”. Trong thủ tục này, mỗi nút sẽ tìm cách gửi các thông tin về “rừng thật” cho các nút lân cận của nó. Ví dụ, một nút thấy liên kết kề với mình vừa bị đứt, nó sẽ gửi một thông tin báo cho các nút lân cận về thay đổi
- Khi một liên kết trong cây khung bị mất:
o Thực hiện thủ tục loại bỏ liên kết này tại hai đầu của liên kết.
- Khi hai mảnh kết hợp với nhau hoặc topo mạng thay đổi:
o Gọi thủ tục UPDATE, sau đó gọi thủ tục FIND.
- Khi hai mảnh chọn chung một liên kết ngoài:
o Hai mảnh thực hiện thủ tục UPDATE riêng rẽ.
o Kết hợp hai mảnh lại làm một qua liên kết ngoài đó.
này. Các thông tin này sẽ đƣợc tính dựa vào các phiên bản “rừng ảo” lƣu tại nút đó.
Tuy nhiên, vấn đề phức tạp ở đây là: khi hai nút kề nhau không “đồng ý” về thông tin của “rừng ảo”, hay hai nút không biết thông tin của nút nào là chính xác hơn. Vấn đề này có thể giải quyết dựa vào khái niệm “phía” của một nút nhƣ sau:
- Xét một liên kết (u, v) trong một mảnh MST. Khi bỏ đi liên kết này, sẽ
đƣợc hai mảnh MST phân biệt, một mảnh chứa u và một mảnh chứa v. Ta định nghĩa một nút hay một liên kết trong mảnh là “phía u” nếu nút hay liên kết này thuộc mảnh MST chứa u. Ngƣợc lại, nó sẽ là “phía v”.
Khi hai nút u, v gửi thông tin về “rừng ảo” cho nhau, chúng sẽ dựa vào “phía” để xác định xem thông tin nào là chính xác hơn. Các thông tin về liên kết phía u lƣu tại u sẽ chính xác hơn những thông tin này khi lƣu tại v. Hay những thông tin phía u bao giờ cũng đến u trƣớc rồi mới đến v. Vì vậy, trong thủ tục UPDATE, một nút chỉ cần gửi thông tin về phía mỉnh cho các nút lân cận để cập nhật.
Thủ tục UPDATE sẽ đƣợc gọi tại nút gốc, khi đó nút gốc sẽ gửi các yêu cầu UPDATE đến lần lƣợt các nút khác trong mạng. Mỗi nút khi nhận đƣợc yêu cầu UPDATE từ nút cha, ngoài việc gửi yêu cầu này cho nút con, chúng sẽ gọi một thủ tục LOCAL_UPDATE để cập nhật thông tin cho các nút lân cận. Thủ tục này còn đƣợc gọi khi một nút nhận đƣợc các thông tin có ích từ nút khác.
Chi tiết thủ tục LOCAL_UPDATE nhƣ sau:
Với mọi k: (v, k) thuộc cây và Forestv(k) khác rỗng:
- Gửi thông báo DIFF(diff(k)) cho nút k
- Forestv(k) = Forestv(k) + diff(k)
Khi nhận đƣợc một thông báo DIFF (Add, Del) từ nút k
Forestv(v) = Forestv(v) + Add – Del
Bảng 2: Thủ tục LOCAL-UPDATE
Thủ tục LOCAL-UPDATE có sử dụng một số hàm và thủ tục hỗ trợ:
- Thủ tục diff(k)
(Tham số k: nút kề cần được cập nhật, trả lại 2 thông tin Add, Del)
(Trả về Add: các liên kết cần phải được thêm vào “rừng ảo” của nút k, theo ý kiến của nút v. Del: các liên kết cần phải được xóa khỏi “rừng ảo” của