Tải bản đầy đủ (.doc) (26 trang)

Các hệ thống phối hợp phân tán

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (177.55 KB, 26 trang )

Phần I - Giới thiệu chung
Bắt đầu từ những năm 80 của thế kỉ 20, loài người đã được chứng kiến sự phát triển vượt
bậc của hệ thống máy tính nhờ có 2 công nghệ đỉnh cao. Thứ nhất, đó là sự ra đời và phát
triển của các bộ vi xử lý với chất lượng ngày càng cao đi đôi với giá thành ngày càng rẻ.
Và thứ hai, đó là công nghệ về mạng máy tính tốc độ cao. Sự kết hợp của chúng đã khiến
cho việc kết nối các máy tính với nhau thông qua hạ tầng mạng trở nên dễ dàng hơn bao
giờ hết và cũng từ đó đã làm nảy sinh ra những định nghĩa mới về hệ phân tán.
Có nhiều định nghĩa được đưa ra để mô tả một hệ phân tán. Chẳng hạn như:
“Hệ phân tán là một tập các máy tính độc lập, giao tiếp với người dùng như một hệ thống
thống nhất, toàn vẹn”.
- A. S. Tanenbaum, 2002 -
“Hệ phân tán được định nghĩa là một hệ trong đó các thành phần phần cứng hay phần
mềm nằm tại các máy tính được kết nối mạng với nhau giao tiếp và phối hợp hoạt động
với nhau chỉ thông qua việc truyền thông điệp”.
- G. Coulouris, 2001 –
Tuy nhiên, dù với định nghĩa nào thì một hệ phân tán cũng được nhìn nhận một cách
thống nhất trên 2 khía cạnh. Đấy là:
• Về phần cứng: Các máy trong hệ phân tán phải mang tính tự trị.
• Về phần mềm: Người dùng phải nghĩ rằng họ đang làm việc với một hệ thống duy
nhất.
Chính vì thế mà một hệ phân tán phải đảm bảo được 4 mục đích chính:
• Dễ dàng kết nối người sử dụng và tài nguyên.
• Đảm bảo tính trong suốt.
• Hỗ trợ tính mở.
• Có thể co dãn.
4 mục đích này có thể hiểu một cách đơn giản nhất như sau.
• Việc kết nối người sử dụng và tài nguyên nhằm tăng tính kinh tế cho hệ thống,
cho phép sự hợp tác và trao đổi thông tin giữa các nhóm người sử dụng. Tuy
nhiên, việc chia sẻ tài nguyên có thể dẫn tới những vấn đề như mất an toàn thông
tin, những sự hợp tác không mong muốn hay tăng cao mức độ tương tranh.
• Tính trong suốt giúp người dùng tưởng như mình đang làm việc chỉ với một hệ


thống duy nhất, đảm bảo che dấu sự rời rạc và những nhược điểm nếu có của hệ
thống. Có 8 dạng trong suốt đã được cụ thể hóa cho hệ phân tán. Đó là:
1. Trong suốt truy cập: che dấu khác biệt về cách biểu diễn và truy cập tài
nguyên.
2. Trong suốt vị trí: che dấu vị trí của tài nguyên.
3. Trong suốt di trú: che dấu khả năng di chuyển vị trí của tài nguyên.
4. Trong suốt tái định vị: che dấu sự di chuyển khi đang được sử dụng.
5. Trong suốt nhân bản: che dấu tình trạng sử dụng bản sao của tài nguyên.
6. Trong suốt tương tranh: che dấu sự chia sẻ tài nguyên.
7. Trong suốt về lỗi: che dấu lỗi xảy ra.
8. Trong suốt tính nhất quán: che dấu sự di chuyển tài nguyên giữa bộ nhớ
ngoài và bộ nhớ trong.
• Tính mở để đảm bảo cung cấp các dịch vụ theo các quy tắc chuẩn mô tả cú pháp
và ngữ nghĩa của dịch vụ đó. Cho phép người dùng được sử dụng các đặc tả đầy
đủ hay trung lập, điều này giúp cho hệ phân tán có được 2 lợi thế. Đó là: có tính
liên tác, giúp các hệ thống có thể hợp tác làm việc cùng nhau, và tính chuyển
mạng, cho phép sự chuyển đổi giữa các ứng dụng được tạo trên nền tảng phần
cứng và phần mềm khác nhau.
• Tính co dãn cho phép bổ sung thêm người dùng và tài nguyên của hệ thống, mở
rộng hệ thống về mặt địa lý đồng thời cho phép việc thay đổi về quy mô quản trị.
Đi cùng với sự phát triển của các dạng hệ phân tán là sự xuất hiện của các hệ điều hành
dành cho hệ phân tán.
• DOS (hệ điều hành phân tán): hệ điều hành dành cho các hệ thống đa xử lý và các
hệ thống đa máy tính thuần nhất. Những hệ thống máy tính này không thực sự hỗ
trợ nhiều cho các máy tính tự trị, tuy nhiên lại rất tốt trong việc đảm bảo tính
trong suốt cho việc cung cấp dịch vụ.
• NOS (hệ điều hành mạng): là hệ điều hành dành cho các hệ thống đa máy tính
không thuần nhất. Hệ điều hành này giúp cho việc kết nối các máy tính với hệ
điều hành riêng biệt trở nên dễ dàng, tuy nhiên nó lại không đảm bảo được tính
trong suốt cho cả hệ thống như DOS.

• Middle-ware = NOS + một tầng phụ. Tầng này được xây dựng bên trên NOS,
nhằm che dấu sự không nhất quán và phân tán của các máy tính được quản lý bởi
NOS. Các hệ thống có xây dựng middle-ware thường có những mô hình để đặc tả
cho một chức năng cụ thể nào đấy, chẳng hạn như hệ thống file phân tán v.v
Một vấn đề nữa cũng hết sức quan trọng đối với bất kì một hệ phân tán nào, đó là cách tổ
chức bên trong của nó. Client-server là một mô hình hiện nay đang được áp dụng rộng rãi
trong các hệ phân tán. Trong mô hình này, client sẽ gửi những thông điệp yêu cầu dịch vụ
đến server và chờ cho đến khi server gửi trả lời, cách hoạt động như vậy đã tạo ra sự liên
hệ mật thiết giữa mô hình này với các phương pháp lập trình truyền thống, trong đó các
dịch vụ được thực thi như một thủ tục trong từng module riêng rẽ. Tuy nhiên các ứng
dụng trong mô hình client-server đã được cải tiến bằng cách phân ra làm 3 mức: mức
giao diện người dùng, mức xử lý và mức dữ liệu. Phía server sẽ đảm nhận việc đáp ứng
cho mức dữ liệu, trong khi đó mức giao diện người dùng được thực thi bên phía client,
còn mức xử lý có thể được thực thi tại phía client, server hoặc là tại cả hai phía.
Các hệ phân tán được phân ra 3 mức theo kiến trúc client-server như trên được coi là
phân tán theo chiều dọc. Tuy nhiên, hiện nay trong các mô hình phân tán hiện đại người
ta lại có xu hướng phân tán theo chiều ngang, trong đó, client và server được chia nhỏ
một cách vật lý thành những phần tương đương nhau, mỗi phần được thực thi trên một
tập dữ liệu chia sẻ hoàn toàn giống nhau để đảm bảo việc cân bằng tải. Ví dụ điển hình
cho việc áp dụng thành công mô hình phân tán theo chiều ngang, đó chính là World Wide
Web (www).
Phần II - Truyền thông
Việc truyền thông giữa các tiến trình có thể được coi là trái tim của một hệ phân tán.
Trong các hệ phân tán truyền thống, việc truyền thông chủ yếu dựa trên việc truyền thông
điệp mức thấp. Tuy nhiên trong các hệ phân tán hiện đại, với sự tồn tại của hàng nghìn,
thậm chí hàng triệu các tiến trình đồng thời và rải rác khắp hệ thống mạng (ví dụ như
Internet) thì việc truyền thông có vẻ như không còn thích hợp do chúng không đảm bảo
được tính trong suốt của hệ phân tán.
Như ta đã biết, việc truyền thông trên một hệ phân tán đòi hỏi phải đảm bảo về nhiều yếu
tố. Đầu tiên là phải đảm bảo hiệu năng của quá trình truyền, trong đấy phải chú trọng đến

một số vấn đề cốt lõi như độ trễ, tốc độ truyền dữ liệu hay băng thông…, tiếp theo phải
đảm bảo được tính co dãn, tăng độ tin cậy và tính an toàn cho hệ phân tán, đồng thời vẫn
phải chú ý đến tính linh hoạt cũng như chất lượng các dịch vụ phân phối trên hệ. Để các
hệ thống khác nhau trong hệ phân tán có thể truyền thông với nhau dễ dàng và đảm bảo
được những yêu cầu trong việc truyền nhận dữ liệu, mô hình tham chiếu kết nối các hệ
thống mở OSI đã ra đời, mô hình này chuẩn hóa các quy tắc kết nối giữa 2 hệ thống trong
các giao thức, đồng thời phân việc truyền thông thành 7 tầng: tầng vật lý, tầng liên kết dữ
liệu, tầng mạng, tầng vận chuyển, tầng phiên, tầng biểu diễn và tầng ứng dụng, mỗi tầng
có một giao thức riêng cho mình và được xây dựng để giải quyết một khía cạnh cụ thể
của truyền thông. Sự phát triển hay thay đổi công nghệ tại mỗi tầng là hoàn toàn độc lập
với các tầng khác.
Trong 7 giao thức của mô hình kiến trúc OSI, thì 4 giao thức ứng với 4 tầng dưới cùng
được coi là những giao thức bậc thấp, 3 tầng phía trên ứng với các giao thức bậc cao.
Trong số các giao thức bậc cao tồn tại trong các hệ thống phân tán hiện nay thì còn phải
chú ý đến giao thức middleware. Đây là một giao thức đa mục đích, nó độc lập với các
giao thức khác và giúp cho việc truyền thông giữa các tiến trình được dễ dàng hơn so với
việc truyền thông thông qua tầng vận chuyển. Giao thức middleware hỗ trợ các dịch vụ
truyền thông bậc cao ví dụ như: gọi thủ tục từ xa, triệu gọi đối tượng từ xa, các dịch vụ
hàng đợi thông điệp, bên cạnh đó cũng hỗ trợ việc truyền dòng các dữ liệu liên tục.
Một trong những dịch vụ middleware được sử dụng rộng rãi nhất đấy là: gọi thủ tục từ xa
(RPC). Bản chất của RPC là một dịch vụ được thực thi bởi các thủ tục, trong đó phần
thân của thủ tục được đặt tại server. Phía client chỉ sử dụng đến chữ kí của thủ tục, tức là
tên của thủ tục và các tham số cần thiết phải cấp cho nó. Khi client gọi thủ tục, thì bộ
phận thực thi bên phía client, gọi là client-stub sẽ đảm nhận việc đóng gói các giá trị
tham số vào một thông điệp và gửi thông điệp đó đến cho server. Phần thực thi bên phía
server gọi là server-stub sẽ bóc các tham số từ gói thông điệp và gọi server, server gọi thủ
tục thực sự và thực hiện công việc, sau đó đưa kết quả cho server-stub để đóng gói thành
thông điệp và gửi trả cho client. Client-stub sẽ lấy các giá trị kết quả từ thông điệp phản
hồi và truyền tới cho ứng dụng khách đã gọi thủ tục từ xa.
RPC là mô hình được sử dụng rộng rãi trong các hệ phân tán do tính đơn giản của nó.

Tuy nhiên, có một số vấn đề nảy sinh trong quá trình áp dụng RPC cho việc truyền thông,
những vấn đề này được giải quyết thông qua một số mô hình RPC mở rộng. Mô hình mở
rộng đầu tiên là Doors. Mô hình này được sử dụng khi client và server nằm trên cùng một
máy. Tuy nhiên mô hình này có nhược điểm là vẫn phải xác định xem lời gọi thủ tục là
cục bộ hay từ xa.
Mô hình thứ hai là RPC dị bộ. Mô hình này cho phép client tiếp tục hoạt động ngay sau
khi thực hiện lời gọi RPC, tránh việc lãng phí thời gian chờ đợi. Tuy nhiên nó có một
nhược điểm là không đảm bảo được tính tin cậy trong truyền thông, vì client không thể
nào chắc chắn được rằng yêu cầu nó gửi tới server liệu đã được xử lý hay chưa.
Mục đích của RPC là đảm bảo tính trong suốt truy cập, tuy nhiên trong vấn đề truyền
tham chiếu thì việc hỗ trợ của RPC lại tương đối nghèo nàn. Chính vì thế nó không thích
hợp để đảm bảo cho việc truyền các đối tượng từ xa, những đối tượng có đòi hỏi cao về
tính trong suốt truy cập. Do đó triệu gọi đối tượng từ xa (RMI) là dịch vụ thích hợp hơn
trong những trường hợp như thế này. RMI về bản chất thì vẫn là dịch vụ RPC, điểm khác
biệt ở chỗ là nó cho phép các đối tượng của hệ thống có thể được truyền giống như một
tham số.
Vì RPC và RMI thường yêu cầu việc truyền thông đồng bộ tức là client bị chặn cho đến
khi nhận được trả lời từ phía server thì mới được tiếp tục hoạt động, do đó thường gây bất
tiện và chậm trễ cho việc truyền thông. Dù đã có nhiều cơ chế xuất hiện để nới lỏng phần
nào yêu cầu khắt khe này, tuy nhiên RMI và RPC dường như vẫn không thể thuận tiện
được bằng mô hình truyền thông hướng thông điệp.
Trong mô hình hướng thông điệp, vấn đề đặt ra là phải xác định xem lúc nào thì truyền
thông là kiên trì hoặc nhất thời và lúc nào thì truyền thông là đồng bộ hoặc dị bộ. Bản
chất của truyền thông kiên trì là thông điệp đã được lựa chọn để gửi đi sẽ được lưu trữ
trong hệ thống cho đến khi nào nó được đưa tới phía nhận. Đồng nghĩa với việc đấy là
ứng dụng bên nhận ứng dụng bên gửi đều không phải thực hiện việc gì nữa sau khi thông
điệp đã được lựa chọn. Đối lập với truyền thông kiên trì là truyền thông nhất thời, với
dạng truyền thông này thì thông điệp chỉ được lưu trong hệ thống nếu như cả ứng dụng
gửi và ứng dụng nhận đều đang được thực hiện. Nếu như bên gửi không thể truyền thông
điệp tới bên nhận thì thông điệp sẽ bị loại bỏ.

Trong truyền thông đồng bộ, bên gửi sẽ bị chặn cho đến khi thông điệp nó gửi đi được
lưu trữ vào bộ nhớ đệm của phía nhận hoặc đã thực sự được chuyển đến phía nhận. Trong
trường hợp mạnh nhất, bên gửi có thể bị chặn cho đến khi bên nhận đã xử lý xong thông
điệp, khi đó bên gửi sẽ được bên nhận trả lời thông qua RPC. Còn trong truyền thông
không đồng bộ, bên gửi có thể tiếp tục làm việc ngay sau khi nó chọn xong thông điệp để
truyền đi. Điều này có nghĩa là thông điệp có thể được lưu trữ trong bộ đệm cục bộ tại
phía gửi hay nói cách khác là nó có thể chưa được gửi đi.
Nhiều hệ thống hướng thông điệp được xây dựng bên trên tầng vận chuyển thông qua các
socket. Socket cung cấp điểm cuối cho việc truyền thông giữa các tiến trình, thông điệp
sẽ được truyền giữa một socket của tiến trình này với một socket của tiến trình khác. Tuy
nhiên socket chỉ hỗ trợ các hàm gửi và nhận nguyên thuỷ, thêm vào đó nó lại được thiết
kế chỉ cho việc truyền thông giữa một số ít giao thức, chẳng hạn như TCP/IP, do đó nó
không phải là phương pháp truyền thông được sử dụng duy nhất trong mô hình hướng
thông điệp.
Giao diện truyền thông điệp (MPI) cũng là một dịch vụ được sử dụng trong các mô hình
hướng thông điệp. MPI sử dụng phương pháp truyền thông nhất thời và nó hỗ trợ hầu hết
các hàm truyền thông nguyên thuỷ. Vì MPI có thể tối ưu hoá việc thực thi của hệ thống
nên nó được sử dụng cho các dịch vụ song song có hiệu năng cao.
Một dịch vụ middleware quan trọng hỗ trợ truyền thông hướng thông điệp, đó chính là
hàng đợi thông điệp hay còn gọi là middleware hướng thông điệp (MOM). Các mô hình
MOM hỗ trợ truyền thông dị bộ kiên trì. Chúng được sử dụng chủ yếu cho việc kết hợp
các bộ dữ liệu phân tán rộng rãi vào trong các hệ thống thông tin quy mô lớn. MOM cung
cấp khả năng lưu trữ trung gian cho thông điệp, vì thế nó rất thích hợp cho việc truyền
các thông điệp có dung lượng lớn. Khi sử dụng MOM người gửi sẽ được đảm bảo rằng
thông điệp của mình nhất định sẽ được đưa vào trong hàng đợi thông điệp của người
nhận, bên cạnh đó người nhận và người gửi có thể làm việc hoàn toàn độc lập với nhau.
Một dạng truyền thông nữa hoàn toàn khác với những dạng truyền thông kể trên được gọi
là truyền thông hướng dòng. Nếu như RPC, RMI hay truyền thông hướng thông điệp đều
chỉ quan tâm đến tính độc lập và chính xác của các đơn vị thông tin, thời gian coi như
không có ảnh hưởng gì đến độ chính xác của dữ liệu. Thì với truyền thông hướng dòng,

thời gian đóng một vai trò hết sức quan trọng. Nhất là với những dữ liệu liên tục thì quan
hệ về mặt thời gian phải chính xác để đảm bảo cho việc trình diễn dữ liệu đạt hiệu quả
cao. Mô hình truyền thông hướng dòng đòi hỏi phải có những giao thức đặc biệt để trao
đổi những dữ liệu phụ thuộc vào thời gian, chẳng hạn như giao thức RTP hay RTCP. Mô
hình này cũng yêu cầu những cơ chế để đồng bộ hoá các dòng dữ liệu video và audio. Để
đảm bảo chất lượng dịch vụ khi sử dụng truyền thông hướng dòng cần phải lưu ý đến
những nhân tố ảnh hưởng khi truyền, đó có thể là độ trễ hay jitter…Những nhân tố này
có thể ảnh hưởng rất lớn đến hiệu năng của dịch vụ.
Phần III - Tiến trình
Tiến trình đóng vai trò hết sức quan trọng trong hệ phân tán vì nó là cơ sở cho việc truyền
thông giữa các máy khác nhau trong hệ. Một vấn đề đáng quan tâm là các tiến trình được
tổ chức bên trong như thế nào và liệu chúng có hỗ trợ điều khiển đa luồng hay không.
Việc tạo và quản lý các tiến trình nhìn chung là một công việc khó khăn, hơn nữa việc
đảm bảo cho tất cả các tiến trình cùng tồn tại hòa bình trong một hệ thống cũng không hề
dễ dàng, nhất là khi phải đảm bảo được tính trong suốt tương tranh.
Luồng là giải pháp để đảm bảo việc thực thi các công việc đồng thời trong một tiến trình.
Với luồng, hệ điều hành không phải đảm nhận trách nhiệm về vấn đề trong suốt tương
tranh mà các ứng dụng phải tự lên kế hoạch cho mình. Luồng thường được sử dụng để
giảm tác động của các thao tác khối (ví dụ như IO, hay ứng dụng mạng). Có 2 điểm cần
lưu ý về luồng. Đấy là:
1. Các ứng dụng được phân luồng thường chạy nhanh hơn các ứng dụng
không phân luồng (vì việc chuyển đổi ngữ cảnh giữa nhân và không gian
người sử dụng đã bị loại bỏ).
2. Các ứng dụng được phân luồng khó phát triển hơn những ứng dụng khác,
do đó các môi trường lập trình đã cung cấp các thư viện Luồng để lập trình
viên có thể sử dụng.
Luồng trong hệ phân tán đặc biệt hữu trong việc cho phép tiếp tục sử dụng CPU khi một
thao tác khối IO đang được thực hiện. Chính vì thế mà nó tạo ra cơ hội để xây dựng các
server hiệu năng cao chạy được đa luồng song song.
Việc tổ chức các ứng dụng trong hệ phân tán theo mô hình client-server tỏ ra khá hiệu

quả. Các tiến trình phía client nhìn chung được thực thi từ các giao diện người sử dụng,
những giao diện này có thể được sắp xếp một cách đơn giản hay phức tạp tuỳ theo ứng
dụng. Giao diện có thể tích hợp các tài liệu ghép để tạo sự tương tác với người dùng, ví
dụ drag-and-drop cho phép người dùng có thể di chuyển đối tượng ngang màn hình để
triệu gọi tương tác tới một ứng dụng khác, hay các ứng dụng ở mức giao diện người dùng
khác như: bộ xử lý từ và các tiện ích đồ hoạ v.v… Các phần mềm phía client thường
nhắm tới mục đích tạo ra sự trong suốt bằng cách ẩn các chi tiết liên quan đến việc
truyền thông với server dù server đó là server cục bộ hay là một server được nhân bản. Ví
dụ, tính trong suốt truy cập được đảm bảo bằng việc sử dụng các client-stub khi gọi các
RPC. Tính trong suốt vị trí và di trú được tạo ra bằng cách chỉ cho các phần mềm phía
client giữ vết vị trí thực của server. Và cho client-stub đảm nhận việc triệu gọi các đối
tượng bản sao để đảm bảo trong suốt nhân bản. Cuối cùng là đảm bảo lỗi chỉ xảy ra phía
client, cố gắng che dấu lỗi truyền thông và lỗi của server để đạt tính trong suốt về lỗi.
Server có cấu trúc phức tạp hơn client rất nhiều tuy nhiên việc thiết kế cấu trúc cho server
lại chỉ liên quan đến một số ít vấn đề. Một server có thể được thiết kế để hoạt động dưới
dạng lặp (tức là tại một thời điểm chỉ phục vụ được cho một client), hoặc ngược lại là
dạng đồng thời, thực thi một hay nhiều dịch vụ, có trạng thái (tức là có lưu giữ vết của
các client) hay không có trạng thái (tức là không lưu giữ những thông tin chính xác về
tình trạng của client sau khi xử lý các request). Một số vấn đề khác trong việc thiết kế lại
liên quan đến việc định địa chỉ dịch vụ và các cơ chế để ngắt một server sau khi một yêu
cầu dịch vụ được đưa ra và dịch vụ đó có khả năng sẽ được thực hiện.
Các đối tượng server tạo ra một lớp đặc biệt, khi cần, mỗi đối tượng server trở thành một
tiến trình với một số đối tượng nằm trong không gian địa chỉ của nó, và tiển trình này sẽ
chấp nhận các triệu gọi từ phía client. Điều khiến cho một đối tượng server trở nên đặc
biệt là do nó có nhiều cách để gọi đến các đối tượng. Ví dụ, một server có thể tạo ra một
luồng riêng biệt cho mỗi lời triệu gọi. Nói một cách khác là nó có thể sử dụng mỗi luồng
cho mỗi đối tượng, hay thậm chí là một luồng cho tất cả các đối tượng của nó. Mỗi chính
sách triệu gọi khác nhau được xử lý bởi cùng một server bằng cách sử dụng một đối
tượng adapter.
Một vấn đề quan trọng trong các hệ phân tán là việc di trú mã giữa các máy khác nhau.

Di trú mã là việc một tiến trình được di chuyển từ máy này sang máy khác. Hai lý do
quan trọng để thực hiện việc di trú mã là để tăng hiệu năng cũng như tính linh hoạt của hệ
phân tán. Khi việc truyền thông trở nên đắt đỏ để có thể thực hiện được thì chúng ta có
thể giảm tải cho truyền thông bằng cách chuyển việc tính toán từ server sang client và để
cho client có thể xử lý công việc cục bộ càng nhiều càng tốt. Tính linh hoạt của hệ sẽ
được tăng nếu như client có thể tải động các phần mềm cần thiết để truyền thông tới một
server. Sau khi cài đặt phần mềm đã tải về thì client có thể triệu gọi đến server. Như thế
là client chỉ tải phần mềm khi cần và có thể loại bỏ nó ngay sau khi thực hiện xong công
việc của mình.
Di trú mã có thể theo mô hình di động yếu tức là chỉ chuyển các đoạn mã và đoạn dữ liêụ
rồi sau khi di trú mã đến nơi cần thiết thì sẽ tiến hành việc thực hiện tiến trình lại từ đầu.
Hoặc có thể di trú theo mô hình di động mạnh, tức là chuyển toàn bộ từ đoạn mã, đoạn
dữ liệu đến cả trạng thái đang thực hiện của tiến trình đến đích, sau khi di trú xong thì sẽ
khởi động một bản sao của tiến trình cũ với cùng một trạng thái như trước khi nó được
chuyển đi.
Việc di trú mã cũng đưa lại một số vấn đề liên quan đến việc sử dụng các tài nguyên cục
bộ, đấy là việc phía máy đích không có sẵn những tài nguyên mà tiến trình đang sử dụng
tại máy nguồn, do đó dẫn đến yêu cầu phải di trú cả tài nguyên. Một ràng buộc tới các tài
nguyên cục bộ sẽ được thiết lập cho máy đích hay cho cả hệ thống mạng có tham chiếu
tới tài nguyên này.
Một vấn đề nữa là về việc di trú mã trong các hệ không đồng nhất. Các máy đich có thể
không thích hợp để thực hiện việc di trú do ngữ cảnh của tiến trình phụ thuộc rất nhiều
vào phần cứng cũng như hệ điều hành và hệ thống của máy. Giải pháp được coi là tốt
nhất cho trường hợp này là sử dụng một máy ảo để ẩn đi sự không đồng nhất trong quá
trình thực hiện mã.
Cuối cùng chúng ta cần phải lưu tâm tới định nghĩa tác tử mềm, một dạng tiến trình đặc
biệt, được thực hiện như một đơn vị tự trị, tuy nhiên lại có khả năng phối hợp cùng những
tác tử khác. Nhìn từ khía cạnh của hệ phân tán thì sẽ thấy điều làm cho một tác tử khác
với tiến trình là ở chỗ nó sử dụng một giao thức truyền thông mức ứng dụng gọi là ngôn
ngữ truyền thông tác tử (ACL). Trong một ACL có sự phân biệt rạch ròi giữa mục đích

của thông điệp với nội dung của nó.
ACL định nghĩa ra một giao thức truyền thông bậc cao giữa các tác tử. Mỗi thông điệp
được gửi đi từ một tác tử sẽ khiến cho tác tử nhận phản ứng theo một cách nào đó tuỳ
theo mục đích của thông điệp.
Phần IV - Định danh
Tên đóng vai trò quan trong bất cứ hệ thống máy tính nào. Chúng có thể được sử dụng để
chia sẻ tài nguyên, để định danh duy nhất cho một thực thể, để tham chiếu đến vị trí của
thực thể đó, và còn nhiều tác dụng khác nữa. Trong các hệ phân tán thì có 3 kiểu tên, đấy
là địa chỉ, định danh và tên thân thiện với con người.
• Địa chỉ là tên của điểm truy cập được kết hợp với một thực thể, nó có thể được
gọi một cách đơn giản là địa chỉ của thực thể.
• Định danh là một kiểu tên đặc biệt với những tính chất sau:
1. Một định danh chỉ tham chiếu nhiều nhất đến một thực thể.
2. Mỗi thực thể chỉ bị tham chiếu bởi nhiều nhất một định danh.
3. Một định danh luôn luôn tham chiếu đến cùng một thực thể (nó không bao
giờ được sử dụng lại để tham chiếu đến một thực thể khác).
• Cuối cùng là tên thân thiện với con người thường do người dùng tự định nghĩa và
được biểu diễn dưới dạng các chuỗi kí tự.
Tên trong hệ phân tán thường được tổ chức vào một không gian tên. Không gian tên có
thể được biểu diễn bởi một đồ thị có hướng, trong đó mỗi nút đại diện cho một thực thể
được đặt tên và nhãn tại mỗi đỉnh biểu diễn tên của thực thể đó. Có 2 loại nút.
• Nút lá biểu diễn một thực thể có tên và thực thể đó không có đỉnh nào đi ra. Một
nút lá thường chứa thông tin của thực thể mà nó biểu diễn. Mặt khác nó cũng có
thể chứa trạng thái của thực thể.
• Trái ngược với nút lá là nút thư mục. Một nút thư mục có nhiều đỉnh đi ra, mỗi
nút thư mục lưu trữ một bảng thư mục, trong bảng đó, mỗi đỉnh đi ra được biểu
diễn bằng một cặp: nhãn của đỉnh và định danh của nút mà nhãn tham chiếu tới.
Các đồ thị tên quy mô lớn thường được tổ chức dưới dạng đồ thị có hướng, không vòng
với một nút gốc.
Các đồ thị tên rất thuận tiện cho việc tổ chức các tên “thân thiện với con người” một cách

có cấu trúc. Một thực thể tên trong đồ thị có thể được tham chiếu qua một đường dẫn tên,
là một trật tự các nhãn tương ứng với các đỉnh trên đường để tới được vị trí của thực thể.
Nu nút  u tiên ca    n g dn tên là nút gc ca   th, thì    n g ó    c gi là    n g
dn tên tuyt   i, nu không thì nó    c gi là    n g dn tên t ng   i.
Ng i ta cng   a ra khái nim phân gii tên, ây là vic i theo các h ng trên mt  
th tên bng cách tra cu các thành phn ca mt    n g dn tên, mi ln i theo mt nhãn
trên    n g dn cho ti khi tìm   n    c thc th. Mt   th tên có quy mô ln th  ng
   c thc thi bng cách phân phi các nút ca nó ti nhiu name server (nhng nút này
   c gi là nút cài). Phân gii tên lúc này không ch    c s dng trong mt không gian
tên riêng l na mà nó còn    c s dng   hòa nhp các không gian tên khác nhau mt
cách trong sut. Khi ln theo mt    n g dn tên trong mt   th, nu phân gii tên gp
mt nút cài ca server khác thì ngay lp tc nó s tip tc thc hin công vic ti server
này.
Mt không gian tên trong các h phân tán th  ng có cu trúc phân tng, chúng    c chia
ra thành 3 tng logic.
• Tầng tổng thể (global layer) được tạo thành từ những nút bậc cao nhất, là nút gốc
và những nút con của nó. Ở tầng này, tính sẵn sàng cao là một tiêu chí đặc biệt
nghiêm ngặt
• Tầng quản trị (administrational layer) được tạo thành từ các nút thư mục được
quản lý bởi một tổ chức riêng lẻ. Những nút thư mục ở tầng này đại diện cho
nhóm các thực thể thuộc về cùng một tổ chức hay cùng một đơn vị quản trị. Ở
tầng này, tính sẵn sàng cũng tương đối quan trọng.
• Tầng quản lý (managerial layer) bao gồm các nút thay đổi một cách thường
xuyên, chúng biểu diễn những thư mục và file do người dùng tự định nghĩa. Các
nút trong tầng này được duy trì không chỉ bởi người quản trị hệ thống mà còn bởi
những người dùng cuối trong hệ phân tán. Ở tầng này, hiệu năng là một vấn đề
cốt lõi.
Các hệ thống định danh cho những tên “thân thiện với con người” thường không thích
hợp với các thực thể di động mạnh. Việc định vị những thực thể này có thể tiến hành một
cách hiệu quả hơn bằng cách sử dụng các định danh độc lập vị trí. Có 4 cách cơ bản để

tiếp cận việc định vị cho một thực thể di động:
• Phương pháp tiếp cận thứ nhất là sử dụng Broadcasting hoặc Multicasting. Định
danh của thực thể sẽ được quảng bá đến mỗi tiến trình của hệ phân tán hoặc đến
mỗi tiến trình của một nhóm multicast nào đó. Tiến trình sẽ đưa ra một điểm truy
cập, đồng thời cung cấp địa chỉ điểm truy cập đó để thực thể có thể trả lời. Tuy
nhiên, phương pháp này sẽ không hiệu quả nếu thực hiện trong một mạng có quy
mô lớn.
• Phương pháp tiếp cận thứ hai là sử dụng con trỏ chuyển tiếp. Ý tưởng của phương
pháp này là: khi một thực thể rời từ vị trí A sang vị trí B thì nó sẽ để lại A một
con trỏ trỏ đến vị trí B. Để định vị được thực thể thì cần phải lần theo đường đi
của các con trỏ chuyển tiếp. Tuy nhiên phương pháp này có một số nhược điểm
như: chuỗi chuyển tiếp có thể rất dài vì thế sẽ tạo trễ và việc tra cứu sẽ có chi phí
cao, tính mở của hệ thống sẽ bị giảm do thời gian để duy trì các mắt xích trung
gian là không xác định, các mắt xích trung gian có thể bị gãy dẫn đến việc mất
dấu thực thể, vì thế sẽ làm giảm tính tin cậy của hệ thống. Do đó, để tránh việc
chuỗi chuyển tiếp trở nên quá lớn thì việc quan trọng là phải giảm độ dài chuỗi
thường xuyên.
• Phương pháp tiếp cận thứ ba là home-based, tức là mỗi thực thể được gán cho
một vị trí gốc (nhà), vị trí gốc này giữ dấu vị trí hiện thời của thực thể. Client giao
tiếp với vị trí gốc để xác định xem thực thể thực sự nằm ở đâu. Nếu client mất dấu
thực thể thì luôn luôn có thể quay lại vị trí gốc để tìm lại. Tuy nhiên phương pháp
này có thể gây trễ trên mạng, và nếu thực thể quyết định đổi vị trí gốc thì có thể
dẫn đến việc vĩnh viễn mất dấu.
• Phương pháp thứ tư là xây dựng một cây tìm kiếm phân cấp. Mạng được chia ra
thành các domain không chồng lên nhau, các domain có thể được nhóm lại thành
các domain mức cao hơn v.v… Sẽ có một domain mức đỉnh cho toàn bộ mạng,
mỗi domain tại mỗi mức có một nút thư mục liên kết với mình. Nếu một thực thể
được định vị tại domain D thì nút thư mục của domain cao hơn D một mức sẽ
chứa con trỏ trỏ tới D. Nút thư mục mức thấp nhất sẽ lưu địa chỉ của thực thể. Nút
thư mục mức đỉnh phải biết về tất cả các thực thể của hệ. Phương pháp tiếp theo

kiểu phân cấp này được sử dụng khá phổ biến và có thể được mở rộng cả về kích
thước lẫn vị trí địa lý.
Những thực thể không còn định vị được nữa thì cần phải bị loại bỏ. Một mục đích sử
dụng quan trọng của tên trong hệ phân tán là để tập hợp các tham chiếu tới một thực thể,
đây cũng chính là cách để có thể tự động loại bỏ những thực thể không còn được tham
chiếu nữa. Để thực hiện việc “thu nhặt rác” này có thể sử dụng một trong các phương
pháp sau đây:
• Tính toán tham chiếu: với phương pháp này một thực thể chỉ phải làm công việc
đơn giản là đếm số lượng tham chiếu trỏ tới nó. Khi bộ đếm chỉ về số 0 thì thực
thể đã đến lúc bị loại bỏ. Ngoài ra, nếu không muốn đếm số lượng tham chiếu thì
cũng có thể duy trì một danh sách các tiến trình tham chiếu tới một thực thể,
phương pháp liệt kê tham chiếu này mạnh hơn phương pháp tính toán tham chiếu,
tuy nhiên nó lại gặp phải vấn đề với việc tăng tính mở rộng cho hệ thống.
• Phương pháp thứ 2 là tracing-based, với phương pháp này tất cả các thực thể bị
tham chiếu một cách trực tiếp hay gián tiếp từ một tập các thực thể gốc được định
trước, đều được đánh dấu là reachable (có thể đến được). Những thực thể
unreachable sẽ bị loại bỏ. Phương pháp này rất khó thực hiện vì thực thể nào
trong hệ cũng phải bị kiểm tra. Giải pháp cho vấn đề này thì có nhiều nhưng nhìn
chung đều dựa vào các phương pháp thu gom rác truyền thống được sử dụng
trong các hệ đơn xử lý.
Phần V - Đồng bộ hoá
Liên quan chặt chẽ đến việc giao tiếp giữa các tiến trình chính là vấn đề làm cách nào để
đồng bộ các tiến trình trong một hệ phân tán. Đồng bộ hóa là đảm bảo cho những việc
thích hợp được làm vào những thời điểm thích hợp. Tuy nhiên trong các hệ phân tán cũng
như trong các hệ thống mạng nói chung không hề tồn tại khái niệm về một đồng hồ chia
sẻ tổng thể. Nói cách khác, các tiến trình trên những máy khác nhau có ý kiến riêng của
mình về vấn đề thời gian. Và không gì đảm bảo được rằng các đồng hồ vật lý trên từng
máy có thể chạy với cùng một tần số.
Có nhiều cách khác nhau để đồng bộ các đồng hồ trong một hệ phân tán, tuy nhiên tất cả
các phương pháp đều chủ yếu dựa trên việc trao đổi các giá trị đồng hồ, rồi tính toán thời

gian cần thiết để gửi và nhận thông điệp. Có 3 giải thuật được sử dụng để đồng bộ hoá
đồng hồ vật lý. Đấy là:
• Giải thuật của Cristian: trong giải thuật này, máy chủ hoàn toàn bị động trong việc
định vị thời gian. Nó phải đợi thông điệp từ máy khách, sau đó mới trả lời.
• Giải thuật Berkeley: với giải thuật này, máy chủ hoàn toàn chủ động trong việc
tính toán và phân phối thời gian.
• Giải thuật trung bình: nếu 2 giải thuật trên là giải thuật tập trung thì giải thuật này
lại là phân tán.Thuật toán này đồng bộ đồng hồ dựa trên nguyên tắc phân chia thời
gian thành các khoảng cố định rồi đồng bộ hoá lại các khoảng đó.
Trong nhiều trường hợp, việc biết đến thời gian tuyệt đối là không cần thiết. Chúng ta chỉ
cần quan tâm đến việc các sự kiện có liên quan đến nhau nhưng nằm tại các tiến trình
khác nhau phải được diễn ra theo đúng trình tự. Lamport đã đưa ra hướng giải quyết cho
vấn đề trên bằng cách giới thiệu khái niệm về đồng hồ logic. Đồng hồ logic cho phép một
tập các tiến trình đạt được thỏa thuận chung về thứ tự thực hiện chính xác của từng sự
kiện. Giả sử có sự kiện e, e có thể đang gửi hoặc đang nhận một thông điệp, sự kiện này
được gán cho một tem thời gian logic tổng thể và duy nhất C(e) thoả mãn những điều
kiện sau:
1. Nếu có một sự kiện a xảy ra trước sự kiện b thì C(a) < C(b).
2. Nếu a gửi đi một thông điệp m và b là bên nhận thông điệp đó thì C(a) <
C(b).
Vấn đề đặt ra là làm thế nào để gán một tem thời gian vào một sự kiện khi không có đồng
hồ tổng thể. Giải pháp cho việc đó là duy trì một tập nhất quán các đồng hồ logic, mỗi
đồng hồ được gán cho một tiến trình.
Tem thời gian Lamport có thể được mở rộng ra thành một vector tem thời gian thoả mãn
điều kiện sau: nếu C(a) < C(b) thì sự kiện a là sự kiện tiền nhân quả của b.
Vì không có một khái niệm nào về bộ nhớ chia sẻ trong một hệ phân tán nên rất khó để
xác định chính xác được trạng thái hiện thời của hệ thống. Tuy nhiên ta có thể xác định
được trạng thái tổng thể của hệ, trạng thái này chính là tập hợp các trạng thái cục bộ của
từng tiến trình cùng với những thông điệp đang được truyền qua chúng. Việc quyết định
trạng thái tổng thể của một hệ phân tán có thể được thực hiện bằng cách đồng bộ tất cả

các tiến trình của hệ. Việc đồng bộ tự bản thân nó có thể được thực hiện mà không cần
phải ép các tiến trình dừng hoạt động để thu thập trạng thái của chúng. Hơn nữa việc để
các tiến trình trong hệ phân tán tiếp tục hoạt động còn có thể giúp thu thập được các
snapshot về trạng thái hiện thời của tiến trình.
Việc đồng bộ giữa các tiến trình thường yêu cầu phải có một tiến trình đảm nhận vai trò
làm điều phối viên để khởi tạo cho việc đồng bộ và thực hiện một số vai trò đặc biệt
khác. Trong một số trường hợp khi điều phối viên không được cố định thì cần thiết phải
quyết định xem tiến trình nào có thể trở thành điều phối viên. Vì lý do này mà các giải
thuật bầu cử đã ra đời. Có 2 giải thuật tiêu biểu là giải thuật Bully và giải thuật vòng.
Một lớp quan trọng trong các giải thuật đồng bộ hoá được gọi là “loại trừ lẫn nhau phân
tán” (distributed mutual exclusion). Những giải thuật này đảm bảo rằng: trong một tập
các tiến trình phân tán thì ít nhất tại một thời điểm phải có một tiến trình được truy cập
vào tài nguyên chia sẻ. Điều này có thể dễ dàng thực hiện bằng cách sử dụng một điều
phối viên để lưu vết các tiến trình và quyết định xem đến lượt tiến trình nào được phép sử
dụng tài nguyên. Có một số giải thuật phân tán hoàn toàn đã được đưa ra.
• Giải thuật tập trung: đây là giải thuật đơn giản nhưng cũng hiệu quả nhất, nó sử
dụng điều phối viên để cho phép tại mỗi thời điểm chỉ một tiến trình được phép
truy cập vào vùng tới hạn, và không có tiến trình nào phải chờ đợi vĩnh viễn.
Nhược điểm của giải thuật này là có thể tạo ra các nút cổ chai do chỉ có một mình
điều phối viên xử lý mọi việc và nếu điều phối viên bị sụp thì có thể dẫn đến việc
cả hệ thống cũng sụp theo.
• Giải thuật phân tán: ý tưởng của giải thuật này là với một cặp sự kiện bất kì,
chẳng hạn như một cặp thông điệp thì phải phân biệt rõ ràng xem sự kiện nào sẽ
được xảy ra trước. Giống như giải thuật tập trung, giải thuật này cũng đảm bảo
không có thời gian chết cũng như không có tiến trình nào phải đợi quá lâu. Tuy
nhiên giải thuật này chỉ tốt nếu được thực hiện với một nhóm nhỏ tiến trình và
nhóm này không bao giờ thay đổi thành viên trong nhóm của mình.
• Giải thuật Token Ring: Tại mỗi thời điểm chỉ có một tiến trình giữ thẻ bài mới
được truy cập vào vùng tới hạn. Nếu một tiến trình được một tiến trình láng giềng
truyền thẻ bài cho nhưng nó lại không muốn vào vùng tới hạn thì nó có thể truyền

thẻ bài đó đi tiếp.Giải thuật này cũng sẽ gặp vấn đề nếu như một tiến trình bị sụp,
tuy nhiên việc khôi phục lại nó thì lại dễ hơn so với 2 giải thuật trên.
Một vấn đề nữa cũng cần được quan tâm, đấy chính là các giao dịch phân tán. Một giao
dịch bao gồm một loạt các thao tác lên các dữ liệu chia sẻ nhằm bảo vệ dữ liệu khỏi việc
bị truy cập đồng thời bởi các tiến trình tương tranh. Một giao dịch phải đảm bảo tính
ACID, tức là phải có 4 tính chất sau:
1. Automic (Tính nguyên tử): không có kết quả trung gian nào của giao dịch
có thể quan sát được bởi thế giới bên ngoài.
2. Consistent (Tính nhất quán): các giao dịch không xung đột với những sự
bất biến của hệ thống.
3. Isolated (Tính tách biệt): các giao dịch tương tranh không can thiệp vào
nhau.
4. Durable (Tính bền): khi một giao dịch được thực hiện thì thay đổi mà nó
tạo ra tồn tại vĩnh viễn trong hệ thống.
Các giao dịch trong hệ phân tán lại được phân lớp tùy thuộc vào tính chất của chúng. Có
3 dạng giao dịch:
• Flat transaction: là giao dịch có chứa một loạt các thao tác thoả mãn tính chất
ACID. Loại giao dịch này có một số nhược điểm trong đó nhược điểm chính là nó
không cho phép việc thực hiện từng phần của giao dịch.
• Nested Transaction: Cấu trúc của kiểu giao dịch này được quyết định bởi sự phân
rã chức năng của ứng dụng, nó bao gồm một số giao dịch nhỏ được phân rã từ
những giao dịch thực hiện song song với nhau nhằm làm tăng hiệu năng cho hệ
thống.
• Distributed Transaction: Cấu trúc của giao dịch này lại được quyết định bởi sự
phân tán của dữ liệu trong hệ. Về bản chất nó là các Flat transaction, nhưng cải
tiến hơn ở chỗ là có thể phân chia ra thành các giao dịch nhỏ dùng chung một cơ
sở dữ liệu, đối lập với nested transaction là các giao dịch con độc lập về cơ sở dữ
liệu.
Phần VI - Nhất quán và nhân bản
Nhân bản là việc tạo ra và duy trì các bản sao của dịch vụ và dữ liệu trong một hệ phân

tán. Có 2 lý do chính để thực hiện việc nhân bản dữ liệu.
• Tăng tín tin cậy cho hệ thống: tạo ra càng nhiều bản sao dữ liệu thì càng chứng tỏ
là dịch vụ luôn sẵn sàng ở mức cao.
• Tăng hiệu năng của hệ thống: các dịch vụ sao lưu có thể giúp giảm tải cho các
server đồng thời cũng làm tăng quy mô của hệ thống cả về số lượng lẫn phạm vi
địa lý.
Việc nhân bản dữ liệu cũng có những đòi hỏi khắt khe.
• Phải đảm bảo tính trong suốt: Người dùng chỉ nhìn thấy những đối tượng logic
chứ không phải là những bản sao vật lý.
• Phải đảm bảo tính nhất quán.
Việc nhân bản phải đảm bảo được tính nhất quán cho các bản sao, điều này không hề dễ
dàng. Ta phải chắc chắn rằng khi một bản sao được cập nhật thì tất cả những bản còn lại
cũng phải được cập nhật theo. Mà việc cập nhật có thể không kịp thời hay không đúng
đắn do gặp trễ trên đường truyền. Giải pháp duy nhất cho vấn đề này là lựa chọn các mô
hình nhất quán cho phù hợp với mục đích và quy mô của hệ phân tán.
Mô hình nhất quán được sử dụng rộng rãi nhất là mô hình lấy dữ liệu làm trung tâm. Mô
hình này phân biệt giữa nhất quán mạnh và nhất quán yếu. Dưới đây là bảng so sánh về
các mô hình nhất quán.
Mô hình
nhất quán
Đặc điểm
Chặt
- Yêu cầu một thao tác đọc luôn luôn phải trả về một giá trị tương ứng với kết
quả của thao tác ghi gần nhất.
- Đòi hỏi phải có thời gian toàn cục tuyệt đối trong hệ phân tán mà trên thực tế
việc đó là điều không tưởng, vì thế việc sử dụng mô hình nhất quán chặt trên
thực tế điều không khả thi.
Tuyến tính
- Tất cả các tiến trình phải nhìn thấy mọi truy cập chia sẻ theo cùng một trật tự. -
Các truy cập được tăng thêm tính trật tự nhờ được sắp xếp theo một tem thời

gian lấy từ đồng hồ cục bộ của clientcủa client.
- Yếu hơn nhất quán chặt nhưng cũng hiếm khi được dùng trong thực tế.
Tuần tự
- Tất cả các tiến trình nhìn thấy các truy cập chia sẻ theo cùng một trật tự.
- Các truy cập không cần phải được sắp xếp theo trật tự thời gian.
- Yếu hơn nhất quán tuyến tính.
Nhân quả - Tất cả các tiến trình nhìn thấy các truy cập chia sẻ có quan hệ nhân quả theo
cùng một trật tự.
- Quan hệ nhân quả giữa 2 thao tác bất kì được xác định như sau:
• Một thao tác đọc có quan hệ nhân quả với thao tác ghi cung cấp dữ liệu
cho nó.
• Một thao tác ghi có quan hệ nhân quả với một thao tác đọc xảy ra trước
nó trong cùng một tiến trình.
• Nếu write1 → read và read → write2 thì write1 → write2.
- Các thao tác không có quan hệ nhân quả với nhau được coi là xảy ra đồng thời
và có thể được thực hiện theo bất kì trật tự nào miễn là chúng tuân theo trình tự
của chương trình.
- Yếu hơn nhất quán tuần tự.
FIFO
- Các thao tác ghi bởi một tiến trình đơn phải được tất cả các tiến trình khác nhìn
thấy theo cùng một trật tự mà chúng đề ra. Nhưng thao tác ghi bởi nhiều tiến
trình khác nhau có thể được thấy theo những trật tự khác nhau bởi các tiến trình
khác nhau.
- Yếu hơn nhất quán nhân quả.
Các mô hình nhất quán không sử dụng các thao tác đồng bộ hoá
Mô hình
nhất quán
Đặc điểm
Yếu - Đặc tính của nhất quán yếu:
• Việc truy cập đến một biến đồng bộ hóa được kết hợp với kho dữ liệu là

một nhất quán tuần tự.
• Không có thao tác nào lên các biến đồng bộ hóa được phép thực hiện cho
đến khi tất cả các thao tác ghi trước đó được hoàn thành ở mọi nơi.
• Không có thao tác đọc hay ghi dữ liệu lên các mục dữ liệu nào được
phép thực hiện cho đến khi tất cả các thao tác trước đó lên các biến đồng
bộ hóa được thực hiện.
-Dữ liệu chia sẻ có thể được coi là nhất quán chỉ sau khi việc đồng bộ hóa được
thực hiện.
- Có tính khả thi cao so với các mô hình nhất quán mạnh.
Đi ra - Đảm bảo tất cả dữ liệu đã được cập nhật khi vào một vùng tới hạn và khi rời
khỏi đó thì các cập nhật cục bộ đã sẵn sàng để chuyển cho các bản sao khác.
- Các quy tắc của nhất quán đi ra:
• Trước khi thực hiện một thao tác đọc hay ghi lên dữ liệu chia sẻ thì tất cả
các thao tác acquire do tiến trình thực hiện trước đó phải được hoàn tất
thành công.
• Trước khi một thao tác release được phép thực hiện thì tất cả các thao tác
đọc và ghi do tiến trình thực hiện trước đó phải được hoàn tất.
• Truy cập vào các biến đồng bộ hóa là nhất quán FIFO (Không yêu cầu
nhất quán tuần tự).
- Dữ liệu chia sẻ được nhất quán khi có sự đi ra khỏi một vùng tới hạn.
Đi vào - Gần giống với nhất quán đi ra, nhưng nếu như nhất quán đi ra có tác động lên
tất cả các mục dữ liệu chia sẻ thì nhất quán đi vào chỉ tác động lên những mục
dữ liệu có kết hợp với một biến đồng bộ hoá, gọi là mục dữ liệu bị gác (guarded
data-item).
- Điều kiện của nhất quán đi vào:
• Một thao tác acquire để truy cập vào một biến đồng bộ hóa không được
phép thực hiện trong một tiến trình cho đến khi tất cả các cập nhật lên dữ
liệu bị gác trong tiến trình đó được thực hiện.
• Trước khi một truy cập trong chế độ dành riêng của một tiến trình tới
một biến đồng bộ hóa được phép thực hiện thì không tiến trình nào khác

còn được giữ các biến đồng bộ hóa, trong chế độ không dành riêng thì
không cần yêu cầu như vậy.
• Sau khi một truy cập trong chế độ dành riêng lên một biến đồng bộ hóa
được thực hiện thì bất kì sự truy cập của tiến trình nào khác trong chế độ
không dành riêng lên biến đó cũng không được thực hiện cho đến khi
chủ nhân của biến đồng bộ thực hiện xong việc truy cập của mình.
- Dữ liệu chia sẻ của một vùng tới hạn được nhất quán khi có sự đi vào một
vùng tới hạn.
Các mô hình nhất quán sử dụng các thao tác đồng bộ hoá
Đối lập với mô hình nhất quán lấy dữ liệu làm trung tâm là mô hình nhất quán lấy người
dùng làm trung tâm. Những mô hình này không quan tâm đến thực tế là dữ liệu có thể bị
chia sẻ bởi nhiều người dùng, thay vào đó chúng tập trung vào việc đem đến sự nhất quán
dữ liệu cho người dùng.
Mô hình nhất quán Đặc điểm
Cuối cùng
- Tất cả các cập nhật phải được đảm bảo là cuối cùng cũng sẽ được
truyền tới tất cả các bản sao khác.
- Gặp khó khăn nếu các client là di động
Đọc đều
- Một client sẽ luôn nhìn thấy những dữ liệu mới hơn và không bao
giờ phải nhìn thấy những dữ liệu cũ hơn những gì mà mình đã đọc
trước đó.
- Về bản chất là phiên bản hướng người dùng của mô hình nhất quán
FIFO.
Ghi đều
- Một thao tác ghi lên một mục dữ liệu xác định sẽ được hoàn tất
trước khi có bất kì thao tác ghi nào khác lên mục dữ liệu đó bởi cùng
một client.
- Về bản chất cũng là phiên bản hướng người dùng của mô hình nhất
quán FIFO.

Đọc kết quả ghi
- Người dùng được đảm bảo rằng sẽ luôn được nhìn thấy những kết
quả ghi mới nhất.
Ghi theo sau đọc
- Người dùng được đảm bảo sẽ luôn được thực hiện thao tác ghi lên
một phiên bản dữ liệu mới nhất.
Để lan truyền các cập nhật nhiều kĩ thuật khác nhau đã được áp dụng. Có 3 yếu tố để
phân biệt giữa các kỹ thuật đấy. Đó là:
1. Lan truyền cái gì?
Chúng ta có thể quyết định chỉ lan truyền thông báo, lan truyền thao tác hay lan
truyền cả trạng thái của dữ liệu.
2. Các cập nhật được lan truyền tới đâu?
Không phải bản sao nào cũng cần phải được cập nhật ngay lập tức, việc lựa chọn
thời điểm để cập nhật một bản sao còn phụ thuộc vào giao thức phân tán, chẳng
hạn như giao thức bệnh dịch.
3. Ai là người khởi tạo quá trình lan truyền đấy?
Chúng ta có thể lựa chọn: đẩy cập nhật tới các bản sao khác (server khởi tạo việc
lan truyền) hoặc là kéo cập nhật về từ một bản sao khác (client khởi tạo việc lan
truyền).
Các giao thức nhất quán được sử dụng để mô tả các đặc tính thực thi của một mô hình
nhất quán. Dựa trên nhất quán tuần tự và các biến của mô hình nhất quán này chúng ta có
thể phân biệt 2 giao thức nhất quán là: primary-based và replicated-base.
Trong các giao thức primary-based, tất cả các thao tác cập nhật được chuyển tới một bản
sao chính rồi sau đó bản sao này sẽ đảm bảo cho các cập nhật được sắp xếp theo đúng trật
tự và được truyền đi. Giao thức này được sử dụng trong những trường hợp sau:
• Trong các hệ chủ khách truyền thống mà không hỗ trợ nhân bản.
• Trong các hệ cơ sở dữ liệu phân tán và các hệ thống file không yêu cầu cao về
tính chịu lỗi. Các bản sao thường được đặt trên cùng một mạng LAN.
• Sử dụng chỉ trên hệ thuần phân tán, kho dữ liệu không nhân bản.
• Dùng trong hệ thống bộ nhớ chia sẻ phân tán, nhưng tính toán linh hoạt trong chế

độ không kết nối.
Giao thức Primary-based có 2 loại:
• Giao thức ghi từ xa: tất cả các thao tác ghi được thực hiện chỉ trên một server từ
xa
• Giao thức ghi cục bộ: Trong giao thức này một bản sao của mục dữ liệu được duy
trì. Khi có yêu cầu thao tác ghi, mục dữ liệu được nhân bản từ server ở xa chuyển
đến server cục bộ.
Trong các giao thức replicated-based, một cập nhật được chuyển tới một số các bản sao
cùng lúc vì thế thao tác ghi có thể được tiến hành tại bất kì bản sao nào. Việc đảm bảo
các thao tác được sắp xếp đúng trật tự trong các giao thức này thực sự là công việc khó
khăn.
Giao thức Replicated-base có 3 loại:
• Giao thức nhân bản chủ động: các thao tác ghi được truyền đến tất cả các bản sao,
trong khi các thao tác đọc được thực hiện cục bộ. Giao thức ghi có thể được
truyền sử dụng giao tiếp point-to-point hay multicast. Ưu điểm của giao thức nhân
bản chủ động là tất cả các bản sao đều nhận được các thao tác cùng lúc và theo
cùng một trật tự
• Giao thức Quorumbased: các thao tác ghi được thực hiện trên một tập nhỏ nhất
các bản sao. Khi thực hiện một thao tác đọc, người dùng cũng phải liên hệ với
một tập các bản sao để tìm ra phiên bản mới nhất của dữ liệu.
• Giao thức Cache-coherence: được điều khiển bởi client thay vì server.
Phần VII - Chịu lỗi
Chịu lỗi là một vấn đề hết sức quan trọng trong việc thiết kế một hệ phân tán. Chịu lỗi
được định nghĩa là đặc tính của hệ thống để có thể che dấu sự cố và phục hồi được khi bị
lỗi. Nói một cách khác thì hệ thống được gọi là có tính chịu lỗi nếu nó vẫn có thể tiếp tục
vận hành khi có sự hiện diện của lỗi.
Chịu lỗi có quan hệ mật thiết với khái niệm “đáng tin cậy”, trong các hệ phân tán thì khái
niệm này có những đặc tính sau:
• Tính sẵn sàng: hệ thống luôn sẵn sàng chạy tốt tại mọi thời điểm.
• Tính tin cậy: hệ thống có thể làm việc tốt trong một khoảng thời gian liên tục và

kéo dài.
• Tính an toàn: nếu hệ thống có lỗi thì cũng không dẫn đến thảm hoạ.
• Khả năng bảo trì: hệ thống có khả năng phục hồi sau khi bị lỗi.
Một hệ thống có tính chịu lỗi đồng nghĩa với việc nó phải có khả năng kiểm soát lỗi, khả
năng này bao hàm việc ngăn ngừa, loại bỏ và dự báo lỗi.
Lỗi trong một hệ phân tán thường được phân thành 3 loại
• Lỗi nhất thời: lỗi xuất hiện một lần rồi biến mất.
• Lỗi lặp: lỗi xuất hiện và biến mất nhiều lần, rất khó để có thể xác định được chính
xác loại lỗi này.
• Lỗi lâu dài: mỗi khi loại lỗi này xuất hiện thì chỉ có việc thay thế hoặc sửa chữa
các bộ phận bị lỗi mới làm cho hệ thống trở lại hoạt động bình thường.
Có 5 mô hình lỗi. Dưới đây là bảng so sánh các mô hình lỗi này:
Mô hình lỗi Đặc điểm
Lỗi sụp đổ Xảy ra khi một server bị treo.
Lỗi bỏ sót
Bỏ sót nhận
Send omission
Xảy ra khi một server không trả lời một yêu cầu gửi đến.
- Server không nhận được yêu cầu gửi đến.
- Server không gửi được trả lời của mình tới người nhận.
Lỗi thời gian Server trả lời quá sớm hoặc quá trễ khi nhận được một yêu cầu.
Lỗi trả lời
Lỗi giá trị
Lỗi chuyển tiếp vị trí
Server trả lời sai một yêu cầu gửi đến.
- Giá trị trả lời sai
- Phản ứng của server không như mong đợi từ phía người gửi
yêu cầu.
Lỗi tuỳ ý Đây là một lỗi rất nghiêm trọng
Server có thể tạo ra một giá trị trả lời tuỳ ý vào bất cứ lúc nào,

những giá trị này có thể gây ra những hậu quả không lường trước
được.
Dư thừa là một phương pháp kỹ thuật có thể giúp che dấu lỗi. Có 3 kiểu dư thừa thường
được sử dụng, đấy là:
• Dư thừa thông tin: bổ sung thêm các bit thông tin thừa để phát hiện và phục hồi
lỗi.
• Dư thừa thời gian: cho phép một tiến trình có thể được thực hiện lại, giúp phục
hồi được những lỗi ngắn và không liên tục.
• Dư thừa vật lý: ngăn ngừa lỗi bằng cách bổ sung thêm tài nguyên.
Để cho các tiến trình đảm bảo được tính chịu lỗi chúng được tổ chức thành các nhóm.
Nhóm tiến trình bao gồm một số tiến trình được phối hợp với nhau một cách mật thiết để
cung cấp một dịch vụ nào đó. Trong một nhóm tiến trình có tính chịu lỗi thì việc một hay
nhiều tiến trình bị lỗi cũng không làm ảnh hưởng đến khả năng cung cấp dịch vụ của
nhóm đó. Việc truyền thông giữa các tiến trình trong một nhóm phải đảm bảo tính tin
cậy, cũng như phải tuân thủ những trình tự nghiêm ngặt và các tính chất động để đạt được
tính chịu lỗi.
Các nhóm tiến trình có thể được phân cấp theo cấu trúc bên trong như sau:
• Nhóm ngang hàng: tất cả các tiến trình đều bình đẳng với nhau, mọi quyết định
đưa ra đều là của tập thể. Với cách phân nhóm này thì khi một tiến trình gặp lỗi sẽ
không làm ảnh hưởng đến hoạt động của nhóm, tuy nhiên nó cũng có một nhược
điểm, đấy là việc đưa ra quyết định của nhóm khá phức tạp do yêu cầu phải có sự
đồng thuận từ tất cả các tiến trình.
• Nhóm phân cấp: trong nhóm sẽ tiến hành bầu cử để chọn ra một điều phối viên.
Điều phối viên sẽ chọn ra một tiến trình thích hợp để thực hiện công việc. Việc
một tiến trình gặp lỗi sẽ làm ảnh hưởng đến hoạt động của cả nhóm, tuy nhiên các
quyết định của nhóm được đưa ra rất nhanh và dễ dàng nhờ có vai trò của điều
phối viên.
Bằng cách tổ chức ra các nhóm tiến trình chịu lỗi chúng ta có thể bảo vệ an toàn cho các
tiến trình đơn, vì thế ta có thể nhân bản các tiến trình và tổ chức chúng lại thành các
nhóm để có thể đạt được tính chịu lỗi. Có 2 phương pháp nhân bản được sử dụng, đấy là

dùng giao thức primary-based (các tiến trình trong nhóm sẽ được tổ chức theo mô hình
phân cấp) và giao thức replicated-write (các tiến trình trong nhóm sẽ được tổ chức theo
mô hình ngang hàng).
Không chỉ có tiến trình mới bị lỗi, các kênh truyền thông cũng có thể gặp những lỗi như
lỗi sụp đổ, lỗi bỏ sót, lỗi thời gian và lỗi tùy ý. Trong truyền thông point-to-point, để có
thể tăng tính chịu lỗi người ta dùng các giao thức truyền tin cậy như TCP. Với hệ thống
RPC, các lỗi có thể phân thành 5 lớp:
• Client không thể định vị được server
• Mất thông điệp yêu cầu từ client gửi đến server.
• Server bị lỗi ngay sau khi nhận được yêu cầu từ client.
• Mất thông điệp phản hồi của server gửi cho client.
• Client bị lỗi ngay sau khi gửi yêu cầu tới server.
Mỗi lớp lỗi là một vấn đề khác nhau, vì thế cũng cần có những phương pháp khác nhau
để xử lý.
Truyền thông nhóm tin cậy, còn được gọi là multicast tin cậy, được biết đến với nhiều
dạng khác nhau. Khi quy mô của nhóm tiến trình còn tương đối nhỏ thì việc thực thi tính
tin cậy tương đối dễ dàng. Tuy nhiên, khi những nhóm tiến trình với quy mô lớn và rất
lớn xuất hiện thì việc đảm bảo được tính tin cậy cũng như tính co dãn cho các mô hình
truyền thông dạng multicast lại trở thành một vấn đề khó khăn. Vấn đề mấu chốt để đạt
được tính co dãn là phải giảm số lượng thông điệp phản hồi của người nhận cho người
gửi để báo cáo về việc mình đã nhận thành công một bản tin multicast.
Vấn đề càng trở nên tệ hơn khi có sự xuất hiện của multicast nguyên tử. Ý tưởng của giao
thức này là: tiến trình gửi sẽ không multicast bản tin tới tất cả các tiến trình trong nhóm
mà chỉ multicast tới một nhóm nhỏ tiến trình có nhu cầu nhận bản tin này. Vấn đề của
multicast nguyên tử là: hệ thống phải đảm bảo được rằng tất cả những tiến trình cần nhận
bản tin thì đã nhận được, hoặc là không có tiến trình nào trong số chúng nhận được, ngoài
ra hệ thống cũng phải đảm bảo được rằng tất cả các bản tin đã được truyền đến các tiến
trình theo đúng trật tự. Trong các giao thức multicast nguyên tử, mỗi thành viên trong
nhóm phải nhìn thấy những thành viên nào đã nhận được bản tin multicast.
Multicast nguyên tử có thể được mô phỏng một cách chính xác thông qua mô hình đồng

bộ ảo. Mô hình này đề ra ranh giới để xác định những nhóm thành viên không đổi và
những bản tin nào đã được truyền một cách đáng tin cậy. Có những bản tin không bao
giờ có thể vượt qua được ranh giới đó.
Mỗi tiến trình cần thoả thuận với nhau để có thể đảm bảo cho một thao tác được thực
hiện ở tất cả các tiến trình trong nhóm hoặc không được thực hiện ở bất cứ tiến trình nào.
Những thoả thuận đó có thể đạt được thông qua các giao thức cam kết. Có các giao thức
cam kết 1 pha, 2 pha và 3 pha, nhưng được sử dụng rộng rãi nhất chính là giao thức cam
kết 2 pha. Trong giao thức này, một điều phối viên trước tiên sẽ kiểm tra xem liệu tất cả
tiến trình có đồng ý thực hiện cùng một thao tác hay không (ví dụ như tất cả các tiến trình
đó đều đồng ý thực hiện cam kết chẳng hạn), tiếp theo sẽ multicast kết quả của cuộc thăm
dò ý kiến đó. Chỉ cần có một tiến trình không đồng ý thực hiện thì sẽ không có thao tác
nào được phép diễn ra. Nhược điểm của cam kết 2 pha là tốn thời gian chờ đợi, bên cạnh
đó hệ thống có thể không hoạt động được nếu như điều phối viên gặp sự cố. Cam kết 3
pha được sử dụng để xử lý tình hình khi điều phối viên bị sụp mà không cần phải cấm các
tiến trình đi đến thoả thuận trước khi điều phối viên được phục hồi.
Phục hồi trong một hệ thống chịu lỗi là đạt được sự bất biến bằng cách tạo ra các
checkpoint cho hệ thống một cách thường xuyên. Tuy nhiên việc tạo ra được một
checkpoint là điều không dễ dàng và cũng khá tốn kém. Để tăng hiêu năng của hệ thống,
nhiều hệ phân tán đã kết hợp việc tạo checkpoint cùng với việc tạo các log về các bản tin.
Việc ghi lại thao tác truyền thông giữa các tiến trình đã giúp cho việc tái tạo lại trạng thái
hoạt động của hệ thống mỗi khi hệ thống bị sụp trở nên dễ dàng hơn.

Phần VIII - An toàn
An toàn đóng một vai trò cực kỳ quan trọng trong hệ phân tán. Một hệ phân tán có thể bị
đe doạ an ninh bởi 4 nguy cơ sau:
• Xâm nhập: là việc truy cập trái phép vào dữ liệu
• Gián đoạn: làm cho không truy cập được vào dịch vụ hoặc dữ liệu nào đó.
• Sửa đổi: Sự sửa đổi trái phép hoặc giả mạo dữ liệu.
• Mạo danh: tạo ra những dữ liệu hoặc những hoạt động không bình thường.
Các hệ phân tán cần cung cấp một số cơ chế để cho phép các chính sách an toàn có thể

được áp dụng. Những cơ chế tiêu biểu là:
• Mã hóa: một kĩ thuật cơ bản được sử dụng để duy trì tính bảo mật và tính toàn vẹn
của hệ thống.
• Xác định thẩm quyền: xác nhận nhân dạng.
• Quyền hạn: xác định những thao tác được cho phép.
• Kiểm định: kiểm tra xem ai là người đã làm và làm cái gì, làm bao giờ và làm ở
đâu.
Việc các cơ chế an toàn có thể được đặt tại tầng nào trong mô hình phân tầng của hệ phân
tán phụ thuộc nhiều vào sự tin cậy của client đối với dịch vụ. Tuy nhiên việc phát triển và
áp dụng đúng đắn những cơ chế này đã đặt an toàn thành một vấn đề khó khăn cho việc
thiết kế các mô hình phân tán.
Có 3 vấn đề quan trọng cần được lưu ý trong khi xét đến tính an toàn của một hệ phân
tán.
Vấn đề thứ nhất là một hệ phân tán thường đưa ra những tiện ích cho việc thiết lập các
kênh an ninh giữa các tiến trình. Một kênh an ninh cung cấp các phương tiện để các thành
phần tham gia truyền thông có thể xác thực lẫn nhau và bảo vệ các thông điệp của mình
tránh lại sự giả mạo trong suốt quá trình truyền. Một kênh an ninh cũng cung cấp các cơ
chế bảo mật để đảm bảo rằng không ai khác ngoài những thành viên tham gia truyền
thông có thể đọc được các thông điệp được truyền trên kênh đó. Một vấn đề quan trọng
trong việc thiết kế các hệ phân tán là liệu chỉ nên sử dụng duy nhất hệ thống mã hóa đối
xứng - hệ thống dựa trên việc chia sẻ các khoá bí mật, hay là kết hợp nó với một hệ thống
khóa công khai. Thực tế hiện nay đã chỉ ra những lợi ích của việc sử dụng phương pháp
mã hóa bằng khoá công khai so với khoá mật chia sẻ, và một trong những cải tiến của
phương pháp mã hoá này là việc sử dụng kết hợp với một khoá phiên.
Vấn đề thứ 2 cần phải quan tâm trong một hệ phân tán đấy là việc điều khiển truy cập hay
có thể coi là việc xác định quyền hạn. Xác định quyền hạn là việc bảo vệ tài nguyên tránh
khỏi sự truy cập và sử dụng trái phép từ những tiến trình không đủ thẩm quyền.
Việc điều khiển truy cập luôn luôn diễn ra sau khi một tiến trình đã được xác thực. Có 2
cách để thực thi việc điều khiển truy cập.
Cách thứ nhất là mỗi tài nguyên có thể duy trì một danh sách điều khiển truy cập, danh

sách này liệt kê chính xác quyền hạn của từng người dùng hay từng tiến trình.
Cách thứ hai là mỗi tiến trình tự mang theo một chứng chỉ để xác nhận quyền của mình
đối với một tập tài nguyên nào đó. Lợi ích chính của việc sử dụng chứng chỉ là một tiến
trình có thể dễ dàng truyền lại vé của mình cho tiến trình khác sử dụng, hay nói cách khác
là uỷ nhiệm cho tiến trình khác được sử dụng những quyền của mình. Tuy nhiên việc sử
dụng chứng chỉ cũng có những bất lợi do việc thu hồi lại nó khá khó khăn.
Một điều cần phải đặc biệt quan tâm khi giải quyết vấn đề điều khiển truy cập đấy là “mã
di động”. Bên cạnh việc phải bảo vệ các tác tử di động khỏi sự tấn công từ các máy khác
thì ta còn phải bảo vệ các máy của mình tránh được sự tấn công từ các mã di động. Một
trong những giải pháp được đưa ra đấy là sử dụng sandbox. Tuy nhiên sandbox cũng có
những hạn chế, vì thế một số hướng tiếp cận mới dựa trên phương pháp miền bảo vệ thực
đã được ra đời.
Vấn đề thứ ba đáng quan tâm để đảm bảo tính an toàn cho một hệ phân tán đấy là vấn đề
quản trị. Quản trị ở đây là trên 2 khía cạnh: quản trị khoá và quản trị quyền hạn. Quản trị
khoá bao gồm cả việc phân phối các khoá mật. Trong khía cạnh quản trị này thì các
chứng chỉ được cấp phát từ một tổ chức thứ ba đáng tin cậy cũng đóng vai trò rất quan
trọng. Xét trên khía cạnh quản trị quyền hạn thì một chứng chỉ cùng với những thuộc tính
của nó cũng là một cách để có thể xác định quyền hạn và xác nhận sự uỷ quyền thông qua
chứng chỉ này.
Kerberos là một hệ thống an ninh được sử dụng rộng rãi trên thế giới. Nó hoạt động dựa
trên phương pháp chia sẻ các khoá bí mật. Hệ thống này tập trung chủ yếu vào việc xác
định thẩm quyền vì thế nó được tích hợp vào trong nhiều giao thức để kiểm soát truy cập
và sự uỷ quyền truy cập.
SESAME là một ví dụ điển hình về một hệ thống an ninh có thể tích hợp vào trong các hệ
phân tán. Nó hoạt động dựa trên sự kết hợp sử dụng phương pháp mã hóa khoá công khai
với khóa chia sẻ bí mật. Nó vay mượn nhiều phương thức hoạt động từ hệ thống
Kerberos và đang nỗ lực để có thể trở nên tương thích với Kerberos.
Cuối cùng phải nói đến các hệ thống thanh toán điện tử, một ứng dụng quan trọng trong
các hệ phân tán. Ứng dụng này đã tạo ra một phong cách mới cho thương mại điện tử, mở
rộng pham vi hoạt động của các doanh nghiệp số này ra toàn thế giới, nó là một cuộc

cách mạng so với các hệ thống thanh toán bằng tiền mặt truyền thống trong lĩnh vực quản
lý khách hàng. Khách hàng của hệ thống thanh toán điện tử có thể giấu mặt, không công
khai danh tính, điều này tạo cho thương mại điện tử tính linh hoạt so với những phương
pháp truyền thống khác.
Phần IX - Các hệ thống phối hợp phân tán
Những hệ phân tán thế hệ mới đều coi rằng các thành phần khác nhau của hệ thống là
phân tán và vấn đề thật sự khi phát triển những hệ phân tán như thế là việc làm thế nào để
phối hợp hoạt động của các thành phần này.
Nếu coi một hệ phân tán là một tập các tiến trình thì một hệ thống phối hợp chịu trách
nhiệm xử lý việc truyền thông và phối hợp giữa các tiến trình trong khi các tiến trình chịu
trách nhiệm trong việc tính toán.
Phần lớn các hệ thống phối hợp tập trung vào tính tách cặp có liên quan (referentially
uncouple) của các tiến trình, điều đó có nghĩa là các tiến trình không cần phải có liên
quan chặt chẽ với nhau vẫn có thể truyền thông với nhau. Bên cạnh đó, các hệ thống phối
hợp còn có thể hỗ trợ tính tách cặp theo thời gian (temporal decouple), nhờ có tính chất
này mà các tiến trình không cần phải cùng tồn tại trong cùng một không gian về thời gian
mà vẫn có thể truyền thông được với nhau.
TIB/Rendevous là một mô hình quan trọng của các hệ phối hợp. Mô hình này sử dụng
mô thức xuất bản / đặt mua. Bên xuất bản là bên gửi bản tin sử dụng cách đánh địa chỉ
theo “chủ đề”, tức là bên gửi không cần phải biết địa chỉ vật lý thực sự của bên nhận mà
nó chỉ cần gắn vào bản tin gửi đi một chủ đề rồi chuyển cho hệ thống truyền thông để
truyền trên mạng. Bên đặt mua tức là bên nhận bản tin chỉ cần đăng ký cho hệ thống
truyền thông biết mình muốn nhận loại thông tin gì và hệ thống sẽ đảm bảo việc truyền
đến cho bên nhận đúng những gì mà nó muốn.
Mô hình TIB/Rendevous truyền bản tin theo kiểu multicast, bên cạnh đó nó cũng sử dụng
thêm một số tiện ích truyền thông hiệu quả khi cần, ví dụ như việc sử dụng các bản tin
point-to-point để xác định phía thuê bao, sử dụng rendevous daemon để quản lý việc gửi
và nhận các bản tin hay sử dụng các router rendevous daemon để mở rộng hệ thống
mạng. Các bản tin được sử dụng trong mô hình này là bản tin tự mô tả và chứa các địa
chỉ theo chủ đề. Các bên tham gia truyền thông thì sử dụng cơ chế sự kiện để có thể nhận

bản tin đến.
Các tên sử dụng trong mô hình TIB/Rendervous là một chuỗi các nhãn kí tự được ngăn
cách với nhau bởi dấu chấm tương tự như một tên trong hệ thống DNS. Tên này phải bắt
đầu và kết thúc bằng một nhãn kí tự, các nhãn kí tự trong tên không được phép rỗng, độ
dài tên không vượt quá 255 kí tự. Mô hình này không sử dụng các dịch vụ định danh.
TIB/Rendevous hỗ trợ rất ít cho việc đồng bộ hoá các tiến trình, điều duy nhất mà nó có
thể đảm bảo là việc nó truyền các bản tin từ cùng một nguồn theo đúng trật tự mà chúng
được gửi đi, tức là sử dụng trật tự FIFO cho các bản tin này. Bên cạnh đó nó cũng đưa ra
dịch vụ “giao dịch riêng biệt” để hỗ trợ việc gửi và nhận bản tin thông qua các giao dịch.
TIB/Rendevous không có các tiện ích nào để hỗ trợ cho việc cache hay nhân bản dữ liệu
do đó các ứng dụng phải tự mình đảm nhận việc này.
Tuy nhiên TIB/Rendevous lại hỗ trợ khả năng chịu lỗi cho hệ thống theo 2 cách:
• Thứ nhất là đảm bảo việc truyền thông tin cậy, tránh mất mát thông tin khi truyền
thông. Để làm được điều đó TIB/Rendevous sẽ gắn cho mỗi bản tin một số thứ tự,
bên nhận có thể kiểm tra số thứ tự trên bản tin để xác định xem mình có nhận
thiếu bản tin nào không, nếu thiếu thì có thể yêu cầu bên gửi gửi lại.
• Thứ hai là hỗ trợ các nhóm tiến trình để bảo vệ tiến trình tránh khỏi những lỗi sụp
đổ. Bên cạnh đó TIB/Rendevous cũng cung cấp một cơ chế đơn giản để phát hiện
ra các tiến trình có thể làm cho hệ thống gặp lỗi.
TIB/Rendevous tập trung vào việc thiết lập các kênh an ninh giữa bên xuất bản và bên
đăng ký để đảm bảo an toàn trong truyền thông. Chẳng hạn, nó mã hoá những dữ liệu
xuất bản bằng phương pháp mã hóa công khai và chỉ cho phép những thuê bao có khóa
chia sẻ bí mật thì mới có thể giải mã được bản tin.
Tiếp đến chúng ta sẽ tìm hiểu về Jini, một mô hình khác của hệ phân tán phối hợp. Jini
hỗ trợ phương pháp truyền thông generative như trong các hệ thống Linda bằng cách sử
dụng các JavaSpace. JavaSpace là các cơ sở dữ liệu để lưu trữ các tuple (một dạng dữ
liệu có cấu trúc tương tự như bản ghi), cung cấp các cơ chế tách cặp có liên quan và tách
cặp theo thời gian cho tiến trình. Một tiến trình nếu muốn đọc các tuple từ một không
gian tuple thì trước tiên phải xác định xem mình đang muốn tìm dạng tuple nào bằng
cách cung cấp một mẫu tuple tới JavaSpace, nếu JavaSpace tìm được tuple đúng với mô

tả trong mẫu thì nó sẽ chọn tuple này gửi đến cho tiến trình yêu cầu. Nếu không tìm thấy
tuple nào phù hợp thì tiến trình đó sẽ bị khoá.
Jini yêu cầu rất đơn giản để có thể xây dựng các ứng dụng phân tán. Có thể coi Jini như
một mô hình 3 tầng.
• Tầng thấp nhất là cơ sở hạ tầng của Jini, bao gồm các dịch vụ tra cứu, Java RMI
và một số tiện ích khác.
• Tầng thứ hai là tầng chứa các tiện ích mở rộng, như giao diện giao dịch, các sự
kiện và thông báo, giao diện leasing v.v…
• Tầng thứ 3: bao gồm client và server.
Jini cung cấp các hệ thống con sự kiện, thông báo như một tiện ích truyền thông của
mình. Các mô hình sự kiện của Jini rất đơn giản. Nếu một đối tượng có một sự kiện gây
hứng thú cho client thì client có thể đăng ký với sự kiện đó để có thể nhận được những
ảnh hưởng từ sự kiện khi nó xảy ra. Đồng thời khi sự kiện xảy ra thì nó sẽ gửi thông báo
cho client biết thông qua các Java RMI.
Các tiến trình trong Jini thực chất là sự thực thi của các JavaSpace. Các JavaSpace này có
thể được thực thi trên các hệ thống đa xử lý hoặc các hệ thống đa máy tính.
Jini không cung cấp các dịch vụ định danh truyền thống tuy nhiên lại cho phép client có
thể tra cứu các dịch vụ đã đăng ký bằng cách sử dụng một tiện ích tìm kiếm. Bên cạnh đó
còn có dịch vụ leasing để cung cấp cho một đối tượng danh sách những đối tượng khác
đã tham chiếu đến nó. Khi danh sách này rỗng là lúc mà đối tượng có thể tự huỷ.
Jini cũng cung cấp một số cơ chế để đồng bộ hoá giữa các tiến trình. Một trong những cơ
chế quan trọng nhất là việc sử dụng các thao tác khối read và take. Những thao tác này có

×