Thuật toán Bakery là một thuật toán hay, cơ bản và có tính thực tiễn và các ý tưởng của thuật toán được áp dụng trong nhiều lĩnh vực khác nữa, trong phần nghiên cứu này chúng ta thừa nhận rằng bộ nhớ chia sẻ bao gồm các biến đọc ghi (single-writer)[4].
Tư tưởng của thuật toán:
Phỏng theo hoạt động của một cửa hiệu bánh mỳ, tại một thời điểm có n tiến trình tới, mỗi một tiến trình đó sẽ đều được cấp cho một số number, number của tiến trình nào nhỏ nhất, thì tiến trình đó sẽ được phép và C trước..
Thuật toán đảm bảo được tốt tính công bằng cho tất cả các tiến trình tham gia, đó là điểm nổi bật của thuật toán, nó mô tả những nét nổi bật của lockout-free, một ngưỡng thời gian có giá trị , bounded bypass (vòng giới hạn). Trên thực tế nó còn có một thuộc tính mạnh hơn đó là FIFO. Tuy nhiên nó cũng có một thuộc tính mà không mạnh và ít được chú ý tới đó là nó sử dụng các đăng ký có kích thước không giới hạn. Trong thuật toán này ta chỉ xét tới một trường hợp đơn giản trong trường hợp các register đọc ghi.
Trong thuật toán này vùng Trying được chia ra thành 2 vùng con , một vùng chúng ta gọi là doorway ( vùng cửa sổ ), và vùng kia(vùng còn lại) là vùng T.
Các bước để triển khai thuật toán :
Chọn number tương ứng cho mỗi tiến trình tham gia.
Vùng doorway là một vùng tập trung các tiến trình vừa mới vào T cho tới khi chúng chọn xong choosing[i] = 0 thì chúng thoát khỏi vùng doorway. Trong vùng doorway
này, thì mỗi tiến trình đều chọn một number của nó mà số này thoả mãn lớn hơn các
number của các tiến trình khác mà chúng đã chọn trước đó. Trong khi tiến trình pi thực hiện thao tác chọn number, thì nó thiết lập choosing[i] = 1 để thông báo cho các tiến trình khác biết rằng là nó đang chọn number.
Nếu tại cùng một thời điểm mà có cả hai tiến trình đồng thời ở trong doorway, do đó có khả năng hai tiến trình đó chọn được number giống nhau. Do trong thuật toán này có sử dụng biến number để giải quyết tương tranh giữa các tiến trình, nên thay vì sử dụng number để giải quyết tương tranh thì thuật toán sử dụng cặp (number,index).
Xử lý tương tranh cho các tiến trình tham gia, dựa vào cặp (number,index)
Thực hiện so sánh cặp (number, index) của các tiến trình theo thứ tự từ điển. Nếu hai tiến trình có number giống nhau, thì quyền ưu tiên sẽ thuộc về tiến trình mà có chỉ số index nhỏ hơn. Trong vùng còn lại trong vùng Trying, thì mỗi tiến trình đều đợi cho tới khi cặp (number,index ) của nó là nhỏ nhất và cũng đợi những tiến trình khác đang thực hiện choosing, lúc đó sẽ tới phiên của nó sử dụng tài nguyên.
Chú ý rằng : các tiến trình khi sử dụng xong tài nguyên, thì nó sẽ phải giải phóng tài nguyên đó cho các tiến trình khác sử dụng
Các biến chia sẻ :
Chosing : là một mảng có chỉ số trong khoảng [1,n], chỉ nhận hai giá trị {0,1}, giá
trị khởi tạo là 0. Biến chosing[i] được ghi bởi một tiến trình pi và được đọc bởi mọi tiến trình
Number : là một mảng số nguyến, có chỉ số trong khoảng [1,n], nhận các giá trị {0,
1, ..., n}, giá trị khởi tạo bằng 0. Biến number[i] được đọc bởi mọi tiến trình, chỉ được ghi bởi một tiến trình
Đoạn mã thi hành đối với mỗi tiến trình pi : *** bắt đầu doorway********
L1 :
chosing[i] 1
number[i] 1+max{number[1],number[2],..., number[n]} chosing[i] 0
***** kết thúc vùng doorway ***** ******bắt đầu bakery******** for j {1, ..., n} do
L2 : if choosing[j] = 1 then goto L2 end if
L3 if number[j]≠0 and (number[j],j)<(number[i],i) then goto L3 end if end for criti ***critical region**** ***kết thúc vùng bakery**** exiti number[i] 0 remi ****Remaider region***** Phân tích Các thuộc tính cơ bản:
Lấy D ký hiệu cho vùng doorway; T – D là vùng còn lại của vùng T. Định đề 1:
Trong một trạng thái bất kỳ của thuật toán, nếu tiến trình pi C và với tiến trình pj nào đó thoả mãn j ≠ i và pj ( T - D ) U C thì:
(number [i], i) < (number[j], j).
Chứng minh:
Tiến trình pi phải đọc choosing[j] = 0 trong L2 trước khi vào C, do đó tại thời điểm đọc thì j không được ở trong “vùng chọn choosing”. Lúc đó j nằm ở trong vùng (T – D) C, tức là j phải đi qua doorway tại một thời điểm nào đấy, chúng ta xem xét hai trường hợp sau:
+ Trường hợp 1: j vào vùng choosing sau khi tiến trình i đọc biến choosing[j] và
thấy rằng choosing[j] = 0. Biến number[i] của tiến trình i đã được chọn trước khi tiến trình j bắt đầu chọn biến choosing, như vậy đảm bảo rằng j đã thấy number[i] ≠ 0 khi nó chọn number của nó, do đó khi i ở trong C thì chúng ta có:
+ Trường hợp 2: j rời khỏi vùng chọn trước khi tiến trình i đọc, khi đó i đạt tới
nhãn L3 và đọc number[j] , nó sẽ lấy giá trị number[j] gần nhất, từ đó dù sao đi nữa thì I sẽ quyết định vào C, nó phải thoả mãn (number[i], i ) < (number[j] , j ).
Điều phải chứng minh.
Hệ quả 2:
Thuật toán bakery đảm bảo tính mutual exclusion Chứng minh:
Giả sử cả hai tiến trình Pi và Pj cùng đạt được vùng C tại cùng thời điểm. Thoả mãn pi C và Pj C.
Với điều khẳng định ở trên, thì phải thoả mãn cả hai điều kiện sau đó là: (number[i], i) < (number[j], j) và (number[j], j ) < (number[i], I ) Mâu thuẫn. Điều phải chứng minh.
Địnhlý 3:
Thuật toán Bakery đảm bảo tính deadlock-freedom Chứng minh:
Chứng minh bằng phản chứng:
Ta giả sử sự tắc nghẽn xuất hiện, tức là đạt tới một thời điểm nào đó mà tại đó có một tập các tiến trình cố định đang ở trong vùng T, đồng thới không có thay đổi vùng xuất hiện
Bằng đoạn mã ở trên thì ta thấy cuối cùng tất cả các tiến trình ở trong T ra khỏi vùng doorway và đi vào vùng T – D. Tại thời điểm này thì một tiến trình với cặp (number[i], i) nhỏ nhất sẽ không bị đóng khối. vậy cuối cùng vẫn có tiến trình vào C
Định lý 4:
Thuật toán Bakery đảm bảo tính lockout-freedom. Chứng minh:
Chúng ta xét một tiến trình pi cụ thể thoả mãn pi T, cuối cùng nó cũng sẽ rời khỏi vùng doorway. Sau đó bất kỳ tiến trình mới nào vào vùng doorway cũng đều thấy number[i], do đó giá number của nó sẽ được chọn lớn hơn number[i]. Bởi vậy nếu pi không vào C thì không thể có một tiến trình mới nào có thể vào được C. Do đó tất cả các tiến trình mà có number nhỏ hơn của i thì phải đợi ở phía sau i. Nhưng theo định lý 3 thì các tiến trình ở trong T thì phải tiếp tục vào C, điều đó có nghĩa là cuối cùng i cũng vào C
Phân tích thời gian
Thông qua đoạn mã ta thấy rằng tiến trình pi bất kỳ nào đó vào C mất khoảng tối đa là O(n) đơn vị thời gian sau khi nó bắt đầu thi hành ở vùng T. Chúng ta sẽ bắt đầu bằng cách chỉ ra rằng có vòng được giới hạn sau khi sau khi ra khỏi doorway.
Định đề 5 :
Tổng số lần một bộ xử lý pi vào vùng bakery trong khi bộ xử lý pj nào đấy vẫn đang ở trong bakery không nhiều hơn 2 lần.
Chứng minh:
Ta khẳng định một lập luận rằng một bộ xử lý bất kỳ chỉ có thể ra khỏi vùng bakery tối đa là một lần trong khi pj đang ở trong vùng bakery. Thật vậy trong khi j đang ở trong vùng bakery, thì number[j] không bị thay đổi. Do đó nếu một tiến trình pi thoát khỏi vùng bakery, thì khi nó vào lại vùng doorway lần nữa thì giá trị number[i] này sẽ được gán bằng một number khác hoàn toàn lớn hơn number[i] trước đây và pi không thể qua được L3 cho tới khi pj ra khỏi C.
Tiếp đến chúng ta phân tích thời gian dành cho một tiến trình pi cụ thể nào đó vào vùng C. Chúng ta xem xét một đoạn thi hành trong trạng thái đầu tiên một tiến trình pt nào đó ở trong L1 và trạng thái cuối cùng pt ở trong C. Mục đích chính của chúng ta để lien kết với thời gian của bất cứ một mẩu thi hành nào
Ta ký hiệu :
+ Td(i): thời gian một bộ xử lý pi sử dụng trong vùng doorway + Tb(i): thời gian một bộ xử lý pi sử dụng ở trong vùng bakery Định đề 6:
đối với một tiến trình bất kỳ pi nào thì Td(i) = O(sn) Chứng minh:
Trong doorway bao gồm n lần đọc và 3 lần ghi
với định đề ở trên thì pt giành lấy được bakery trong khoảng thời gian O(sn). Giờ đây chúng ta chỉ xem xét hậu tố của một đoạn mà trong đó pt đang ở trong bakery. Chúng ta xem xét các câu lệnh if, chúng gọi một kiểm tra thành công nếu bước kế tiếp không phải là một bước thi hành kiểm tra khác
Định đề 7:
Tổng số lần kiểm tra thành công trong một đoạn là không lớn hơn O(n2) Định đề 8 :
tổng số thời gian của một mẩu thi hành trong một yêu cầu là không lớn hơn Td(t) + Tb(t) = O(sn2
) + O(cn) Các thuộc tính thêm vào
Thuật toán này có một số thuộc tính quan trọng khác như FIFO sau khi ra khỏi vùng doorway. Thuộc tính này đảm bảo tốt tính công bằng cho tất cả các tiến trình, tức là mọi tiến trình đều được phép sử dụng tài nguyên, đều có quyền ưu tiên như nhau. Nó đưa ra một nguyên tắc đó là « nếu i ra khỏi vùng doorway trước khi j vào T thì i phải vào C trước j
Thuật toán bakery có một số tính chịu lỗi còn hạn chế . Chúng ta coi các lỗi là các tình huống mà trong đó một người dùng có thể bỏ dở một thi hành tại một thời điểm bất kỳ khi nó không ở trong R bằng cách gửi đi một aborti tới tiến trình của người đó, tiến trình i sẽ điều khiển aborti này bằng cách thiết lập các biến, bao hàm cả cục bộ lẫn biến chia sẻ, của nó trở lại với các giá trị khởi tạo. Chúng ta thấy rằng thuộc tính mutual exclusion vẫn được bảo toàn. Hơn thế nữa nó vẫn đảm bảo thuộc tính
deadlock-freedom, tức là tại một thời điểm bất kỳ có một tiến trình nào đó nằm trong T và không có lỗi và chỉ có một số hữu hạn là không thi hành được và không có tiến trình nào đang nằm trong C thì thuật toán này sẽ đảm bảo rốt cuộc sẽ có một tiến trình nào đó vào C.
Đánh giá thuật toán
Thuật toán Bakery là một thuật toán hay, cơ bản và có tính thực tiễn. Do bởi công sức, cũng như chi phí bỏ ra để triển khai thuật toán này vào hệ thống không cao, mà vẫn đảm bảo hệ thống hoạt động hiệu quả, ổn định, tránh được hiện tượng tương tranh xảy ra cho hệ thống. Bên cạnh đó, thuật toán còn đảm bảo tính công bằng cho các tiến trình, không xảy ra tình trạng đói tài nguyên cho tiến trình.
Chương 4. Áp dụng thuật toán phân tán cho hệ thống ATM tại ngân hàng