Vì sao phải đồng bộ hóa giữa các tiến trình
Khái niệm “Critical Section” Cấu trúc tổng quát của quá trình trong bài toán loại trừ tương hỗ Giả sử mỗi process thực thi bình thường (i.e., nonzero speed) và không có sự tương quan giữa tốc độ thực thi của các process Cấu trúc tổng quát của một process: Một số giả định
Giải bài toán loại trừ tương hỗ Lời giải phải thỏa 3 tính chất:1. Mutual exclusion : Khi một process P đang thực thi trong vùng tranh chấp (CS) thì không có process Q nào khác đang thực thi trong CS.2. Progress: Nếu không có quá trình nào đang thực thi trong vùng tranh chấp (CS) và có ít nhất một quá trình muốn vào vùng tranh chấp, thì chỉ có những quá trình đangkhông thực thi trong vùng remainder (RS) mới có quyền quyết định lựa chọn quá trình kế tiếp vào vùng tranh chấp và quyết định đó không được phép trì hoãn vô hạn định 3. Bounded waiting ( lockout-freedom ): Khi một quá trình muốn vào vùng tranh chấp (CS), thì từ khi yêu cầu đến khi được đáp ứng là khoảng thời gian có hạn (bounded or limit) Phân loại giải pháp cho loại trừ tương hỗ
Giải pháp dùng lệnh máy thông thường
Giải thuật 1 (Dekker1) Biến chia sẻ int turn; /* khởi đầu turn = 0 */ if turn = i then ( P i được phép vào critical section, với i = 0 hay 1)Process P i do { while (turn != i); critical section turn = j; remainder section } while (1);Giải thuật thoả mãn mutual exclusion (1), nhưng không thoả mãn tính chất progress (2) vì tính chất strict alternation của giải thuật Giải thuật không thỏa mãn tính chất progress (2):Nếu turn = 0, P0 được vào CS và sau đó thực thi turn = 1 và vào vùng RS; giả sử P0 “ở lâu” trong đó.Lúc đó P1 vào CS và sau đó gán turn = 0, kế đó P1 vào và xong RS, vào entry section, đợi vào CS một lần nữa; nhưng vì turn = 0 nên P1 phải chờ P0. Giải thuật 2 (Dekker2) Biến chia sẻ boolean flag[ 2 ]; /* khởi đầu flag[ 0 ] = flag[ 1 ] = false */ if flag[ i ] = true then P i “sẵn sàng” vào critical section. Process P i do { flag[i] = true; /* P i “sẵn sàng” vào CS */ while (flag[j]); /* P i “nhường” P j */ critical section flag[i] = false; remainder section } while (1); Không thỏa mãn bounded wait(3). Vì sao? Trường hợp sau có thể xảy ra:P0 gán flag[ 0 ] = trueP1 gán flag[ 1 ] = trueP0 và P1 loop mãi mãi trong vòng lặp while Giải thuật Peterson (1981) Biến chia sẻ: kết hợp cả giải thuật 1 và 2 Giải thuật Peterson cho 2 process thỏa mutual exclusion, progress, và lockout-freedom
Giải thuật bakery
/* shared variable */ boolean choosing[n]; int num[n]; do { /* initially, choosing[ i ] = false */ /* initially, num[ i ] = 0 */ choosing[i] = true; num[i] = max(num[0], num[1], …, num[n 1]) + 1; choosing[i] = false; for (j = 0; j < n; j++) { while (choosing[j]); while ((num[j] != 0) && (num[j], j) < (num[i], i)); } critical section num[i] = 0; remainder section } while (1); Đánh giá
Dùng lệnh cấm ngắt
Dùng các lệnh máy đặc biệt
Lệnh TestAndSet Đọc và ghi một biến chia sẻ bằng một lệnh đơn nguyên
boolean TestAndSet(boolean & target) {
boolean rv = target;
target = true;
return rv;
}
Áp dụng TestAndSetShared data:boolean lock = false;
Lệnh Swap void Swap(boolean & a, boolean & b) { boolean temp = a; a = b; b = temp; } Biến chia sẻ (khởi tạo là false) bool lock;Process P i : do { key = true; while (key == true) Swap(lock, key); critical section lock = false; remainder section } while (1);Không thỏa mãn starvation freedom Giải thuật dùng TestAndSet: thoả mãn 3 yêu cầu
|