Giáo trình Hệ điều hành phân tán - Hà Quang Thụy (Phần 1)

Tóm tắt Giáo trình Hệ điều hành phân tán - Hà Quang Thụy (Phần 1): ... ODP và CORBA dùng dịch vụ thông minh trader hoặc broker làm thuận tiện liên tương tác trong hệ tự trị cọng tác. Trang vàng và đại lý bất động sản như những thương nhân. Chúng có thể được nhìn như tuyến phần mềm liên kết quá trình khách và phục vụ và chúng phục vụ như một phần mềm lớp giữa (midd...i khác đi, nhu cầu chia xẻ tài nguyên (phần cứng, phần mềm, thông tin ...) từ một tập hợp nhiều máy tính đòi hỏi liên kết các thành phần trong tập hợp đó. Điều này đã được thực hiện trong mạng với HĐH mạng. Trong hệ phân tán, hạ tầng kết nối tương tự như HĐH mạng. Các thành phần trong hệ thống c...hư mã thực hiện lại mà mỗi luồng có stack cục bộ riêng của mình. Việc truy nhập vào buffer cùng được chia xẻ bởi các luồng cần loại trừ ràng buộc. Việc loại trừ ràng buộc có thể đạt được bằng cách sử dụng phương pháp đồng bộ bộ nhớ chia xẻ như semaphore hay bộ kiểm tra, vì tất cả các luồng chia x...

pdf102 trang | Chia sẻ: havih72 | Lượt xem: 218 | Lượt tải: 0download
Nội dung tài liệu Giáo trình Hệ điều hành phân tán - Hà Quang Thụy (Phần 1), để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
oà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);
90/249
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
91/249
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 thentowrite.signal;
end; end;
procedure startwrite procedure endwrite
Begin begin
92/249
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
93/249
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.
94/249
Đồng bộ hóa chuyển thông điệp
Không có bộ nhớ chia xẻ nên trong hệ phân tán, CTĐ là cách truyền thôngđược lựa
chọn. Đó cũng là một dạng đồng bộ ngầm do TĐ có thể nhận chỉ sau khi chúng được
gửi đi. Đối với nhiều ứng dụng, nhận là kết khối còn gửi có thể kết khối hoặc không.
Ta gọi gửi không kết khối-nhận kết khối là CTĐ dị bộ và gửi kết khối-nhận kết khối là
CTĐ đồng bộ. Mục này trình bày cách đồng bộ khi sử dụng cho hai loại CTĐ như vậy.
Các khái niệm thích hợp để CTĐ như QT xử lý truyền thông tuần tự, lời gọi thủ tục từ
xa và cuộc hẹn sẽ được mô tả.
CTĐ không đồng bộ (dị bộ)
Tuy trong CTĐ không chia xẻ biến nhưng các kênh truyền thông vẫn được chia xẻ. Vì
vậy hoạt động nhận kết khối từ kênh truyền thông là tương đương với việc thực hiện
toán tử P ở semaphore và gửi không kết khối là tương đương với toán tử V. CTĐ dị bộ
đơn giản là việc mở rộng khái niệm semaphore cho hệ thống phân tán. ở đây giả thiết
rằng kênh có bộ đệm không hạn chế. Việc đồng bộ CTĐ dị bộ cũng cần cấu trúc như
semaphore, khi các kênh truyền thông có thể được chỉ ra trong một ngôn ngữ và được
hỗ trợ bằng HĐH. Hình 3.18 minh chứng cách dùng CTĐ dị bộ cho loại trừ ràng buộc.
Phục vụ kênh đại diện cho HĐH hỗ trợ cho các kênh logic. Nó tạo một kênh logic cho
mục đích đồng bộ và khởi tạo kênh này để chứa TĐ. Nội dung TĐ ở trong kênh là không
quan trọng đối với việc loại trừ ràng buộc. Các ví dụ tốt cho đồng bộ CTĐ là sử dụng
ống dẫn (pipe) và (socket). Phục vụ kênh cũng tổ chức việc xếp hàng đợi các TĐ và xử
lý khối trên kênh.
Process Pi Channel phục vụ Process Pj
Begin Begin Begin
Receive(channel); Create channel; Receive(channel);
Critical section; Send(channel); Critical section;
Send(channel); Manage channel; Send(channel);
End; End; End;
Hình 3.18. Loại trừ ràng buộc dùng trong CTĐ dị bộ.
Chuyển thông điệp đồng bộ
CTĐ đồng bộ thừa nhận gửi kết khối và nhận kết khối. Điều này cần thiết khi không có
bộ đệm các TĐ trên kênh truyền thông. Gửi phải đợi cho tới khi có một QT nhận tương
ứng cùng diễn ra và nhận cũng phải đợi một QT gửi tương ứng. Có nghĩa bất cứ một QT
95/249
nào đến trước phải đợi QT khác và việc đợi này là đối xứng. Cơ cấu này cho phép hai
QT sau khi đối sánh cặp gửi và nhận thì kết nối và trao đổi dữ liệu tại một điểm đồng
bộ và sau khi hoàn thành lại tiếp tục thực hiện hoạt động riêng của mình. Điểm đồng
bộ như vậy được gọi là cuộc hẹn giữa gửi và nhận. Cuộc hẹn là một khái niệm có ích
trong hệ thống máy tính cũng như trong đời sống hàng ngày. Ví dụ, bên ngoài sân vận
động trước giờ bắt đầu của trận bóng, dễ dàng bắt gặp những người hoặc là cầm vé để
bán hoặc là giơ những ngón tay để số hiệu vé họ cần mua. Cuộc hẹn giữa người bán và
người mua ở đây là dị bộ và đối xứng.
Giải pháp loại trừ ràng buộc sử dụng CTĐ đồng bộ được mô tả ở hình 3.19. QT phục
vụ semaphore bắt đầu bằng cuộc hẹn với hoặc Pi hay Pj; sau đó, cho phép QT được hẹn
bước vào khoảng tới hạn, phục vụ ghi nhận id của QT xử lý và chờ đợi cuộc hẹn chỉ QT
thực hiện hiệu quả của toán tử V. Điều đó hoàn thành một chu trình thực hiện loại trừ
của khoảng tới hạn và phục vụ lặp lại việc chấp nhận một cuộc hẹn khác. Cũng như trên,
nội dung TĐ là không quan trọng. Điều quan trọng hơn là cách gửi và nhận có thích hợp
với nhau không ?
Cần một phương pháp để đối sánh tên gọi của hai cuộc hẹn bằng cách dùng các tên thủ
tục. Dưới đây mô tả ba đồng bộ quan trọng theo tiếp cận CTĐ đồng bộ.
Process Pi Semaphore phục vụ Process Pj
Begin loop begin
Send(sem, msg); Receive(pid, msg); Send(sem, msg);
Critical section; Send(pid, msg); Critical section;
Receive(sem, msg); End; Receive(sem, msg);
End; end
Hình 3.19. Loại trừ ràng buộc được dùng trong CTĐ đồng bộ
QT truyền thông tuần tự: Một tiếp cận Vào/Ra
QT truyền thông tuần tự (CSP) là đảm bảo ngôn ngữ đầu tiên định vị vấn đề đồng bộ
trong hệ phân tán. Nó dùng các cuộc hẹn đầu vào/đầu ra để đạt được sự đồng bộ CTĐ.
Đầu vào/đầu ra là một dạng của truyền thông TĐ. QT gửi P đưa một lệnh ra Q! exp đến
QT nhận Q và QT Q cần có một lệnh vào tương ứng P? var. Cuộc hẹn lệnh vào/lệnh ra
được nối với nhau thông qua tên gọi của QT cần kết nối (P chỉ ra Q và Q chỉ ra P). Điều
này tương đương với phép gán từ xa thực hiện việc gán giá trị exp từ một QT cho biến
var của một QT khác. Việc trao đổi TĐ giữa các QT vào / ra là đồng bộ nên đạt được sự
đồng bộ giữa hai QT.
96/249
Sử dụng trực tiếp tên QT khi truyền thông trong CSP có một vài hạn chế. Điều này có
thể minh hoạ bằng thi hành bài toán đọc/ghi. Trước hết là tính không hợp lý khi yêu cầu
QT đọc phải gửi TĐ cho QT ghi hoặc ngược lại bởi vì chúng được thực hiện một cách
độc lập và không biết sự tồn tại của các QT khác. Thứ hai, chúng truyền thông trực tiếp
với nhau là không cần thiết. Vì vậy chúng ta cần QT phục vụ nhận những yêu cầu từ
QT đọc/QT ghi và qui định những luật cho Đọc đồng thời / Ghi độc quyền. Trong CSP
đọc và ghi chỉ có một kiểu lệnh truyền thông với phục vụ S (ví dụ : S! req trong đó req
là request message). Phục vụ sẽ thực hiện trao đổi đồng bộ bằng cách R? msg hoặc W?
msg với msg là nội dung của TĐ nhận được còn R và W tương ứng là QT đọc và QT
ghi, nhằm hỗ trợ việc không phải qui định cuộc hẹn giữa QT đọc và QT ghi. CSP đưa
ra lệnh alternative, mỗi lênh này bao gồm một số lệnh guarded. Khi đưa vào một lệnh
alternative thì tất cả điều kiện của các lệnh guarded đều phải kiểm tra. Chỉ có một lệnh
có điều kiện đúng được lựa chọn để thực hiện. Việc chọn các lệnh guarded ở trong lệnh
alternative không được xác định trước. Tính không xác định của chương trình tuần tự là
một mở rộng mơ ước đối với lập trình trong hệ phân tán. Một câu lệnh vào của CSP có
điều kiên đúng khi câu lệnh ra tương ứng của nó được dùng.
Đối với vấn đề đọc/ghi, phục vụ cần một lệnh lựa chọn cho phép gặp QT đọc hoặc QT
ghi. Vấn đề đầu tiên là phục vụ phải biết tên của tất cả các QT đọc và ghi tại thời điểm
sinh mã để cung cấp cho QT điều khiển. Thứ hai, để sử dụng tên QT cho việc giao tiếp
thì chỉ có một QT được yêu cầu phục vụ. Thao tác đọc và ghi thực sự không thể được
thực hiên bằng QT người dùng mà cần được chuyển dưới dang mã của phục vụ. Chuyển
tài nguyên đối tượng vào tài nguyên phục vụ là điều tốt vì nó cung cấp độ trong suốt cao
hơn. Việc đọc đồng thời có thể được thực hiện bằng cách sử dụng câu lệnh song song
CSP để tạo nên luồng QT đồng thời. Tuy nhiên việc đồng bộ giữa các quá QT vẫn cần
được hoàn thiện trong phục vụ đa luồng. Điều này có nghĩa là chúng ta đưa trách nhiệm
đồng bộ các luồng QT trong phục vụ. Những câu lệnh vào và ra đồng bộ chỉ đáp ứng
cho mục đích truyền thông hỏi và đáp. Bỏ qua giải pháp bổ sung đặc tính đồng bộ cho
luồng thì không có cách nào khác cho vấn đề đọc/ghi trong CSP. Khó khăn này có thể
giảm bớt nếu mở rộng khái niệm vào/ra đồng bộ tới các thủ tục. Điều này dẫn đến sự
phát triển của lời gọi thủ tục từ xa và những cuộc hẹn Ada.
Lời gọi thủ tục từ xa
Khái niệm vào/ra đồng bộ trong CSP cung cấp việc kết khối và trao đổi dữ liệu giữa các
QT gửi và nhận. Lời gọi thủ tục có những đặc trưng tương tự mà theo đó thủ tục gọi
được kết khối cho đến khi thủ tục được gọi hoàn thiện và dữ liệu được chuyển giao giữa
thủ tục gọi và thủ tục được gọi. Truyền thông từ xa có thể dùng khuôn dạng lời gọi thủ
tục giao tiếp và được thực hiện thực sự bởi CTĐ. Trong xử lý truyền thông, dùng lời gọi
thủ tục thay cho tên QT đem lại hiệu quả hơn. Và kiểu lời gọi từ xa cũng có đặc tính
trong suốt khi CTĐ được che dấu đối với người dùng.
97/249
Lời gọi thủ tục từ xa là truyền thông Client/Server. Tài nguyên của phục vụ được đại
diện bằng tập hợp các thủ tục và chúng được dùng khi các khách từ xa dùng các thủ tục
giao tiếp. Phục vụ cũng hoạt động giống như monitor. Hai phương pháp RPC và cuộc
hẹn đều CTĐ đồng bộ tuy nhiên sự khác nhau giữa chúng là sự phân biệt phục vụ và các
khách của nó. Các phục vụ trong RPC là bị động, chúng đưa ra các thủ tục của chúng
và chờ đợi các khách dùng các thủ tục đó. Còn phục vụ trong cuộc hẹn thì ngược lại,
chúng cố gắng tạo ra cuộc hẹn cho các yêu cầu của khách. Chính vì thế chúng ta có thể
coi RPC là giao tiếp không đối xứng, còn cuộc hẹn là giao tiếp đối xứng. Và RPC được
dùng như giao thức truyền thông còn cuộc hẹn dùng cho đồng bộ và đó là cơ sở cho việc
thực hiện cuộc hẹn từ xa trong các hệ thống phân tán.
Cuộc hẹn Ada: Một tiếp cận lời gọi thủ tục từ xa và đối xứng
Dù không phải được thiết kế cho các cuộc hẹn từ xa trong môi trường mạng phân tán
nhưng những cuộc hẹn Ada vẫn là ví dụ tốt cho việc dùng khái niệm lời gọi thủ tục và
cung cấp cấu trúc ngôn ngữ không xác định cho QT đồng thời. Các thủ tục trong RPC
là tĩnh và cần được kích hoạt bằng lời gọi. Để dùng được các thủ tục trong cuộc hẹn,
chúng bắt buộc có được tính sẵn sàng động để luôn sẵn sàng đáp ứng các lời gọi. Ngôn
ngữ Ada đưa ra những câu lệnh chấp nhận cho mục đích này. Một câu lệnh chấp nhận có
một bộ phận vào được cho dưới dạng dãy câu lệnh xác định thủ tục. Bộ phận vào chứa
tên điểm vào và các tham biến hình thức. Việc yêu cầu như cuộc hẹn với câu lệnh chấp
nhận tương ứng với cùng tên điểm vào thủ tục. Việc kết khối là đối xứng theo cách QT
đầu tiên xuất hiện (lời gọi khác) chờ bộ đếm của nó xuất hiện. Điểm hẹn này cung cấp
điểm đồng bộ giữa hai QT. Thực hiện câu lệnh chấp nhận bao gồm việc trao đổi tham
số và phân tử của nó. Mã lệnh không loại trừ thực sự được ghi ngoài câu lệnh chấp nhận
và có thể thực hiện đồng thời.
Nếu các QT có cấu trúc khách và phục vụ thì các câu lệnh chấp nhận thường xuất hiện
trong QT phục vụ. Các khách yêu cầu phục vụ bằng cách gọi những câu lệnh chấp nhận
của phục vụ một cách trực tiếp. Do phục vụ cần hẹn với nhiều khách một cách không
định trước, thì câu lệnh lựa chọn (giống như lệnh alternative trong CSP) được bổ sung
vào ngôn ngữ Ada. Câu lệnh select alternative có dạng của lệnh guarded theo nghĩa cho
biết điều kiện đối với lệnh chấp nhận. Khi một lệnh chọn được đưa vào, thì tât cả các
điều kiên đảm bảo được kiểm tra và đánh dấu nếu như điều kiện đó đúng. Một trong
những câu lênh đã đánh dấu mà chưa giải quyết sẽ được chọn thực hiện theo cách không
định trước. Hình 3.18 minh chứng cách dùng câu lệnh chấp nhận và câu lệnh chọn cho
vấn đề ưu tiên QT đọc yếu. Nhiệm vụ của rw (phục vụ) sẽ hẹn với QT đọc và QT ghi
một cách không định trước. Các QT đọc/ghi tương tác với phục vụ qua lời gọi bài toán
thích hợp với điểm vào giống như lời gọi thủ tục thông thường.
task rw is
entry strartread;
98/249
entry endread;
entry startwrite;
entry endwrite;
end;
task body rw is
rc: integer := 0;
busy: boolean := false;
begin
loop
select
when busy = false →
accept startread do rc := rc + 1 end;
or
→
accept endread do rc := rc - 1 end;
or
when rc = 0 and busy = false →
accept startwrite do busy := true end;
or
→
accept endwrite do busy := false end;
end loop
99/249
end;
Hình 3.20. Giải pháp cuộc hẹn Ada cho vấn đề ưu tiên QT đọc yếu
Kết hợp câu lệnh chấp nhận và câu lệnh chọn cung cấp việc loại trừ ràng buộc và đồng
bộ cho đọc/ghi. Đọc/Ghi thực sự cũng có thể được nhúng trong phục vụ đồng bộ. Đọc
đồng thời vẫn có thể dùng câu lệnh accept-startread bằng việc fork QT hoặc luồng khác.
Trong hệ phân tán, tên điểm vào có thể được truyền đi và cuộc hẹn của thủ tục được
thực hiện bằng lời gọi thủ tục từ xa.
100/249

File đính kèm:

  • pdfgiao_trinh_he_dieu_hanh_phan_tan_ha_quang_thuy_phan_1.pdf