Thuật toán Two-process của Peterson

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 54 - 55)

Chúng ta bắt đầu giải pháp 2 tiến trình cho tiến trình p0p1. Đặt i= i-1 là chỉ số của các tiến trình còn lại[4]. Đoạn mã như sau:

Biến chia sẻ:

level: là một mảng Boolean có giá trị là 0 hoặc 1, khởi tạo bằng 0

turn: là biến kiểu Boolean, khởi tạo là trạng thái tuỳ ý. Đoạn mã cho tiến trình pi

**Remainder Region** tryi

level[i]:=1 turn:=i

wait for level(i)=0 or turn ≠ i criti

**Critical Region** exiti

level[i]:=0 remi

Định lý 1: Thuật toán two-process của Peterson thoả mãn tính mutual exclution Chứng minh: trước tiên chúng ta có định nghĩa cho các tập như sau:

before-C: là tập các tiến trình có bộ đếm chương trình ở ngay sau vòng lặp cuối cùng

in-C: là tập các tiến trình có bộ đếm chương trình ở trong vùng C Ta có:

level(i)=0 => i (atwaitbeforeCinC)(*) Từ (*) ta có thể suy ra: ) ( )) ( ( )

(before C in C i at wait before C in C turn i

i            

Có 3 bước kiểm tra:

- Thứ nhất là i qua được giai đoạn wait. Khi đó ta sẽ có hoặc là turnii vào được vùng C, hoặc là level(i)=0, đó là trường hợp (*).

- Thứ hai khi i đạt tới trạng thái at-wait thì nó sẽ thiết đặt turni

- Thứ ba khi turn được gán cho giá trị i thì đó là một bước của tiến trình pi được thực hiện khi nó không ở trong vùng được chỉ ra.

Định lý 2: Thuật toán two-process của Peterson thoả mãn tính deadlock-freedom Chứng minh: Chúng ta sẽ dùng phương pháp phản chứng.

Giả sử tại một thời điểm, i  T, không có tiến trình nào trong C và sau đó cũng không có tiến trình nào đi vào C. Có hai trường hợp xảy ra.

Nếu cuối cùng i1 vào T thì cả hai tiến trình sẽ sa lầy vào câu lệnh wait, từ đó chúng không vào được C, nhưng điều này không thể xảy ra. Từ đó giá trị của biến turn phải là chỉ số của một trong hai tiến trình đó.

Tình huống thứ 2 : Giả sử rằng i1 không bao giờ vào T. Trong tình huống này bằng phương pháp qui nạp, cuối cùng ta cũng chỉ ra rằng level(i1) = 0. Trái với giả sử rằng i vẫn đang bị sa lầy trong câu lệnh wait của nó.

Định lý 3:

Thuật toán hai tiến trình của Peterson đảm bảo thuộc tính lockout-freedom Phác hoạ chứng minh

Dùng chứng minh phản chứng: giả sử rằng

i đang ở trong T sau đó thiết lập level(i) = 1 và i1 vào C ba lần.

Qua đoạn mã ta thấy , trong lần vào C thứ hai và thứ ba thì tiến trình i1 sẽ thiết lập turn := i1 và sau đấy ta lại thấy turn = i. Có nghĩa là có hai lần i phải thiết lập turn := i

Nhưng theo giả thuyết thì turn := i chỉ được thực hiện một lần trong suốt thời gian tiến trình i ở trong vùng T.

Trái với giả thiết. => đpcm.

Vậy qua hai thuật toán mà khoá luân đã đề cập ở trên, cả hai thuật toán đều giải quyết được vấn đề tương tranh cho hệ thống, trong đó thuật toán Two-process được hỗ trợ thuộc tính lockout-freedom, đảm bảo các tiến trình tới đều được sử dụng tài nguyên. Nhưng cả hai thuật toán đó đều gặp phải một khó khăn chung đó là khi triển khai thuật toán đều sử dụng các biến kiểu multi-writer (turn). Do đó trên thực tế để triển khai các biến chia sẻ kiểu multi-write trên các hệ thống phân tán là rất khó khăn và hiệu quả thấp đó cũng là một những nguyên nhân làm cho các thuật toán này rời xa tính thực tiễn. Trong phần tới đây của khoá lụân có đề cập tới hai thuật toán khác đó là mutual exclusion của Burn và Bakery của Lamport, cả hai thuật toán này đều không sử dụng các biến kiểu multi-writer để triển khai thuật toán nữa thay vào đó sử dụng các biến chia sẻ kiểu single-writer.

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 54 - 55)