Cơ chế đồng bộ biến chung đã đ−ợc phát triển để đồng bộ QT đồng thời ở HĐH tập trung. Đúng nh− tên gọi, sự cộng tác QT đ−ợc thực hiện bằng cách chia xẻ biến. TTLQT đã không đề cập tới cả CTĐ lẫn truyền thông Client/Server. Mặc dù vậy tiếp cận tập trung vẫn đ−ợc sử dụng để thiết kế HĐH phân tán. Ví dụ, các luồng và bài toán (task) sử dụng bộ nhớ chia xẻ phân tán tiếp tục dùng đồng bộ bộ nhớ chia xẻ. Cũng vậy, vẫn sử dụng mô phỏng đồng bộ biến chia xẻ trong việc CTĐ.
Bảng 3.1 tóm tắt các cơ chế đồng bộ bộ nhớ chia xẻ. Năng lực và sự t−ơng thích với ph−ơng tiện ngôn ngữ về cơ chế đã đ−ợc so sánh và sự thích hợp với hệ thống phân tán đ−ợc xác nhận trong bảng này.
Semaphore: Tiếp cận biến chia xẻ và lời gọi hệ thống
Semaphore là kiểu dữ liệu cài đặt trong hệ thống. Biến thuộc kiểu semaphore đ−ợc gắn với một khoá và một dòng xếp hàng các QT kết khối theo mục đích chia xẻ biến chia xẻ. Chỉ với 2 toán tử P đóng khóa và V mở khóa, semaphore đ−ợc dùng để ĐBQT. Hai toán tử đó đ−ợc thi hành nh− lời gọi hệ thống tới HĐH. HĐH bảo đảm tính không thể chia tách của mỗi toán tử và chịu trách nhiệm đối với việc kết khối và tách khối QT trong dòng xếp hàng. Đặc tr−ng khóa của semephore là nó cung cấp cơ chế khóa nguyên thủy nhất. Sự cộng tác các QT hoạt động đạt đ−ợc sự đồng bộ đúng đắn hoàn toàn thuộc về QT ng−ời dùng. Tồn tại sự không trong suốt khi ngầm định khái niệm bộ nhớ chia xẻ.
Giải pháp semaphore ở hình 3.14 cho thấy sự phụ thuộc mạnh giữa QT đọc và QT ghi. QT ng−ời dùng biết đ−ợc sự tồn tại của các QT khác và đây là giả thiết không mong muốn (vì sẽ gây rắc rối) trong hệ thống phân tán. Biến chia xẻ rc là biến bộ đếm số QT đọc còn biến semaphore mutex cung cấp sự loại trừ ràng buộc cho việc cập nhật rc. Việc mở rộng kiểu dữ liệu semaphore hệ thống thành kiểu dữ liệu semaphore ng−ời dùng tổng quát hơn đ−ợc phát triển thành khái niệm kiểu giám sát monitor ở mức độ trừu t−ợng cao hơn.
Var mutex, db: semaphore; rc: integer; {rc : read counter}
Reader processes Writer processes P(mutex);
rc := rc + 1;
if rc = 1 then P(db); P(db); V(mutex);
Read database Write database P(mutex);
rc := rc - 1;
if rc = 0 then V(db); V(db); V(mutex);
Hình 3.14. Giải pháp semaphore cho bài toán −u tiên QT đọc yếu
Khoảng tới hạn điều kiện
Khoảng tới hạn điều kiện (Conditional Critical Region CCR) là ph−ơng án cấu trúc điều khiển theo cách tiếp cận semaphore. Cú pháp của CCR có dạng region - begin - end. Một QT vào khoảng tới hạn, điều kiện của nó phải đ−ợc kiểm tra: Nếu điều kiện đó ch−a thoả mãn thì nó dừng lại và một QT khác đ−ợc tiếp tục.
Hình 3.15 mô tả giải pháp CCR cho ph−ơng án −u tiên QT đọc yếu. Các tiếp cận cấu trúc điều khiển giả thiết biến chia xẻ và yêu cầu biên dịch khoảng tới hạn thành nguyên
thủy đồng bộ có sẵn trongHĐH. Đòi hỏi cần có không gian địa chỉ chung và việc biên
dịch riêng rẽ làm cho CCR có vẻ không thích hợp đối với hệ phân tán.
Var db: shared; rc: integer;
Reader processes Writeter processes Region db begin rc := rc + 1; end; Region db when rc = 0 Read database begin write database end; Region db begin rc := rc - 1; end;
Hình 3.15 Giải pháp CCR cho bài toán −u tiên QT đọc yếu Monitor: Tiếp cận kiểu dữ liệu trừu t−ợng
Monitor là một khái niệm mô hình đối t−ợng và có cấu trúc cú pháp giống nh− kiểu dữ liệu ng−ời dùng định nghĩa. Monitor gồm một khai báo các biến cục bộ của nó, một tập các thao tác đ−ợc phép (hoặc thủ tục monitor) và một thủ tục khởi tạo thực hiện khởi tạo trạng thái của monitor.
Sự khác nhau giữa monitor và kiểu dữ liệu thông th−ờng do ng−ời dùng định nghĩa chỉ là giả thiết ngữ nghĩa rằng chỉ một thể hiện cho một đối t−ợng monitor có thể hoạt động tại một thời điểm. Giả thiết hoàn toàn tuyệt đối này hoạt động giống nh− sự loại trừ nhau của cặp thao tác P và V trong kiểu dữ liệu semaphore. Tuy nhiên, vùng nguy hiểm là cố định và đ−ợc xác định sẵn trong các thủ tục monitor. Kết quả là, monitor có tính cấu trúc hơn semaphore. Để hoạt động cộng tác, mỗi khi QT ở trong một thủ tục monitor, các biến điều kiện với hai toán tử chuẩn wait và signal đ−ợc dùng để cho phép tạm dừng hoặc tiếp tục thực hiện QT trong monitor. Do việc xen kẽ các thủ tục
monitor là cho phép, việc thi hành monitor cần đảm bảo rằng không có quá một QT trong monitor đ−ợc hoạt động tại một thời điểm. Vì các thủ tục monitor chấp nhận tham số, monitor cung cấp truyền thông QT tốt giống nh− ĐBQT. Rõ ràng là, sự che khuất và chi tiết ĐBQT khỏi QT ng−ời dùng là một b−ớc chuyển biến chính để monitor cung cấp tính năng trong suốt.
Hình 3.16 mô tả giải pháp monitor cho bài toán −u tiên QT đọc yếu. Các monitor phục vụ tựa nh− ng−ời điều khiển quản lý các luật đối với QT đọc và ghi đồng thời. Không còn sự t−ơng tác trực tiếp giữa QT đọc và QT ghi. Monitor t−ơng đồng với một phục vụ, còn QT đọc và QT ghi giống nh− các khách. Đáng tiếc, điểm hạn chế chính là thậm chí nếu monitor đ−ợc thi hành bởi hệ thống và chịu trách nhiệm điều khiển đọc/ghi, các hoạt động đọc và ghi thực sự vẫn đ−ợc diễn ra trong QT ng−ời dùng. Trong tr−ờng hợp này, monitor không là một phục vụ hệ thống đầy đủ. Thêm nữa, nhu cầu của QT ng−ời dùng bắt đầu/kết thúc mỗi thao tác đọc/ghi không thể là trong suốt nh− thao tác đọc/ghi đơn giản.
Ngoại trừ giả thiết về chia xẻ bộ nhớ, khái niệm monitor ch−a thể thích nghi đối với hệ thống phân tán. Để cung cấp tính trong suốt và đọc/ghi đồng thời cơ sở dữ liệu, hoạt động đọc/ghi thực sự phải đ−ợc xảy ra trong monitor. Tuy nhiên, sự thực hiện phức của thủ tục monitor là không cho phép và chính vì thế, giải pháp monitor đa luồng có vẻ hợp lý. Mỗi luồng t−ơng ứng với mỗi hoạt động của một thủ tục monitor mà không cần kết khối monitor. Luồng có thể tạm dừng và đợi cho tới khi có điều kiện và chúng chia xẻ các biến bằng cách dùng semaphore. Đáng tiếc, giải pháp này làm mất đi đặc tr−ng thống nhất đơn của thủ tục monitor, hoạt động đơn của một thủ tục monitor để loại trừ ràng buộc. Điều đó không đ−ợc tiếp diễn trong monitor. Giải pháp đối với một thủ tục monitor là đôi lúc thì loại trừ và đôi lúc thì đồng thời.
Rw: monitor
Var rc: integer; busy: boolean; toread, towrite: condition; procedure startread procedure endread
Begin Begin
If busy then toread.wait;
rc := rc + 1; rc := rc - 1;
toread.signal; if rc = 0 then towrite.signal;
end; end;
procedure startwrite procedure endwrite
Begin begin
If busy or rc # 0 then toread.wait; busy := false;
busy := true toread.signal or towrite.signal;
end; end;
begin rc := 0; busy:= false; end;
Reader process Writer process Rw.strartread; Rw.start.write; Read database; Write database;
Rw.endread; Rw.endwrite;
Hình 3.16. Giải pháp monitor bài toán −u tiên QT đọc yếu
Serialize (Bộ giám sát): Tiếp cận tổ hợp trừu t−ợng dữ liệu và cấu trúc điều khiển
Giải pháp đồng bộ monitor cho thấy cần phải có tính đồng thời trong monitor và trong thời gian đó duy trì tính nguyên tử của thao tác của thủ tục monitor. Serialize là mở rộng khái niệm monitor cho phép thực hiện đ−ợc các điều trên. Serialize có cấu trúc t−ơng tự nh− monitor và QT sử dụng lời gọi thủ tục serialize cũng giống nh− cách sử dụng monitor. Giống nh− monitor, truy nhập loại trừ là đ−ợc thừa nhận. Tuy nhiên một thủ tục serialize bao gồm hai kiểu khoảng: một đòi hỏi loại trừ ràng buộc và một cho phép QT đồng thời hoạt động, loại thứ hai đ−ợc gọi là khoảng rỗng (hollow). Hơn thế, serialize còn có cấu trúc điều khiển mới là joincrowd -then - begin - end. Khi một QT đi vào khoảng rỗng, nó giải phóng serialize và ghép nối các QT đồng thời. Việc kết khối QT bởi wait theo biến điều kiện trong monitor đ−ợc thay thế bằng thủ tục
endqueue trong serialize. Việc chuyển dịch các QT trong hàng đợi khi điều kiện mong đợi của nó biến đổi đ−ợc làm hoàn toàn bằng hệ thống hơn là sử dụng signal trong monitor. Dùng hàng đợi đã làm tăng thêm tính rõ ràng của ch−ơng trình. Hình 3.17. mô tả giải pháp serialize so sánh với các ví dụ tr−ớc. Serialize cho phép loại trừ ràng buộc và thực hiện đồng thời trong các thủ tục serialize. Serialize tóm gọn tốt nhất đối t−ợng đồng thời và hầu nh− t−ơng đồng với phục vụ tài nguyên. Khách yêu cầu truy nhập cơ sở dữ liệu dùng các thủ tục serialize đọc và ghi trực tiếp và trong suốt.
Rw: serializer;
Var readq, writeq: queue; rcrowd, wcrowd: crowd; Procedure read
Begin
Enqueue(readq) until empty(wcrowd);
Joincrowd(rcrowd) then begin read database end;
End;
Procedure write Begin
Enqueue(writeq) until (empty(wcrowd) and empty(rcrowd)); Joincrowd(wcrowd) then begin read database end;
End;
Hình 3.17. Giải pháp serializer cho bài toán −u tiên QT đọc yếu
Path Expression: Một tiệm cận trừu t−ợng dữ liệu và cấu trúc ch−ơng trình
Khái niệm path expression (biểu thức đ−ờng dẫn) khác hẳn so với những ph−ơng pháp đồng bộ đ−ợc thảo luận ở trên. Giống nh− monitor, đó là kiểu dữ liệu trừu t−ợng. Tuy nhiên các thủ tục xác định trong kiểu dữ liệu trừu t−ợng path expression không chỉ t−ờng minh tới bất kì nguyên thủy đồng bộ nào. Chỉ có thứ tự thực hiện các thủ tục phải đi sau tập ràng buộc của path expression. Path Expression là đặc tả ngôn ngữ bậc
cao mô tả các thao tác đ−ợc định nghĩa nh− thế nào đối với đối t−ợng chia xẻ để có thể đ−ợc gọi để đảm bảo yêu cầu đồng bộ. Vì lí do này chúng đ−ợc coi nh− là cấu trúc ch−ơng trình do nó giống nh− mô tả hình thức một ch−ơng trình. Giải pháp path expression cho vấn đề −u tiên QT đọc yếu là rất ngắn gọn :
Path 1 : ( [read], write ) end
Hằng số 1 ràng buộc số l−ợng hoạt động đồng thời trong ngoặc đơn là 1 và điều đó đặc tả sự loại trừ giữa các QT đọc và ghi. Dấu ngoặc vuông chỉ ra QT đọc có thể xảy ra đồng thời. Ch−ơng trình dịch phải sẵn sàng chuyển path expression thành dịch vụ nguyên thủy đồng bộ thi hành đ−ợc. Rất nhiều mở rộng của khái niệm path expression đã đ−ợc phát triển nhằm làm tăng khả năng đặc tả yêu cầu về đồng thời và đồng bộ. Ví dụ đáng kể nhất đã đ−ợc khẳng định trong path expression đối với phối hợp có điều kiện.