Thuật toán mutual exclusion của Burn

Một phần của tài liệu Nghiên cứu các thuật toán giám sát và xử lý cạnh tranh giữa các thành phần phần mềm trên môi trường phân tán (Trang 55 - 57)

Cả hai thuật toán mà chúng ta đã nghiên cứu từ trước cho tới nay đó là Dijkstra và Peterson, thì đều sử dụng các biến multi-writer (turn) cùng với một tập các biến single- writer ( flag ). Như ta đã đề cập tới ở trên việc triển khai thuật toán đó vào ứng dụng rất khó, chi phí cao và thi hành không hiệu quả các biến chia sẻ multi-writer trong các hệ thống hiện thời (cụ thể là các hệ thống phân tán), các thuật toán mà chỉ sử dụng các biến chia sẻ single-writer thì được triển khai hiệu quả hơn và giành sự quan tâm đặc biệt của các nhà khoa học cũng như các nhà triển khai hệ thống. Chúng ta sẽ tìm hiểu hai thuật toán mà chỉ sử dụng biến chia sẻ single-writer của Lamport và Burns[4].

Thuật toán thứ nhất được phát triển bởi Jim Burns.Trước tiên, để hiểu được tư tưởng cũng như cách triển khai thuật toán để giải quyết vấn đề tương tranh, Burns có đưa ra một đoạn mã mô phỏng dưới đây:

Ta xét đoạn code sau : Biến chia sẻ :

flag: là một mảng được đánh chỉ số bởi [1,2,...,n] , giá trị khởi tạo bằng 0, chỉ nhận giá trị { 0, 1}, nó chỉ được ghi bởi một tiến trình và được đọc bởi mọi tiến trình :

Đoạn mã cho mỗi tiến trình pi: L :

flag[i] 0

for j {1,2, ... , i-1} do

if ( flag[j] = 1 ) then goto L ; end if

end for flag[i] 1

for j {1, 2, ..., i-1} do

if( flag[j] = 1) then goto L end if

end for M :

for j {i+1, ..., n} do

if flag[j] = 1 then goto M end if end for ******Critical region********* flag[i]  0 ****** Remainder******** Mutual exclusion:

Thuật toán Burn đảm bảo thuộc tính mutual exclusion

Chứng minh:

Hướng chứng minh thuật toán Burns đảm bảo thuộc tính mutual exclusion thì cũng tương tự như trong thuật toán Dijkstra, chỉ khác nhau ở chỗ trong thuật toán này thì trước khi đi vào vùng C thì biến flag = 1, còn trong thuật toán Dijkstra thì flag = 2.

Nếu tại một thời điểm nào đấy cả hai tiến trình pi và pj đều giành được vùng C. Giả sử rằng pi thiết lập biến flag[i] = 1 trước. Qua đoạn mã ở trên ta thấy tiến trình i sẽ giữ nguyên giá trị này cho tới khi rời C.

Điểm này được thực hiện bằng cách chỉ ra có ít nhất một trong số các tiến trình phải thông báo là tiến trình khác đã thiết lập biến flag của nó rồi. Cụ thể là :

Nếu i < j thì j quay trở về nhãn L .

Nếu i > j thì i không thể giành lấy C được.

Trái với giả thuyết. vậy pi và pj không đạt được C tại cùng một thời điểm

Deadlock-freedom:

Thuật toán Burn đảm bảo thuộc tính Deadlock-freedom Chứng minh :

Dùng chứng minh phản chứng

Cũng như trong thuật toán Dijkstra, ta xét một thi hành hợp lệ trong đó tất cả các tiến trình đều hoặc ở trong R hoặc trong T và không có sự thay đổi vùng xảy ra nữa. Chia các tất cả các tiến trình tham gia ra làm hai phần:

Phần thứ nhất gồm các tiến trình mà đã từng đạt tới nhãn M gọi là tập P. Phần còn lại là các tiến trình mà chưa đạt được nhãn M gọi là tập Q.

Vậy trong thi hành này phải có một thời điểm nào đấy mà có tất cả các tiến trình sẽ vào P, chúng đều đạt tới M. Đồng thời sẽ có ít nhất một tiến trình trong P và tiến trình đó có chỉ số nhỏ nhất trong số các đối thủ trong P, lấy i là chỉ số lớn nhất của một tiến trình P

Vậy với một tiến trình j  Q và j > i đều có thiết lập flag(j) = 0 bền vững. Bởi vì nếu flag[j] = 1, thì cuối cùng nó cũng chỉ ra sự có mặt của một chỉ số nhỏ hơn (i) của tiến trình j có flag[i] = 1 và nó sẽ trả về nhãn L vị trí mà nó thiết lập biến flag[j] = 0 và từ thời điểm đó nó có thể không bao giờ thiết lập flag của nó trở về 1 nữa. Vậy cuối cùng chúng ta khẳng định rằng Pi cuối cùng sẽ giành lấy được vùng C, trái với giả thuyết.

Nhớ rằng thuật toán của Burns không sử dụng các biến multi-writer, nhưng nó vẫn sử dụng các biến chia sẻ multi-reader để đảm bảo hai thuộc tính mutual exclusion và deadlock-freedom cho n tiến trình.

Một phần của tài liệu Nghiên cứu các thuật toán giám sát và xử lý cạnh tranh giữa các thành phần phần mềm trên môi trường phân tán (Trang 55 - 57)