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

Tài liệu đồng bộ hóa

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 (419.2 KB, 17 trang )

Nhóm dịch hệ phân tán –Lớp MTT- K50 - DHBKHN
Chương 6 : Đồng bộ hóa
(Synchronization)
Trong chương này chúng ta sẽ tìm hiểu bằng cách nào các tiến trình đồng bộ hóa được với
nhau. Ví dụ, thay vì nhiều tiến trình đồng thời truy nhập vào một tài nguyên chia sẻ thì chúng cấp
quyền truy nhập tạm thời cho nhau. Một ví dụ khác, nhiều tiến trình đôi khi cần trả lời cho 1 sự
kiện nào đó, nói cách khác, cần xác định thông điệp m1 của tiến trình P được gửi trước hay sau
thông điệp m2 cùa tiến trình Q.
Đồng bộ hóa trong các hệ thống phân tán thường khó hơn rất nhiều so với đồng bộ hóa
trong các hệ đơn hoặc đa xử lý.
Vấn đề trong chương này hướng tới đồng hộ hóa dựa trên thời gian hoạt động, tức là thời
gian có tính tương quan giữa các tiến trình hơn là thời gian tuyệt đối.
Trong nhiều trường hợp, đồng bộ hóa có thể được giải quyết bằng cách một nhóm các tiến
trình có thể sử dụng 1 tiến trình được thực thi bằng cách lấy trung bình một vài thuật toán lựa
chọn.
6.1 Đồng bộ hóa đồng hồ (Clock Synchronization).
Trong một hệ tập trung, thời gian hệ thống là rõ ràng. Khi một tiến trình muốn biết thời
gian hệ thống, nó chỉ cần đưa ra 1 lời gọi hệ thống và đợi kernel trả lời. Nếu tiến trình A hỏi thời
gian, ngay sau đó tiến trình B hỏi thời gian, thì thời gian mà B nhận được sẽ lớn hơn(đôi khi
bằng) so với thời gian mà A nhận được. Chắc chắn không bao giờ có chuyện thời gian B nhận
được nhỏ hơn A. Nhưng trong một hệ thống phân tán, đạt được sự thống nhất về thời gian như
vậy không hề đơn giản.
Hãy lấy 1 ví dụ đơn giản trong chương trình make của Unix. Thông thường thì trong
Unix, các chương trình lớn được chia nhỏ ra nhiều file nguồn, để khi có thay đổi trong 1 file
nguồn thì chỉ có file đó phải được biên dịch lại mà không phải là tất cả chương trình. Nếu 1
chương trình có 100 files, thì không nhất thiết phải biên dịch lại toàn bộ bởi 1 file bất kì thay đổi
với tốc độ cao hơn bất kì 1 người lập trình nào có thể làm việc. Lệnh make làm việc hết sức đơn
giản. Khi lập trình viên thay đổi file nguồn và chạy lệnh make thì thời điểm đó được đánh dấu
cho tất cả các file nguồn đã bị modify. Nếu file input.c có thời gian là 2151 và file đối tượng
tương ứng của nó output.o có thời gian là 2150 thì lệnh make hiểu rằng input.c đã bị thay đổi sau
khi output.o được tạo ra. Như vậy cần phải biên dịch lại input.c để cho ra phiên bản output.o mới.


Trong trường hợp khác, nếu thời gian của output.o là 2144 còn thời gian của input.c là 2143 thì
không cần biên dịch lại file này. Như vậy lệnh make kiểm tra lại toàn bộ file nguồn và chỉ gọi
trình biên dịch biên dịch những file cần thiết.
Bây giờ hãy tưởng tượng những gì xảy ra trong một hệ phân tán cũng với lệnh make như
trên. Nếu hệ thống không đạt được sự thống nhất về thời gian, sự việc sẽ xảy ra như trong sơ đồ
sau:
Page | 1
File output.o có thời gian là 2144, và gần như ngay sau đó, input.c bị thay đổi nhưng lại
được đánh dấu thời gian là 2143 vì đồng hồ trên máy đó chậm hơn 1 chút. Do đó lệnh make sẽ
không gọi trình biên dịch. Kết quả là chương trình được biên dịch ra lẫn lộn giữa các đối tượng từ
file nguồn cũ và mới. Dẫn đến có lỗi trong chương trình mà lập trình viên không thể kiểm soát
hoặc hiểu được.
Có rất nhiều trường hợp tương tự mà ở đó việc tính toán thời gian chính xác là cần thiết.
Trường hợp trên có thể được giải quyết dễ dàng bằng cách gán tem(filestamp). Thêm nữa, rất
nhiều lĩnh vực cần tới việc định thời gian chính xác như môi giới tài chính, kiểm toán... Như vậy
hiển nhiên là việc định thời chính xác là cực kì quan trọng. Hãy bắt đầu với một câu hỏi đơn giản:
Có thể đồng bộ toàn bộ các đồng hồ trong 1 hệ phân tán không? Câu trả lời cho nó lại cực kì phức
tạp.
6.1.1 Đồng hồ vật lý (Physical Clock):
Gần như tất cả các máy tính đều có mạch tính thời gian. Mặc dù có thể gọi chúng là clock
theo nghĩa rộng của từ này, thì thực sự chúng không hẳn là “đồng hồ” theo cách mà hệ thống sử
dụng. Có lẽ từ thích hợp hơn với những mạch này là Timer(mạch định thời). Một mạch định
thời sử dụng một tinh thể thạch anh đặc biệt. Khi được đặt vào một điện áp, tinh thể thạch anh
này sẽ dao động với một tần số xác định tùy thuộc vào loại tinh thể, hình dáng khi cắt và điện áp
đặt vào. Với mỗi tinh thể, có hai thanh ghi tương ứng là counter vả holding. Thanh ghi đếm sẽ
giảm đi 1 bit với mỗi dao động của tinh thể. Khi thanh ghi đếm về 0, mạch sẽ gọi 1 ngắt để nạp
lại giá trị mới cho thanh ghi đếm từ thanh ghi holding. Như vậy việc lập trình cho một mạch định
thời chạy dưới một tần số bất kì là hết sức dễ dàng. Mỗi 1 ngắt trong mạch như vậy gọi là 1 clock
tick(nhịp đồng hồ).
Khi hệ thống được khởi động, nó thường yêu cầu người dùng nhập ngày tháng và thời

gian, rồi chuyển đổi thành số nhịp tương ứng tính từ 1 thời điểm xác định lưu trữ trong bộ nhớ.
Hầu hết các máy tính có 1 CMOS RAM chạy pin làm nhiệm vụ back up thời gian để mỗi lần khởi
động sau đó không cần phải nhập nữa. Với mỗi nhịp đồng hồ, thủ tục ngắt cộng thêm 1 vào thời
gian trong bộ nhớ. Bằng cách này, đồng hồ(của phần mềm) được cập nhật.
Với một máy tính đơn lẻ và một đồng hồ đơn lẻ, việc đồng hồ chạy sai hoặc ngừng một
thời gian không phải vấn đề gì lớn lắm. Vì tất cả tiến trình trên máy sử dụng chung một đồng hồ
nên chúng có sự thống nhất.
Khi hệ thống đa xử lý ra đời, mỗi 1 CPU có đồng hồ riêng, tình thế đã thay đổi hoàn toàn.
Mặc dù tần số dao động của các tinh thể thường khá là ổn định, nhưng thật khó để cho các tinh
thể khác nhau dao động cùng 1 tần số. Trong thực tế, khi một hệ thống có n máy tính, tất cả n tinh
thể hầu như dao động với n tần số khác nhau, làm cho đồng hồ(của phần mềm) dần dần cách xa
nhau về mặt thời điểm và cho các giá trị khác nhau. Sự sai khác này gọi là clock skew(sự sai
lệch đồng hồ). Hậu quả của sự sai lệch này là các chương trình dựa vào thời gian được gán cho
Nhóm dịch hệ phân tán –Lớp MTT- K50 - DHBKHN
file, đối tượng, tiến trình hoặc thông điệp độc lập với máy sinh ra chúng có thể bị lỗi, như ví dụ
với lệnh make ở trên.
Trong một số hệ thống(ví dụ như các hệ thống thời gian thực), thời gian hiện tại là rất
quan trọng. Chính vì thế việc sử dụng các đồng hồ vật lý bên ngoài là cần thiết. Vì các lý do hiệu
suất và độ phức tạp, việc phát triển một hệ thống các đồng hồ vật lý như vậy đặt ra 2 vấn đề lớn:
(1) Làm sao để đồng bộ chúng với các đồng hồ thực tế trên thế giới, và (2) làm sao để đồng bộ
chúng với nhau?
Trước khi trả lời các câu hỏi trên, hãy xem xét sơ qua làm sao chúng ta đo được thời gian.
Ban đầu, người ta tính thời gian dựa trên sự dịch chuyển của mặt trời trên bầu trời(vốn dĩ do sự tự
quay quanh trục của trái đất). Theo đó, khoảng thời gian giữa 2 lần mặt trời xuất hiện liên tiếp ở
cùng 1 vị trí được gọi là ngày mặt trời. Mỗi một ngày mặt trời được chia ra làm 86400 giây mặt
trời. Như mô tả của hình dưới đây:
Vào những năm 40 của thế kỉ trước, người ta phát hiện ra rằng sự quay của trái đất là
không ổn định. Theo đó, trái đất đang quay chậm dần đều dưới tác động ma sát của thủy triều và
bầu khí quyển. Dựa vào các mẫu vật san hô cổ đại, các nhà địa chất tin rằng 300 triệu năm trước
một năm có tới 400 ngày(hơ hơ, thế thì 1 ngày chỉ có vỏn vẹn 22 tiếng). Thực tế thì khoảng thời

gian của 1 năm hầu như ko đổi(chính là khoảng thời gian trái đất quay 1 vòng quanh mặt trời);
nhưng độ dài của 1 ngày đã bị thay đổi. Thêm nữa, sự bất ổn trong nhân trái đất vốn cấu thành từ
kim loại nóng chảy cũng gia tăng độ thiếu tin cậy trong cách tính thời gian này. Người ta đành đo
khoảng thời gian của 1 số cực lớn các ngày, lấy trung bình và chia khoảng thời gian trung bình đó
ra làm 86400 giây mặt trời.
Vào năm 1948, phát minh ra đồng hồ nguyên tử đã làm cho việc đo thời gian chính xác
hơn rất nhiều, đồng thời tách khái niệm thời gian ra khỏi sự vận động của trái đất. Đồng hồ
nguyên tử hoạt động dựa trên cơ sở đếm số dao động trạng thái của nguyên tử Cesium(Cs) 133(số
lần chuyển tiếp giữa hai mức trạng thái năng lượng). Mỗi 1 giây, nguyên tử Cs dao động 9 192
631 770 lần. Hiện tại, một vài phòng thí nghiệm rải rác trên thế giới có đồng hồ Cs 133. Các
phòng thí nghiệm này định kì gửi kết quả đến Ủy ban giờ quốc tế(BIH) đặt tại Paris, BIH sẽ lấy
trung bình các kết quả này để đưa ra Giờ nguyên tử quốc tế(TAI). Giá trị TAI này là số dao
Page | 3
động của đồng hồ Cs 133 tính từ nửa đêm ngày 1 tháng 1 năm 1958 đến nay chia cho 9 192 631
770.
Tuy nhiên, vấn đề đặt ra ở đây là TAI tuy chính xác tuyệt đối nhưng lại “trượt pha” so với
giờ mặt trời. Hiện tại, cứ 86400 giây TAI lại ít hơn so với ngày mặt trời thực tế là 3 mili giây. Sử
dụng TAI đồng nghĩa với việc chúng ta chấp nhận rằng sau mỗi năm, buổi trưa sẽ đến càng lúc
càng sớm hơn(12h trưa mà vẫn chưa đứng bóng). (cái ví dụ về Giáo hoàng Gregory hơi chuối
củ và quá xa chủ đề, tốt nhất là quên nó đi và công nhận Tanenbaum quá đỉnh ở MIT)
BHI giải quyết vấn đề này bằng cách đưa ra khái niệm nhảy giây(leap seconds-cấm
nhầm với trò chơi con gái nhá). Tức là khi khoảng cách giữa TAI và thời gian mặt trời đạt tới
800 mili giây, sẽ có 1 bước nhảy như mô tả trong hình sau:
Bước nhảy này giúp cho thời gian khoa học vẫn chính xác, nhưng lại không bị lệch đi so với thời
gian mặt trời(đại loại như năm nhuận ý ạ). Hệ thống này được gọi là Giờ thống nhất vũ
trụ(Universal Coordinate Time)-UTC. UTC là cơ sở cho mọi hệ thống định giờ hiện đại thay
thế cho hệ thống giờ thiên văn quốc tế GMT.
Hầu hết các công ty điện tử lớn đồng bộ các đồng hồ 60 hoặc 50Hz với giờ UTC, do vậy
khi BIH cho thời gian nhảy giây 1 bước, các công ty này chỉ cần nâng tần số lên 61 hoặc 51 Hz.
Kể từ khi 1 giây trở nên là 1 khoảng thời gian đáng kể so với hoạt động của 1 máy tính thì hệ điều

hành của nó cần duy trì sự chính xác của thời gian qua hàng năm trời. Để làm được điều này, hđh
cần có 1 phần mềm đặc biệt chuyên tính toán số giây phải nhảy.
Viện thời gian chuẩn quốc gia NIST của Mỹ đã lập ra một trạm phát sóng ngắn, tạm gọi là
WWV tại Fort Collins, Colorado để cung cấp thời gian UTC chính xác. WWV phát ra một xung
ngắn ứng với mỗi giây UTC. Sai số của xung này tại nguồn là vào khoảng 1 mili giây, nhưng
dưới điều kiện bầu khí quyển thì sai số thực tế của nó là 10 mili giây. Một vài quốc gia khác cũng
có các trạm phát sóng như vậy.
GEOS là một hệ thống vệ tinh địa tĩnh cũng cung cấp dịch vụ tương tự.
6.1.2 Hệ thống định vị toàn cầu GPS:
Hãy xem xét một ví dụ cụ thể: hệ thống định vị toàn cầu GPS.
GPS sử dụng 29 vệ tinh địa tĩnh ở độ cao xấp xỉ 20 000km trên mỗi vòng quỹ đạo trái đất
nhằm xác định chính xác vị trí của một đối tượng. Mỗi vệ tinh có khoảng 4 đồng hồ nguyên tử
tường xuyên cập nhật với các trạm mặt đất. Một vệ tinh tiếp tục thông báo vị trí của chúng và gán
nhãn thông điệp với thời gian hiện tại(giờ địa phương mà đồng hồ trên vệ tinh thông báo). Điều
này cho phép máy nhận thông điệp có thể tính toán chính xác vị trí của nó chỉ với 3 vệ tinh “trên
đầu”.
Ý tưởng của hệ thống như sau: các vệ tinh địa tĩnh được bố trí trên quỹ đạo 20,000km so
với mặt đất; mỗi vệ tinh có từ 1 đến 4 đồng hồ nguyên tử nhằm đảm bảo giờ địa phương của nó
Nhóm dịch hệ phân tán –Lớp MTT- K50 - DHBKHN
luôn chính xác, các đồng hồ này còn luôn được đồng bộ với các trạm đặc biệt trên mặt đất, tóm
lại giờ của nó là giờ UTC; một thiết bị GPS khi yêu cầu xác định vị trí sẽ nhận được các thông
điệp từ vệ tinh có chứa nhãn thời gian thông báo giờ hiện tại trên vệ tinh và tọa độ của vệ tinh với
hệ kinh vĩ tuyến trái đất. Giờ của mỗi vệ tinh giúp thiết bị tính được khoảng cách giữa nó và vệ
tinh bằng cách trừ đi giờ hiện tại trên thiết bị và nhân với vận tốc sóng truyền tới(vận tốc ánh
sáng). Tọa độ của thiết bị là 1 bộ 3 số có thể được tính dựa vào thông tin nhận về từ ít nhất 3 vệ
tinh, theo lý thuyết.
6.1.3 Các giải thuật đồng bộ hóa vật lý (Clock synchronization algorithm).
Nếu tất cả các máy tính đều có WWV Receiver thì việc đồng bộ chúng là dễ dàng vì tất cả đều
cùng đồng bộ với giờ chuẩn quốc tế UTC.Tuy nhiên khi không có WWV thì việc đồng bộ được
thực hiện bằng các giải thuật đồng bộ sau.

a. Giải thuật Cristian
Giả sử trong hệ phân tán có một máy có WWV (gọi là Time server ) và chúng ta sẽ tiến hành
đồng bộ các máy khác với máy này.Trong khoảng thời gian δ/2p mỗi máy sẽ gửi một thông điệp
đến máy chủ hỏi thời gian hiện tại. Máy chủ nhanh sẽ phản hồi bằng một thông điệp mang giá trị
thời gian C(utc).Bên gửi nhận được phản hồi nó sẽ thiết lập lại clock thành C(uct).
Hình . Xác định thời gian trong time server
Đánh giá: giải thuật này có 2 vấn đề :
- Một là nếu clock bên gửi chạy nhanh thì lúc này C(uct) sẽ nhỏ hơn thời gian hiên tại C
của bên gửi..Có thể giải quyết bằng cách thay đổi nhịp ngắt lại nhanh hơn hoặc chậm hơn cho đến
lúc khớp nhau.
- Hai là sự chênh lệch từ lúc C(uct) được gửi cho đến lúc nhận được có thể gây lỗi.Giải quyết
bằng cách ghi nhận khoản thời gian giữa lúc gửi và nhận
b. Giải thuật Berkeley.
Tư tưởng của giải thuật:
Server sẽ chủ động cho các máy khác biết thời gian chuẩn của mình C
UTC
sau đó sẽ yêu cầu thông
tin về thời gian của các client.
Client sẽ trả lời khoảng thời gian chênh lệch giữa nó và server.
Server sẽ tính khoảng thời gian mà các client so với thời gian chuẩn của server lúc đó và gửi cho
các máy khách cách điều chỉnh thời gian cho phù hợp.
Page | 5
-
Hình . Đồng bộ theo giải thuật Berkeley
c. Giải thuật trung bình sử dụng cho các mạng không dây
Giải thuật này sử dụng trong giao thức RBS. Giải thuật này thực hiện chia thời gian thành
những khoảng đồng bộ cố định. Khoảng thời gian i sẽ bắt đầu từ thời điểm (To + i.R) và chạy đến
khi To+(i+1)R với To là thời điểm xác định trước và R là một biến hệ thống .
Vào thời điểm bắt đầu của mỗi lần đồng bộ tất cả các máy của mạng sẽ broadcast thời gian của
mình .

Sau khi broadcast nó sẽ bắt đầu thu thập thời gian mà các máy khác gửi đến trong khoảng thời
gian S. Sau đó bỏ đi giá trị lớn nhất và nhỏ nhất rồi tính trung bình của các giá trị thời gian còn
lại.
6.2 Đồng hồ logic (Logical Clock)
Trong nhiều trường hợp, giữa các tiến trình không nhất thiết phải phù hợp theo thời gian thực tế
mà chỉ cần khớp với nhau về thời gian. Do đó người ta đưa ra khái niệm đồng hồ
logic.
6.2.1 Nhãn thời gian Lamport (Lamport timestamps).
Lamport đã đưa ra mô hình đồng hồ logic đầu tiên cùng với khái niệm nhãn thời gian.
a. Xét định nghĩa mối quan hệ “xảy ra trước” ()
Khi có A B : A xảy ra trước B thì tất cả các tiến trình trong hệ phân tán thỏa thuận sự kiện A
xảy ra trước rồi đến sự kiện B.
A và B là hai sự kiện của cùng một tiến trình. Nếu A xảy ra trước B thì AB là đúng.
Nếu A là sự kiện bản tin được gửi bởi một tiến trình nào đó, còn B là sự kiện bản tin đó được
nhận bởi một tiến trình khác thì quan hệ A B là đúng.
Quan hệ xảy ra trước có tính bắc cầu: A B , B C thì A C.
b. Tem thời gian (Time Stamps)
Để đo thời gian tương ứng với 4 sự kiện x thì ta gán một giá trị C(x) cho sự kiện đó và thỏa mãn
các điều kiện sau:
Nếu A B trong cùng một tiến trình thì C(A) < C(B).
Nếu A và B biểu diễn tương ứng việc gửi và nhận một thông điệp thì ta có C(A)< C(B)
Với mọi sự kiện phân biệt (không có liên quan) thì C(A)<>C(B)

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×