CHƯƠNG 4 ĐỒNG BỘ HOÁ TIẾN TRÌNH 4.1 Các khái niệm cơ bản
4.3.2. Các chỉ thị đặc biệt
Nhiều kiến trúc máy tính có chỉ thị phần cứng đặc biệt cho phép kiểm tra và chỉnh sửa (Test and Set) hoặc tráo đổi (Swap) nội dung hai từ nhớ một cách đơn nhất. chúng có thể được dùng để giải quyết vấn đề vùng tương tranh.
boolean TestAndSet(boolean &target) {
boolean rv = target; target = true;
return rv; }
void Swap(boolean &a, boolean &b) {
55
a = b; b = temp; }
Đặc điểm quan trọng hai chỉ thị kiểu này là sự thực thi một cách toàn vẹn và đơn nhất, nghĩa là quá trình thực hiện chỉ thị không bị gián đoạn.
Với chỉ thị TestAndSet, có thể thi hành độc quyền truy suất bằng việc dùng biến boolean lock khởi tạo bằng false. Cấu trúc của tiến trình Pi như sau:
do { while (TestAndSet(lock)); critical section lock = false; remainder section } while (1);
Với chỉ thị Swap, có thể thi hành độc quyền truy suất bằng việc dùng biến chia sẻ lock
được khởi tạo giá trị false, mỗi tiến trình Pi có biến cục bộ key. Cấu trúc của tiến trình Pi như sau:
do {
key = true;
while (key == true) Swap(lock, key); critical section lock = false; remainder section } while (1) 4.4. Semaphores 4.4.1. Khái niệm
Ở các giải pháp phần mềm ta thấy các tiến trình khi yêu cầu được vào vùng tương tranh đều phải liên tục kiểm tra điều kiện gọi là hiện tượng chờ đợi bận (busy waiting), tốn nhiều thời gian xử lý của CPU. Nếu thời gian xử lý trong vùng tương tranh lớn, một giải pháp hiệu quả nên có cơ chế tạm dừng các tiến trình cần đợi.
Semaphore là công cụ đồng bộ cung cấp bởi hệ điều hành mà không đòi hỏi busy waiting.
Semaphore S là một biến số nguyên, ngoài thao tác khởi động biến thì chỉ có thể được truy xuất qua hai tác vụ có tính đơn nguyên và loại trừ tương hỗ.
wait(S) hay còn gọi là P(S): giảm giá trị semaphore. Kế đó nếu giá trị này âm thì tiến trình thực hiện lệnh wait() bị tạm dừng.
56
signal(S) hay còn gọi là V(S): tăng giá trị semaphore. Kế đó nếu giá trị này không dương, một tiến trình đang bị tạm dừng bởi một lệnh wait() sẽ được hồi phục để thực thi.
Tránh chờ đợi bận: khi phải đợi thì tiến trình sẽ được đặt vào một hàng đợi, trong đó chứa các tiến trình đang chờ đợi cùng một sự kiện.