Tải bản đầy đủ (.docx) (28 trang)

XÂY DỰNG GIẢI PHÁP ĐỒNG BỘ HÓA TIẾN TRÌNH TRÊN HỆ PHÂN TÁN VỚI 4 SERVER

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 (337.19 KB, 28 trang )

LỜI MỞ ĐẦU
Hệ tin học phân tán là hệ thống rất đa dạng, đa diện, phức tạp về mặt cấu trúc, là
vùng tri thức hiện đại đang được các chuyên gia công nghệ thông tin đặc biệt quan
tâm và đổi mới rất nhanh chóng.
Một trong những tư tưởng lớn của các hệ phân tán là phân tán hóa các quá trình
xử lý thông tin và thực hiện các công việc đó trên các trạm xa nhau. Đó là cơ sở để
xây dựng các hệ ứng dụng lớn như thương mại điện tử, giáo dục điện tử, chính phủ
điện tử. . .
Phân tán hóa các quá trình xử lý, tạo nên ưu thế của hệ có thể đáp ứng việc
giảiquyết các bài toán lớn, một cách nhanh chóng. Nhưng cũng tạo tính phức tạp, nan
giải trong các yêu cầu thiết lập hệ. Việc hợp lực của các thành viên trong hệ, dẫn đến
hàng loạt các vấn đề như: định danh, cấp phát tài nguyên dùng chung (đảm bảo tránh
tương tranh), giải quyết sự cố tạo nên tính tin cậy của hệ. . . Để đảm bảo tính gắn bó
của hệ, yêu cầu đặt ra trước hết là đồng bộ hóa các tiến trình. Với hệ phân tán (không
có bộ nhớ chung, bộ tạo xung đồng hồ chung), khả năng gắn bó và việc đồng bộ hóa
cho hệ chỉ dựa trên phương tiện duy nhất là truyền thông điệp, nên lời giải cho yêu
cầu đồng bộ hóa thường chỉ dừng lại ở mức chấp nhận được đối với mỗi hệ .
Về mặt bố cục, ngoài phần mở đầu, tài liệu tham khảo và mục lục, báo cáo được
chia làm 3 chương, chương 1 tổng quan về hệ phân tán, chương 2 nói về các công cụ
đồng bộ hoá các tiến trình trong hệ thống tin học và chương 3 xây dựng hệ thống
đồng bộ hóa trên hệ phân tán với 4 server
Page 1
CHƯƠNG 1. TỔNG QUAN VỀ HỆ PHÂN TÁN
1. Tổng quan về hệ tin học
Một cách tổng quát, hệ tin học có thể bao gồm các thành phần cơ bản như phần
cứng, hệ điều hành, các chương trình ứng dụng. Hệ tin học nói chung có thể được
mô hình hoá như sau:
HỆ ĐIỀU HÀNH
PHẦN CỨNG
II
III



I
Hình 1.1 Các thành phần của hệ tin học
Các thiết bị phần cứng bao gồm bộ xử lý trung tâm, bộ nhớ và các thiết bị ngoại
vi và đóng vai trò là một trong hai loại tài nguyên cơ sở của hệ thống tin học. Các
Page 2
chương trình ứng dụng là thành phần tiếp theo sau hệ điều hành, là các phần mềm
cơ sở phục vụ cho việc triển khai các ứng dụng cụ thể. Ví dụ như chương trình dịch,
hệ quản trị cơ sở dữ liệu, các chương trình trợ giúp sử dụng các thiết bị chuyên
dụng, các trò chơi điện tử
Người sử dụng là một khái niệm được hiểu theo nghĩa rộng, dưới góc độ hệ điều
hành. Đó có thể là các nhà chuyên môn, các máy tính, các hệ tự động vận hành gắn
với máy tính. . . đang khai thác hệ thống qua các lệnh điều khiển theo một thuật
toán nào đó nhằm đạt được mục tiêu xác định từ trước.
Phần cứng
Phần mềm
Dữ liệu
Hệ điều hành các máy tính và mạng máy tính được đặt sát phần cứng. Nó gắn
kết chặc chẽ với thiết bị bởi một hệ thống các chương trình điều khiển và sắp xếp
nhằm khai thác phần cứng phục vụ cho các chương trình ứng dụng khác nhau với
kết quả và hiệu năng chấp nhận được.
Hình 1.2 Ba thực thể của hệ tin học
Như vậy, hệ thống tin học là một hệ thống bao gồm hai phần cơ bản là phần
cứng và phần mềm gắn bó hữu cơ với nhau và có khả năng xử lý thông tin.
1.1. Hệ tin học tập trung
Tiêu biểu là hệ thống máy đơn, là máy không kết nối vật lý và logic với các máy
khác như hình vẽ sau:
Bộ
nhớ
trong

Page 3
U
1
U
2
Un
. . .
Hình 1.3 Hệ thống máy đơn
Ở một thời điểm nhất định, máy đơn được điều hành bởi một hệ điều hành duy
nhất. Hệ thống như vậy được gọi là hệ tin học tập trung, thích hợp với các máy tính
loại trung và loại lớn.
Tóm lại, hệ tin học tập trung bao gồm một hệ thống máy đơn được điều khiển
bởi một hệ điều hành duy nhất và quản lý toàn bộ thông tin trên thiết bị nhớ cục bộ
của mình.
1.2. Hệ tin học phân tán (hệ phân tán)
Hệ tin học phân tán là hệ thống không chia sẻ bộ nhớ và đồng hồ, khác với xu
hướng phân tán các tính toán trên nhiều bộ xử lý của hệ thống đa xử lý. Như vậy,
hệ tin học phân tán đòi hỏi hệ thống phần cứng của mình phải trang bị bộ nhớ cục
bộ, các bộ xử lý trao đổi thông tin với nhau thông qua các hệ thống đường truyền
như cáp chuyên dụng, đường điện thoại, cáp quang. . .
Như vậy, hệ tin học phân tán có thể bao gồm bốn thực thể như sau:
Phần cứng
Phần mềm
Dữ liệu
Truyền thäng
Page 4
Hình 1.3 Các thực thể của hệ phân tán
Một tư tưởng lớn của hệ tin học phân tán là phân tán hoá các quá trình xử lý
thông tin và thực hiện công việc đó trên các trạm khác nhau. Đó là cơ sở căn bản
cho việc xây dựng các ứng dụng lớn như thương mại điện tử, giáo dục điện tử,

chính phủ điện tử, thư viện điện tử, . . .
Hiện nay, đứng trên những phương diện khác nhau, có thể có các định nghĩa
khác nhau về hệ tin học phân tán, nhưng phổ biến hơn cả là định nghĩa sau:
Hệ tin học phân tán (hệ phân tán) là hệ thống xử lý thông tin bao gồm nhiều bộ
xử lý hay vi xử lý nằm tại các vị trí khác nhau và được liên kết với nhau thông qua
phương tiện viễn thông dưới sự điều khiển thống nhất của một hệ điều hành.
Từ định nghĩa trên, hệ phân tán có các ưu điểm căn bản so với hệ tập trung, như
sau:
- Tăng tốc độ bình quân trong tính toán, xử lý.
- Cải thiện tình trạng luôn sẵn sàng của các loại tài nguyên.
- Tăng độ an toàn cho dữ liệu.
- Đa dạng hoá các loại hình dịch vụ tin học.
- Đảm báo tính toàn vẹn của thông tin.
CHƯƠNG 2: ĐỒNG BỘ TIẾN TRÌNH
2.1Bài toán đồng bộ hóa
Công việc không thể được tiến hành nếu nó không được bộ xử lý tiếp nhận và
thực hiện: bộ xử lý là một tài nguyên của hệ thống được sử dụng để hoàn thành
công việc. Có thể coi chương trình cần thực hiện như một quá trình (các hệ điều
hành khác nhau có thể sử dụng các thuật ngữ khác nhau cùng nghĩa với thuật ngữ
quá trình, mà phổ biến hơn cả là thuật ngữ tiến trình, bài toán), quá trình là đối
tượng được tiếp nhận bởi bộ xử lý (D.L. Parnar, 1974). Cần phân biệt khái niệm quá
trình với khái niệm chương trình: quá trình là thực hiện một chương trình nào đó
kể từ khi bắt đầu đến khi kết thúc. Vì vậy, cùng một lúc trong chế độ đa người dùng,
có 3 người dùng đều gọi chương trình dịch ngôn ngữ C: hệ thống chỉ có 1 chương
trình dịch C, trong khi đó tại thời điểm đang xét có 3 quá trình đang tồn tại và được
điều phối CPU.
Các tiến trình không tồn tại một cách độc lập trong máy tính, chúng hợp tác với
nhau để thực hiện các công việc của người sử dụng và chúng cạnh tranh với nhau
để sử dụng chung các tài nguyên hữu hạn: các bộ xử lý hoặc các file thông tin. Hai
đặc trưng hợp tác và cạnh tranh dẫn tới sự cần thiết của các liên lạc giữa các tiến

trình.
Page 5
Để làm rõ tính quan trọng của việc đồng bộ hóa tiến trình chúng ta xét ví dụ
sau: giả sử rằng chương trình nào đó có biến counter và giá trị của biến counter
hiện tại là 5, thủ tục người sản xuất và người tiêu dùng thực thi đồng hành câu
lệnh “counter++” và “counter ”. Theo sau việc thực thi hai câu lệnh này, giá trị của
biến counter có thể là 4, 5 hay 6? Kết quả chỉ đúng khi biến counter==5, được tạo ra
đúng nếu tiến trình người sản xuất và người tiêu dùng thực thi riêng biệt.
Chúng ta có thể minh hoạ giá trị của counter có thể không đúng như sau. Chú ý,
câu lệnh “counter++” có thể được cài đặt bằng ngôn ngữ máy (trên một máy điển
hình) như sau:
register1 = counter
register1 = register1 + 1
counter = register1
Ở đây register1 là một thanh ghi CPU cục bộ. Tương tự, câu lệnh “counter ”
được cài đặt như sau:
register2 = counter
register2 = register2 - 1
counter = register2
Ở đây register2 là thanh ghi CPU cục bộ. Dù là register1 và register2 có thể
dùng cùng thanh ghi vật lý, nhưng nội dung của thanh ghi sẽ được lưu lại và lấy lại
bởi bộ quản lý ngắt.
Thực thi đồng hành của “counter++” và “counter ” là tương tự như thực thi
tuần tự ở đây các câu lệnh cấp thấp hơn được hiện diện trước bị phủ lắp trong thứ
tự bất kỳ (nhưng thứ tự bên trong mỗi câu lệnh cấp cao được lưu giữ). Một sự phủ
lắp là:
T0: producerthựcthi register1 = counter{register1 = 5}
T1: producerthựcthi register1 = register1 + 1 {register1 = 6}
T2: consumerthựcthi register2 = counter{register2 = 5}
T3: consumerthựcthi register2 = register2 – 1{register2 = 4}

T4: producerthựcthi counter = register1{counter = 6}
T5: consumerthựcthi counter = register2{counter = 4}
Chú ý rằng, chúng ta xem xét tình trạng không đúng “counter==4” theo đó có 4
vùng đệm đầy, nhưng thực tế khi đó có 5 vùng đệm đầy. Nếu chúng đổi ngược lại
thứ tự của câu lệnh T4 và T5, chúng ta sẽ có trạng thái không đúng “counter ==6”.
Chúng ta đi đến trạng thái không đúng này vì chúng ta cho phép cả hai quá
trình thao tác đồng thời trên biến counter. Trường hợp tương tự, ở đây nhiều quá
trình truy xuất và thao tác cùng dữ liệu đồng hành và kết quả của việc thực thi phụ
thuộc vào thứ tự xác định trong đó việc truy xuất xảy ra, được gọi là điều kiện cạnh
tranh (race condition). Để ngăn chặn điều kiện cạnh tranh ở trên, chúng ta cần
Page 6
đảm bảo rằng chỉ một quá trình tại một thời điểm có thể được thao tác biến
counter. Để thực hiện việc đảm bảo như thế, chúng ta yêu cầu một vài hình thức
đồng bộ hoá quá trình. Những trường hợp như thế xảy ra thường xuyên trong các
hệ điều hành khi các phần khác nhau của hệ thống thao tác các tài nguyên và
chúng ta muốn các thay đổi không gây trở ngại một sự thay đổi khác.
2.2 Miền găng hay vùng tương trục
Xét một hệ thống gồm n quá trình (P
0
, P
1
, … ,P
n-1
). Mỗi quá trình có một phân
đoạn mã, được gọi là miền găng (critical section), trong đó quá trình này có thể
thay đổi những biến dùng chung, cập nhật một bảng, viết đến tập tin Đặc điểm
quan trọng của hệ thống là ở chỗ, khi một quá trình đang thực thi trong vùng
tương trục, không có tiến trình nào khác được phép thực thi trong vùng tương trục
của nó. Do đó, việc thực thi của các vùng tương trục bởi các tiến trình là sự loại trừ
hỗ tương. Vấn đề miền găng là thiết kế một giao thức mà các quá trình có thể dùng

để cộng tác. Mỗi tiến trình phải yêu cầu quyền để đi vào vùng tương trục của nó.
Vùng mã thực hiện yêu cầu này là phần đi vào (entry section). Vùng tương trục có
thể được theo sau bởi một phần kết thúc (exit section). Mã còn lại là phần còn lại
(remainder section). Cấu trúc chung của một quá trình điển hình P
i
:
do { entry section
critical section
exit section
remainder section
} while (1);
Một giải pháp đối với vấn đề miền găng phải thoả mãn ba yêu cầu sau:
• Loại trừ hỗ tương (Mutual Exclusion): Nếu quá trình Pi đang thực thi
trong miền găng của nó thì không tiến trình nào khác đang được thực thi trong
miền găng đó.
• Progress: nếu không có tiến trình nào đang thực thi trong miền găng và có
vài tiến trình muốn vào miền găng thì chỉ những tiến trình không đang thực thi
phần còn lại mới có thể tham gia vào việc quyết định tiến trình nào sẽ đi vào
vùng găng tiếp theo và chọn lựa này không thể trì hoãn vô hạn định.
• Chờ đợi có giới hạn (bounded wait): giới hạn số lần các tiến trình khác
được phép đi vào miền găng sau khi một tiến trình thực hiện yêu cầu để đi vào
miền găng của nó và trước khi yêu cầu đó được gán.
2.3 Đồng bộ hóa các tiến trình trong hệ điều hành tập trung
2.3.1 Loại trừ lẫn nhau (mutual exclusion)
Các tài nguyên trong hệ thống có thể được phân thành 2 loại:
• Các tài nguyên phân chia được: có thể sử dụng đồng thời bởi nhiều tiến
trình
Page 7
• Các tài nguyên không phân chia được: chỉ có thể được sử dụng bởi một
tiến trình duy nhất tại một thời điểm.

Sự không phân chia được của một tài nguyên là do hai nguyên nhân sau:
• Sự không phân chia được về mặt vật lý. Ví vụ một máy đọc băng giấu đục
lỗ không cho phép đổi băng giữa các ký tự liên tiếp.
• Nếu một tài nguyên được sử dụng đồng thời bởi nhiều tiến trình thì sẽ có
nguy cơ bị chồng chéo, không nhất quán.
Ví dụ xét một vùng nhớ được truy cập bởi nhiều bộ xử lý, nếu một xử lý đọc nội
dung của vùng trong khi một bộ xử lý khác sửa đổi thì kết quả là không lường
trước được. Giả sử trong hệ đăng ký chỗ máy bay, một ghế được biểu diễn bởi
nội dung của một ký tự tại một thời điểm nào đó, hai phòng dịch vụ đăng ký
đồng thời cùng một ghế bằng các thao tác như sau:

Các tài nguyên không phân chia được chủ yếu là các ngoại vi, các file khi viết và
các vùng dữ liệu được cập nhập liên tiếp
Các tài nguyên phân chia được chủ yếu là các đơn vị trung tâm, các file khi chỉ
đọc hặc các vùng nhớ chỉ chứa chương trình và dữ liệu được bảo vệ cấm sửa đổi.
Vấn đề cần giải quyết đối với loại trừ lẫn nhau là đảm bảo cho các tài nguyên
không phân chia được chỉ có thể truy nhập được một tiến trình duy nhất tại một
thời điểm.
2.3.2 Đồng bộ hóa
Một cách tổng quát, tốc độ tương đối giữa hai tiến trình là không biết trước
được vì chúng phụ thuộc vào tần số của các ngắt của từng tiến trình cũng như vào
thời gian làm việc và tần số gán bộ xử lý cho từng tiến trình.
Chúng ta nói rằng các tiến trình tiến triển không đồng bộ đối với nhau. Tuy
nhiên, để đảm bảo một sự hợp tác nhất định nào đó, các bộ xử lý phải đồng bộ hóa
các hoạt động của chúng tại một số thời điểm, khi một tiến trình chỉ có thể tiếp diễn
được nếu một tiến trình khác hoàn tất một thao tác nhất định nào đó của nó. Do
vậy, hệ điều hành phải cung cấp một cơ chế đồng bộ hóa.
2.3.3 Tắt nghẽn
Page 8
Phòng B thấy ghế trống và hỏi ý kiến

khách hàng
.
.
Phòng B đăng ký ghế
Phòng A thấy ghế trống và hỏi ý kiến
khách hàng
.
.
Phòng A đăng ký ghế
Khi nhiều tiến trình tìm kiếm tài nguyên tại cùng một thời điểm thì hệ có thể đi
đến tình trạng tắt nghẽn nếu các tài nguyên được yêu cầu bởi một tiến trình bị
chiếm giữ bởi một tiến trình khác và ngược lại. Hiện tượng này tương tự với tình
huống giao thông xuất hiện khi hai dòng xe bị tắt nghẽn tại một ngã tư. Dự kiến
trước hoặc làm giảm bớt ảnh hưởng của tắt nghẽn là một chức năng không thể
thiếu được của hệ điều hành.
2.3.4 Các semaphore
Đóng góp quan trọng nhất cho hệ liên lạc giữa các tiến trình là việc Dijkstra đưa
ra nguyên lý của các semaphore (đèn hiệu) và các toán tử wait và signal liên thuộc.
Một semaphore là một sô nguyên không âm được khởi động và chỉ có thể được
sửa đổi bởi các toán tử wait và signal theo các quy tắc sau:
signal(S): toán tử signal tăng giá trị của semaphore S lên một đơn vị. Phép tăng
là không phân chia được, điều đó có nghĩa là toán tử signal không thực sự tương
đương với lệnh gán S:=S-1. Giả sử S=3, hai tiến trình A và B đều muốn thực hiện
phép toán signal(S) thì kết quả sẽ cho S=5. Trái lại, nếu hai tiến trình cùng muốn
thực hiện S:=S+1 một cách độc lập thì kết quả sẽ cho S=4 vì gán giá trị 4=3+1 và
tương tự B cũng gán giá trị 4=3+1
wait(S): toán tử wait giảm giá trị của semaphore S đi một đơn vị với điều kiện
là kết quả không trở thành âm. Khi phép toán wait của một tiến trình áp dụng lên
một semaphore có giá trị 0 thì tiến trình này phải đợi tiến trình khác làm cho giá trị
của semaphore trở thành 1 bằng phép toán signal. Chỉ khi đó phép toán wait mới

được thực hiện và tiến trình tương ứng mới được tiếp tục trở lại. Phép toán wait
cũng là không phân chia được. Khi có nhiều tiến trình đang đợi thì chỉ một tiến
trình duy nhất có thể thực hiện phép toán wait sau lúc giá trị của semaphore được
chuyển thành 1.
Đối với một semaphore, tác động của các phép toán wait và signal là như sau:
wait(S){
while (S≤0);
S++;
}
signal(S){
S++;
}
Giá trị S phụ thuộc vào số các phép toán wait và signal đã được thực hiện
val(sem) = c(sem) + ns(sem) - nw(sem) (1)
Trong đó, val(sem) là giá trị của semaphore
c(sem) là giá trị ban đầu của semaphore
ns(sem) là số các phép signal đã được thực hiện
Page 9
nw(sem) là số các phép wait thực sự đã được thực hiện
Do định nghĩa val(sem)≥0 nên ta có bất đẳng thức quan trọng
nw(sem)≤ns(sem)+c(sem) (2)
Đẳng thức chỉ xảy ra khi val(sem)=0
Bây giờ chúng ta sẽ xem nguyên lý của các semaphore có thể giúp giải quyết vấn
đề liên lạc của các tiến trình như thế nào?
Loại trừ lẫn nhau: các tài nguyên không phân chia được sẽ được bảo vệ bởi sự
truy nhập đồng thời của nhiều tiến trình bằng cách cấm các tiến trình thực hiện
đồng thời các phần chương trình truy nhập. Các phần này của các chương trình
truy nhập được gọi là các miền găng (critical section). Loại trừ lẫn nhau trong việc
sử dụng các tài nguyên có thể được xem là loại trừ lẫn nhau đối với thực hiện của
các miền găng. Việc loại trừ có thể được thực hiện đơn giản bằng cách bọc mỗi

miền găng bởi các phép wait và signal trên một semaphore duy nhất có giá trị ban
đầu là +1. Mỗi miền găng được lập trình dưới dạng:
Wait(mutex)
Miền găng
Signal(mutex)
Trong đó mutex là tên của semaphore
Dễ nhận thấy nếu giá trị ban đầu của mutex là 1 thì loại trừ nhau được đảm
bảo, vì nhiều nhất cũng chỉ có một tiến trình có thể thực hiện wait (mutex) trước
khi có một tiến trình khác thực hiện một phép signal(mutex). Một cách hình thức,
theo (2) ta có nw(mutex) = ns(mutex) +1, như vậy tại một thời điểm chỉ có tối đa
một tiến trình có thể khai thác được miền găng.
Ví dụ xét hai tiến trình A và B thực hiện việc nạp vào và rút ra các phần tử của
một hàng đợi. Để con trỏ của hàng đợi không bị sai lệch, cần phải có giới hạn việc
truy nhập hàng đợi bởi chỉ một tiến trình tại một thời điểm. Việc nạp và rút ra các
phần tử được biểu diễn dưới dạng các miền găng như sau:

Người ta nghi ngờ liệu loại trừ lẫn nhau có thể được giải quyết mà không có sự
tham gia của semaphore và các phép toán liên thuộc wait và signal hay không?
Liệu có bảo vệ một miền găng bằng một biến đơn giản gọi là biến cửa, khi cửa là
mở thì việc vào miền găng là cho phép. Bằng cách như vậy, một miền găng có thể
thực hiện như sau:
Page 10
Chương trình của tiến trình A
Wait (mutex)
Nạp phần tử vào hàng đợi
Signal(mutex)
Chương trình của tiến trình B
Wait (mutex)
rút phần tử vào hàng đợi
Signal(mutex)

While cửa đóng do rỗng;
Cửa: đóng;
Miền găng
Cửa: mở;
Đáng tiếc rằng giải pháp đơn giản này không hoạt động được do sự tách biệt
giữa phép kiểm tra cửa mở ở dòng thứ nhất và phép đóng cửa ở dòng thứ hai. Hai
tiến trình thực hiện song song có thể đều thấy cửa mở ở dòng thứ nhất trước khi
một trong hai tiến trình có thời gian để đóng cửa ở dòng thứ hai. Điều này dẫn tới
việc cả hai tiến trình cùng bước vào miền găng.
Các semaphore tránh được các vấn đề như vậy vì các phép wait và signal là
không phân chia được, tức là không có khả năng hai tiến trình tác động tại cùng
một thời điểm lên cùng một semaphore.
3. Vấn đề đồng bộ hóa các tiến trình trong hệ điều hành phân tán
Trình tự và đồng bộ các tiến trình chỉ ra các vấn đề đồng bộ có thể dẫn đến phải
thiết chế một trật tự tổng quát của các sự kiện diễn ra trong hệ. Cần xác định mối
liên hệ trao đổi thông qua các thông điệp với thời hạn truyền khác nhau, những
thông tin tạm thời trao đổi không có giá trị tuyệt đối và trình tự tổng quát cần phải
được thể hiện bằng phương tiện giải thuật đảm bảo hoạt động nhịp nhàng giữa
các tiến trình có liên quan.
Trong tất cả các hệ thống tin học, đồng bộ hóa các tiến trình mang tính cấp
thiết về mặt nguyên lý và kỹ thuật thể hiện ở hai nguyên do cơ bản sau đây:
• Các tiến trình kể cả các tiến trình xuất phát từ các ứng dụng độc lập muốn
truy cập vào tài nguyên với các số lượng vốn rất hạn chế hay truy cập vào thông
tin dùng chung cùng một lúc. Trường hợp này gọi là truy cập tương tranh. Vì
vậy, tương tranh là nguyên nhân chính của các xung đột giữa các tiến trình
muốn truy cập vào tài nguyên dùng chung.
• Các tiến trình của cùng một hệ ứng dụng hoạt động theo kiểu hợp lực để
giải quyết các bài toán đặt ra và cho kết quả nhanh chóng nhất. Điều này cho
phép tăng hiệu năng sử dụng thiết bị và hiệu quả hoạt động của chương trình.
Vì vậy hợp lực là nguyên nhân chính của sự tác động tương hỗ được lập trình

giữa các tiến trình nhằm cho phép chúng tham gia vào các hoạt động chung.
Sự tương tranh và hợp lực giữa các tiến trình đòi hỏi phải có sự trao đổi thông
tin qua lại với nhau. Trong các hệ thống tập trung điều đó được thực hiện nhờ
thuật toán loại bỏ tương hỗ thông qua các biến cùng tác động trong một vùng nhớ
chung. Trong hệ tin học phân tán, các thông tin cần trao đổi thông qua các kênh
thuộc hệ thống viễn thông.
3.1 Trật tự từng phần
Chú ý rằng, trong các hệ thống tin học tập trung, vấn đề đồng bộ hóa được giải
quyết thông quan cơ chế loại trừ tương hỗ. Cơ chế này cho phép sắp đặt (xác lập
trật tự) hoàn toàn các sự kiện.
Page 11
Trong thực tiễn, nói một cách chính xác, có một hệ thống vấn đề về đồng bộ hóa
chỉ đòi hỏi trật tự từng phần. Chính vì vậy, trật tự hóa từng phần giữa các sự kiện
mà các tiến trình của nó cần phải đồng bộ là vấn đề cần phải quan tâm giải quyết.
Trong các hệ phân tán, việc đồng bộ hóa chỉ đặt ra duy nhất vấn đề thiết lập
một trật tự giữa các sự kiện. Giữa các trạm khác nhau, trật tự đó chỉ có thể thể
hiện được thông qua việc trao đổi các thông điệp với nhau.
Giả sử rằng ta có thể xác định một trật tự giữa các sự kiện của hệ phân tán nhờ
vào quan hệ được ký hiệu là  và được gọi là “có trước” hay “ở ngay trước”.
Quan hệ này tối thiểu phải thỏa mãn được các ràng buộc thể hiện trong bảng
sau đây:
C1: nếu A và B là hai sự kiện của cùng một trạm và nếu A thực hiện trước B thì
theo trật tự cục bộ của trạm ta có: AB.
C2: nếu A là phát thông điệp bởi một trạm nào đó và nếu B là thu của thông điệp
này thì ta có AB
Hình vẽ sau đây cho ta một trạm ví dụ về trật tự hóa từng phần của các sự kiện
trong hệ thống.
Theo hình vẽ đó, ta có thể biểu diễn trật tự như sau:
Trật tự từng phần của các sự kiện
A1A2A3A4A5

B1B2B3B4B5
Trao đổi thông điệp A1 B2 VÀ B3A4
Chuyển qua
A1A2B2B3B4
B1B2B3A4A5
A1A2B2B3A4A5
Ví dụ về các sự kiện không so sánh B1 và A1, A2, A3; A3 và B2, B3, B4
A1
A2
A3
A4
A5
B1
B2
B3
Page 12
B4
B5
t
Ràng buộc C1 thể hiển rằng trật tự có được bởi quan hệ có trước là tương thích
với các trật tự cục bộ được định nghĩa trong từng trạm.
Ràng buộc C2 nói lên nguyên tắc nhân quả.
Quan hệ có trước xác định một trật tự từng phần trên tập hợp các sự kiện của
hệ và trật tự này có thể hiện trong hình vẽ trên.
3.2 Giả định các điều kiện chung
Các phương pháp được giới thiệu trong chương này sẽ xuất phát từ các giả
định với các điều kiện chung như sau.
Các hệ phân tán được xây dựng trên cơ sở các trạm làm việc được mắc nối với
nhau (nối mạng). Mỗi một trạm có bộ nhớ riêng của mình và tuyệt đối không có bộ
nhớ chung.

Chúng ta áp dụng các ký hiệu trong bảng sau:
STT Ký hiệu Thuyết minh
1 H1 Một trạm trong các trạm đều có thể liên lạc với các
trạm còn lại trong hệ
2 H2 Không có lỗi truyền thông tin và không mất thông
điệp
3 H3 Trật tự nhận trên trạm j như của dãy các thông điệp
cũng giống như chính tại trạm I là giống với trật tự
nơi phát
Page 13
4 H4 Sự cố hay gián đoạn vật lý tại một trạm nào đó được
phát hiện sẽ lập tức thông báo đến các trạm có ý
định liên lạc đến nó
Sự hoạt động của các mạng vận chuyển thường là tương thích với các giả sử
nêu trên và luôn luôn đòi hỏi một mức độ ổn định nhất định.
Trước hết, chúng ta nghiên cứu sự hoạt động của hệ thống không có sự cố, rồi
sau đó chúng ta sẽ chỉ ra hiệu ứng của sự cố hay việc phục hồi lại một trạm. Đó là
trường hợp mà ta nêu lên trong H4 ở trên.
Ngoài ra, chúng ta còn giả sử rằng hiện tượng gây sự cố trên một trạm chỉ làm
cho trạm đó không liên lạc được với mạng mà hoàn toàn không ảnh hưởng đến sự
hoạt động của các trạm còn lại hoặc ít nhất là một nhóm các trạm khác.
3.3 Đồng bộ hóa bằng phương pháp trật tự từng phần
Trong các hệ thống tin học tập trung, vấn đề đồng bộ hóa được giải quyết thông
qua cơ chế loại trừ tương hỗ. Cơ chế này cho phép xác lập trật tự hoàn toàn các sự
kiện. Trong thực tiễn, có một số hệ thống vấn đề về đồng bộ hóa chỉ đòi hỏi trật tự
từng phần. Chính vì vậy, trật tự hóa từng phần giữa các sự kiện mà các tiến trình
của nó cần phải đồng bộ là vấn đề cần quan tâm giải quyết.
Trong các hệ thống phân tán, việc đồng bộ hóa chỉ đặt ra duy nhất vấn đề thiết
lập một trật tự giữa các sự kiện. Giữa các trạm khác nhau, trật tự đó chỉ thể hiện
được thông qua việc trao đổi các thông điệp với nhau.

Giả sử rằng ta có thể xác định một trật tự giữa các sự kiện của hệ phân tán nhờ
vào quan hệ được ký hiệu là  và gọi là “có trước”. Quan hệ này tối thiểu phải thỏa
mãn được các ràng buộc thể hiện qua hai cách:
• Nếu A và B là hai sự kiện của cùng một trạm và nếu A được thực hiện
trước B thì theo trật tự cục bộ của trạm ta có: A  B.
• Nếu A là phát thông điệp bởi một trạm nào đó và nếu B là thu của thông
điệp này thì ta có A B.
Xét mô hình quen thuộc trong phần nguyên lý hệ điều hành là người sản xuất-
người tiêu thụ, trong đó khả năng tiêu thụ là nguyên nhân chính hạn chế số lượng
hàng hóa sản xuất ra để nó không vượt quá số lượng tiêu thụ một giá trị lớn hơn N.
Người sản xuất P và người tiêu thụ C là hai người nằm trên hai trạm cách xa nhau.
Giả sử rằng NP là số lượng sản xuất ra và NC là số lượng tiêu thụ tại thời điểm
khởi sự. C chỉ tiêu thụ được một sản phẩm, nếu sản xuất sản phẩm đó đã diễn ra, có
nghĩa là, nếu
NP – NC > 0
Tương tự, P chỉ sản xuất một thông tin, nếu
NP – NC < N
Page 14
Hai quan hệ này thể hiện các điều kiện của việc đồng bộ hóa và có thể mô tả
trong hình sau:
P
1
C
1
P
2
C
2
P
i

C
i
P
i+N
C
i+1
P
i+N+1
P
i
: Sản xuất thứ i
C
i
: Tiêu thụ thứ i
Quan hệ có trước trong mô hình người sản xuất-người tiêu thụ
Trong hệ thống tin học phân tán, người ta có thể vận dụng hợp lực này theo
kiểu như sau:
• Trên trạm P một biến NP thể hiện số lượng chính xác sản xuất đã có.
• Trên trạm C một biến NC thể hiện số lượng chính xác tiêu thụ đã thực hiện.
• Trên trạm P một biến NC’ ảnh của NC mà P gia tăng mỗi một lần nó nhận
được thông điệp từ C báo cho nó biết là tiêu thụ mới đã diễn ra.
• Trên trạm C một biến NP’ ảnh của NP mà C gia tăng mỗi một lần nó nhận
thông điệp từ P báo cho nó biết một sản xuất mới đã diễn ra.
Ta sẽ chứng minh rằng một sự đồng bộ hóa chính xác được đảm bảo bằng việc
xác nhận trên mỗi trạm các điều kiện sau đây:
1/ Trên trạm sản xuất:
NP’ – NC > 0
2/ Trên trạm tiêu thụ:
NP – NC’ < N
Ta có thể viết:

Page 15
NP = NP’ + np, với np  0
Trong đó, np số lượng thông tin đã sản xuất bởi P mà C không biết
NC = NC’ + nc, với nc  0
Trong đó, nc số lượng thông tin đã tiêu thụ bởi C mà P không biết
Ta có thể khái quát hóa phương pháp này cho điều kiện đồng bộ hóa bằng công
thức:

C
i
X
i
> K (theo i)
Trong đó, C
i
và K là các hằng số. Ta hoàn toàn có khả năng và điều kiện mạnh
hơn bằng cách thay thế tất cả các X
i
mà hệ số của nó là đại lượng dương bằng các
ảnh của nó X’
i
, nếu và chỉ nếu các X
i
là các biến không lùi.
Vì nguyên nhân xa cách giữa người sản xuất và người tiêu thụ mà trật tự tổng
quát này không cần thiết và chỉ cần sủ dụng để đồng bộ hóa các bản sao các biến
trạng thái gần đúng là đủ.
4. Các thuật toán đồng bộ hóa
− Tổng quát
+ Một trạm bất kỳ trong hệ thống có thể:

(1) yêu cầu miền găng CS,
(2) thi hành CS, hoặc
(3) không làm gì cả đối với CS (thi hành trong đoạn không phải miền
găng.)
+ Các thuật toán nên thỏa mãn các yêu cầu:
• Không bế tắc
• Không đói
• Công bằng (các yêu cầu được thi hành theo thứ tự chúng được tạo)
• Dung thứ lỗi (có thể vẫn hoạt động khi có sự cố tại một hoặc nhiều trạm)
− Một số thông số:
+ số thông điệp/yêu cầu miền găng
+ s
d
(trễ đồng bộ): thời gian giữa thời điểm kết thúc một miền găng và bắt đầu
miền găng tiếp theo.
+ Thời gian đáp ứng, được đo từ khi thông điệp yêu cầu miền găng được gửi đi
cho đên khi miền găng được thi hành.
Page 16
+ Thông lượng hệ thống: tỷ lệ mà hệ thống thi hành các miền găng.
+ Thông lượng = 1/(s
d
+ thời gian thi hành trung bình E của một miền găng).
− Hoạt động với tải
+ Với tải thấp, một số miền găng được thi hành. Khi một tiến trình muốn đi vào
miền găng, nó thường sẽ được cấp quyền ngay lập tức sau khi thi hành thuật
toán loại trừ tương hỗ. Đối với trường hợp hợp tải cao hoặc nặng, luôn luôn
có các yêu cầu miền găng phải chờ đợi. Ngay khi một trạm kết thúc miền
găng của mình, nó sẽ có thể có gắng khởi tạo miền găng khác.
+ Nếu gọi E là thời gian trung bình thi hành một miền găng, và T là độ trễ
thông điệp trung bình, thì trong hầu hết các thuật toán, thời gian cho trường

hợp tốt nhất có cận trên là (2T + E). Điều này cho phép trao đổi thông điệp
vòng tròn cộng với sự thi hành miền găng. Thời gian cho trường hợp xấu
nhất là rất nhiều.
4.1 Thuật toán giả phân tán : Hàng đợi tập trung
− Có một trạm là trạm điều khiển đảm nhiệm việc cung cấp tài nguyên.
− Các trạm khi yêu cầu miền găng sẽ gửi các thông điệp đến trạm điều khiển.
− Trạm điều khiển duy trì một hàng đợi chứa các yêu cầu và cấp cho mỗi trạm
quyền truy cập vào miền găng theo lần lượt.
− S
d
(trễ đồng bộ) = 2T
− Thông lượng: 1/(2T + E)
− Tiến trình trạm điều khiển với Hàng đợi Yêu cầu (Request Queue):
1
2
3
C
REQ
ACK
1
Tiến trình 1 yêu cầu truy cập vào miền găng CS. Điều phối viên đưa yêu cầu vào hàng đợi và cấp
quyền truy cập vì lúc đầu hàng đợi trống.
Page 17
1
2
3
C
REQ
1
Không hồi âm

2
Tiến trình 2 yêu cầu truy cập vào CS. Điều phối viên xếp yêu cầu vào hàng đợi và từ chối không cho
truy cập vì hàng đợi không trống.
Tiến trình 1 rời khỏi CS. Điều phối viên loại bỏ 1 khỏi hàng đợi và cấp quyền truy cập cho tiến trình
đầu tiên trong hàng đợi – đó là tiến trình 2
1
2
3
C
REL
ACK
Page 18
2
− Ưu điểm: chính xác, công bằng, không đói, đơn giản
− Nhược điểm: điểm sự cố đơn, hoạt động theo cách cổ chai
4.2 Thuật toán Lamport: Hàng đợi phân tán
− Khái quát:
+ Thuật toán là sự suy rộng của Hàng đợi tập trung cho việc cài đặt phân tán.
+ Thuật toán này được Lamport (1978) đưa ra, nó sử dụng cơ chế đóng dấu
thời gian cho việc đồng bộ các đồng hồ lôgic.
− Các giả định:
+ Chúng ra giả định mô hình mạng kết nối hoàn toàn trong đó các tiến trình
liên lạc thông qua các kênh FIFO tin cậy. Tức là, các thông điệp không thể
sắp xếp lại theo trật tự khác.
+ Các giả định được thực thi một cách dễ dàng ở tầng giao vận.
− Các kiểu thông điệp:
+ (REQ, C
i
, i) : Một yêu cầu cho việc truy cập vào miền găng CS của tiến trình Pi.
Yêu cầu này được phát đi cho tất các các tiến trình khác.

+ (REP, C
i
, i) : Hồi âm từ tiến trình Pi cho tiến trình Pj khi Pi nhận được yêu cầu
từ Pj.
+ (REL, C
i
, i) : Thông điệp giải phóng từ Pi thông báo cho biết nó đã rời khỏi
CS. Thông điệp này được gửi cho tất cả các tiến trình khác.
− Các biến tiến trình:
+ C
i
: Đồng hồ cục bộ của Pi, khởi tạo từ 0.
+ q
i
: Hàng đợi [0 … n-1] chứa các thông điệp.
− Thuật toán:
+ Khi một tiến trình tại trạm S
i
muốn thi hành đoạn găng, nó sẽ gửi thông điệp
REQ có đánh dấu thời gian cho tất cả các trạm trong hệ thống kể có trạm S
i
.
Page 19
+ Mỗi trạm, S
i
, duy trì một hàng đợi chứa các thông điệp yêu cầu được sắp xếp
theo trật tự các dấu thời gian; các đồng hồ logic và quan hệ trật tự toàn bộ
được sử dụng để gắn các dấu thời gian.
+ Khi một trạm nhận được yêu cầu, nó sẽ đưa thông điệp đó vào hàng đợi yêu
cầu của nó theo thứ tự dấu thời gian và gửi một thông điệp trả lời REP. Nếu

cần, quan hệ trật tự toàn bộ được sử dụng để phá vỡ các sự ràng buộc.
+ Ý tưởng chung là một tiến trình không thể thi hành đoạn găng của nó cho
đến khi nó nhận được trả lời từ tất cả các trạm khác. Các thông điệp trả lời
sẽ “flush out” các yêu cầu bất kỳ từ các tiến trình khác, để chúng ta biết hàng
đợi được cập nhật.
+ Đặc biệt hơn nữa, một trạm thi hành miền găng của nó khi:
1) Nhận được thông điệp trả lời từ tất cả các trạm còn lại và
2) Yêu cầu REQ của nó là ở trên đỉnh của hàng đợi cục bộ của nó.
+ Khi một trạm hoàn thành miền găng của nó, nó sẽ gửi khuyến nghị giải
phóng REL đến tất cả các trạm. Yêu cầu của nó được loại khỏi tất cả các
hàng đợi tại thời điểm này. Nếu các trạm khác đang chờ để thi hành miền
găng của chúng, một trong các trạm đó bây giờ có thể bắt đầu thực hiện
miền găng của mình.
+ Hoạt động: 3(N-1) thông điệp cần thiết cho mỗi miền găng được thi hành.
(N-1) thông điệp REQ, (N-1) thông điệp REP và (N-1) thông điệp REL.
+ Độ trễ đồng bộ: T (trong đó T thời gian trung bình truyền thông điệp). Khi
nhận được thông điệp giải phóng, tiến trình tiếp theo có thể bắt đầu thi
hành.
+ Loại trừ tương hỗ là đạt được: Các dấu thời gian là duy nhất, vì vậy tất cả
các hàng đợi sẽ giữ các yêu cầu trong cùng một thứ tự. Chỉ một tiến trình
duy nhất sẽ nằm ở đỉnh của các hàng đợi.
4.3.Thuật toán yêu cầu của P
i
:
trong đó : - timestamp( (m, c, i ) ) = (c, i)
- (c, i) < (d, j) nếu c < d hoặc ( c = d và i < j )
− Thuật toán nhận thông điệp của P
i
:
Page 20

ci ← ci + 1 ;
broadcast (REQ, ci, i) ;
qi [i] ← (REQ, ci, i) ;
wait

∀ j = i timestamp(qi[i]) < timestamp(qi[j]) ;
< CSi >
ci ← ci + 1 ;
on receipt
of (REQ, k, j) begin ci ← max(ci , k) + 1 ;
qi [j] ← (REQ, k, j) ;
send(REP, ci, i) to j ;
end ;
of (REL, k, j) begin ci ← max(ci , k) + 1 ;
qi [j] ← (REL, k, j) ;
end ;
of (REP, k, j) begin ci ← max(ci , k) + 1 ;
if type of (qi [j]) = REQ then qi [j] ← (REP, k, j) ;
end ;
− Ví dụ 1:
C
2
= 1
q2 = [(REL, 0, 1),
(REQ, 1, 2)]
C
1
= 3
q1 = [(REQ, 3, 1),
(REQ, 1, 2)]

C
1
= 5
q1 = [(REQ, 3(1), 1),
(REQ, 1, 2)]
C
2
= 3
q2 = [(REP, 2, 1),
(REQ, 1, 2)]
C
1
= 2
q1 = [(REL, 0, 1),
(REQ, 1, 2)]
C
2
= 4
q2 = [(REQ, 3(1), 1),
Page 21
(REQ, 1, 2)]
(REQ, 1, 2)
(REP, 2, 1)
(REQ, 3, 1)
(REP, 4, 2)
(REQ, 1, 1)
C
2
= 3
q2 = [(REQ, 1, 1),

(REQ, 1, 2)]
C
1
= 2
Page 22
q1 = [(REQ, 1, 1),
(REQ, 1, 2)]
(REQ, 1, 2)
(REP, 2, 1)
(REQ, 1, 1)
C
2
= 1
q2 = [(REL, 0, 1),
(REQ, 1, 2)]
C
1
= 1
q1 = [(REQ, 1, 1),
(REL, 0, 2)]
C
2
= 2
q2 = [(REQ, 1, 1),
(REQ, 1, 2)]
(REP, 2, 2)
C
1
= 3
q2 = [(REQ, 1, 1),

(REQ, 1, 2)]
− Ví dụ 2:
Page 23
− Sự chính xác:
CS
i
CS
j
(REQ, t
i
)
(REQ, t
j
)
t
i
< t
j
ti < tj < timestamp(qj [i])
+ Loại trừ tương hỗ: Giả sử rằng P
i
và P
j
đang ở trong CS
i
và CS
j
tại cùng một
thời điểm. Đồng thời, giả sử thời gian lôgic t
i

của yêu cầu mới nhất của P
i
nhỏ hơn t
j
, thời gian lôgic của yêu cầu mới nhất của P
j
.
Bằng phương pháp FIFO, (REQ, t
i
) phải đã ở trong hàng đợi q
j
trước CS
j
.
Vì vậy, không có thông điệp REP đã đi vào vào hàng đợi q
j

timestamp(qj [i]) = ti. Mâu thuẫn.
Page 24
+ Không đói: Các yêu cầu được cấp quyền dựa trên cơ sở của trật tự dấu thời
gian và các tiến trình gửi các thông điệp REL.
4.4 Thuật toán Ricart và Agrawala: Cải tiến của hàng đợi tập trung
− Mục tiêu là để giảm việc chuyển thông điệp bằng cách kết hợp các thông điệp
REL và REP.
− Nếu một trạm đang thi hành miền găng khi một yêu cầu REQ đến, hoặc nếu yêu
cầu đang chờ của chính nó có dấu thời gian sớm hơn, nó không đáp ứng yêu cầu
đó ngay lập tức. Thay vào đó, nó chờ cho đến khi nó ra khỏi miền găng của nó.
Tại thời điểm đó, nó có thể gửi một thông điệp hồi âm/giải phóng đến tất cả các
yêu cầu đang chờ.
− Một trạm sẽ phải chờ cho đến khi nó nhận được trả lời từ tất cả các trạm còn lại

trước khi đi vào miền găng của nó, và yêu cầu của nó vẫn phải còn nằm ở đỉnh
của hàng đợi.
− Thuật toán này yêu cầu 2(N-1) thông điệp: một nửa cho các yêu cầu, nửa còn lại
để trả lời.
− Các thời gian lôgic được tạo ra như trong thuật toán Lamport (Hàng đợi phân
tán).
− Phần yêu cầu của Pi :
+ Gửi đi thông điệp REQ cho tất cả các tiến trình như trong thuật toán
Lamport.
+ Truy cập vào CS
i
sau khi P
i
nhận được thông điệp ACK từ tất cả các tiến trình
khác.
− Phần thu của P
i
khi nhận được thông điệp REQ từ P
j
:
1. Nếu P
i
không muốn truy cập vào miền găng CS
i
của nó (nó chưa gửi đi
thông điệp REQ), thì P
i
trả lời với thông điệp ACK.
2. Nếu P
i

đang ở trong miền găng CS
i
thì Pi hoãn lại việc hồi âmcho đến khi
nó rời khỏi miền găng CS
i
.
3. Nếu Pi muốn truy cập vào miền găng CS
i
(nó đã gửi cho tất cả các tiến
trình khác thông điệp REQ), thì P
i
so sánh thời gian lôgic t
i
của thông
điệp yêu cầu của chính nó với thời gian lôgic t
j
của yêu cầu từ P
j
:
1* Nếu t
i
> t
j
thì P
i
trả lời với thông điệp ACK.
2* Nếu t
i
< t
j

thì P
i
hoãn lại việc hồi âm (cho đến sau khi Pi kết thúc CS
tiếp theo).
− Các xung đột được giải quyết nhờ vào yêu cầu “sớm hơn”, được xác định bởi các
thời gian lôgic.
− Ví dụ:
(1,1) < (1,2)
Page 25

×