CHƢƠNG 5 ĐỒNG BỘ TIẾN TRèNH
5.2 Độc quyền truy xuấ t– Giari phỏp phần mềm
5.2.1 Nhu cầu độc quyền truy xuất.
Xột vớ dụ bài toỏn sản xuất và tiờu thụ sau:
Hỡnh 26 Hai tiến trỡnh cú quan hệ với nhau
Counter sẽ tăng mỗi khi thờm item mới vào bộ đệm và giảm khi xúa một item ra khỏi bộ
đệm. Khi thực thi riờng rẽ, hai thủ tục này chạy đỳng nhưng vẩn đề nảy sinh khi thực thi đồng thời. Giả sử hiện tại counter = 5, procuder và consumer thực thi đồng thời "counter :=
counter + 1" và "counter := counter - 1". Khi những cõu lệnh này thực thi đồng thời,
counter cú thể nhận giỏ trị 4, 5 hoặc 7, mặc dự về mặt logic, kết quả chớnh xỏc phải là 5. Tại sao lại cú điều nỏy? Khi thi hành trờn một dũng kiến trỳc mỏy tớnh cụ thể, "counter :=
counter + 1" cú thể chuyển sang ngụn ngữ mỏy như sau:
với là thanh ghi nằm trong CPU. Tương tự "counter := counter - 1" được chuyển thành:
cũng là thanh ghi nằm trong CPU. Thậm chớ và cú thể là cựng một thanh ghi vật lý. Sự thực thi đồng thời "counter := counter + 1" và "counter := counter - 1" ở mức cao tương đương sự thực
thi chuỗi cỏc chỉ thị mỏy ở mức thấp. Giả sử cỏc chỉ thị này xen kẽ theo thứ tự sau:
Kết quà counter = 4. Nếu đảo ngược thứ tự T4 và T5 thỡ counter = 6. Nguyờn nhõn là cả hai tiến trỡnh đồng thời thao lỏc trờn biến counter. Cỏc tiến trỡnh ở trạng thỏi tranh đoạt điểu khiến (race condition) khi nhiều tiến trỡnh cựng cập nhật vào biến dựng chung và kết quả việc thực thi phụ thuộc vào thứ lự thực hiện cụ thể của cỏc tiến trỡnh. Do vậy, phải đảm bảo tại thời diờm cụ thể chỉ cú duy nhất một tiến trỡnh được thay đổi biến dựng chung (cỏc tiến trỡnh phải đồng bộ với nhau).
5.2.2 Miền găng (Critical – Section)
Xột hệ thống gồm n tiến trỡnh {Po, Pi,…. Pn-i}. Mỗi tiến trỡnh cú đoạn mó gọi là miền găng chứa cỏc lệnh cú thể thay đổi cỏc biến dựng chung. Hệ thống phải đảm bảo tại bất kỳ thời điểm nào tối đa chỉ cú một tiến trỡnh dược thi hành đoạn mó trong miền găng (gọi là bước vào miền găng). Khi dú biến dựng chung chi bị tỏc động bởi tối đa một tiến trỡnh. Khi đú cỏc tiến trỡnh thay phiờn nhau bước vào miền găng và hệ thống vẫn đảm bảo độc quyền truy xuất tài nguvờn dựng chung, vấn đề miền găng là thiết kế giao thức đồng bộ húa cỏc tiến trinh. Núi chung, mỗi tiến trỡnh phải xin phộp bước vào miền găng, thực hiện cập nhật dữ liệu dựng chung rồi thụng bỏo thoỏt khỏi miền găng. Giải phỏp cho miền găng phải thỏa món cả 3 yờu cầu sau:
1. Độc quyền truy xuất (Mutual Exclusion): Nếu tiến trỡnh p, đang trong miền găng thỡ khụng tiến trỡnh nào được bước vào miền găng.
2. Tiến triển (Progress): Nếu khụng cú tiến trỡnh nào ở trong miền găng và cú một số tiến trỡnh muốn vào miền găng thỡ một tiến trỡnh nào đú phải được vào miền găng.
3. Giới hạn đợi (bounded waiting): Thời gian từ khi tiến trỡnh yờu cầu cho đến khi thực sự bước vào miền găng phải bị chặn bởi giới hạn nào đú.
69 struct semaphore {
int value;
process *queue;//danh sỏch chứa cỏc tiến trỡnh bị phong tỏa };
void Wait(semaphore& S) {
S.value--;
if (S.value < 0) {
Thờm tiến trỡnh gọi Wait vào S.queue
block(); //phong tỏa tiến trỡnh
} } void Signal(semaphore& S) { S.value++; if (S.value <= 0) {
Lấy một tiến trỡnh P từ S.queue wakeup(P);
} }
Hỡnh 27 Dũng thời gian của đoạn băng