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 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.
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.
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; 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
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.