Giải pháp phần cứng

Một phần của tài liệu Giáo trình môn Hệ Điều Hành PTIT (Trang 70 - 72)

CHƯƠNG 2 : QUẢN LÝ TIẾN TRÌNH

2.4. ĐỒNG BỘ HÓA TIẾN TRÌNH ĐỒNG THỜI

2.4.4. Giải pháp phần cứng

Phần cứng máy tính có thể được thiết kế để giải quyết vấn đề loại trừ tương hỗ và đoạn nguy hiểm. Giải pháp phần cứng thường dễ sử dụng và có tốc độ tốt. Dưới đây, ta sẽ xem xét hai giải pháp thuộc nhóm phần cứng.

2.4.4.1. Cấm các ngắt

Trong trường hợp máy tính chỉ có một CPU, tại mỗi thời điểm chỉ một tiến trình được thực hiện. Tiến trình đang có CPU sẽ thực hiện cho đến khi tiến trình đó gọi dịch vụ hệ điều hành hoặc bị ngắt. Như vậy, đề giải quyết vấn đề đoạn nguy hiểm ta chỉ cần cấm không để xẩy ra ngắt trong thời gian tiến trình đang ở trong đoạn nguy hiểm để truy cập tài nguyên. Điều này đảm bảo tiến trình được thực hiện trọn vẹn đoạn nguy hiểm và khơng bị tiến trình khác vào đoạn nguy hiểm trong thời gian đó.

Mặc dù đơn giản, việc cấm ngắt làm giảm tính mềm dẻo của hệ điều hành, có thể ảnh hưởng tới khả năng đáp ứng các sự kiện cần ngắt. Ngồi ra, giải pháp cấm ngắt khơng thể sử

dụng đối với máy tính nhiều CPU. Trong khi cấm ngắt ở CPU này, tiến trình vẫn có thể được cấp CPU khác để vào đoạn nguy hiểm. Việc cấm ngắt đồng thời trên tất cả CPU đòi hỏi nhiều thời gian để gửi thông điệp tới tất cả CPU, làm chậm việc vào đoạn nguy hiểm.

2.4.4.2. Sử dụng lệnh máy đặc biệt

Giải pháp thứ hai là phần cứng được thiết kế có thêm một số lệnh máy đặc biệt. Có nhiều dạng lệnh máy như vậy. Ở đây, ta sẽ xem xét một dạng lệnh tiêu biểu có tính đại diện cho lệnh máy dùng để đồng bộ tiến trình.

Nguyên tắc chung của giải pháp này là hai thao tác kiểm tra giá trị và thay đổi giá trị cho một biến (một ô nhớ), hoặc các thao tác so sánh và hoán đổi giá trị hai biến, được thực hiện trong cùng một lệnh máy và do vậy sẽ đảm bảo được thực hiện cùng nhau mà không bị xen vào giữa. Đơn vị thực hiện không bị xen vào giữa như vậy được gọi là thao tác nguyên tử (atomic). Ta sẽ gọi lệnh như vậy là lệnh “kiểm tra và xác lập” Test_and_Set.

Lô gic của lệnh Test_and_Set được thể hiện trên hình sau: bool Test_and_Set(bool& val) {

bool temp = val; val = true; return temp; }

Hình 2.12. Định nghĩa lệnh Test_and_Set

Ta có thể sử dụng lệnh Test_and_Set để giải quyết vấn đề đoạn nguy hiểm đồng thời cho n tiến trình ký hiệu P(1) đến P(n) như sau:

const int n; //n là số lượng tiến trình bool lock;

void P(int i){ //tiến trình P(i) for(;;){ //lặp vơ hạn

while(Test_and_Set(lock));//lặp đến khi điều kiện không thỏa <Đoạn nguy hiểm>

lock = false;

<Phần cịn lại của tiến trình> }

}

void main(){

lock = false;

//tắt tiến trình chính, chạy đồng thời n tiến trình StartProcess(P(1));

...

StartProcess(P(n)); }

Hình 2.13. Loại trừ tương hỗ sử dụng lệnh máy đặc biệt Test_and_Set PTIT

Có thể dễ dàng kiềm tra điều kiện loại trừ tương hỗ được bảo đảm khi sử dụng giải pháp với Test_and_Set như trên. Thật vậy, tiến trình chỉ có thể vào được đoạn giới hạn nếu lock=false. Do việc kiểm tra giá trị lock và thay đổi lock=true được đảm bảo thực hiện cùng nhau nên tiến trình đầu tiên kiểm tra thấy lock=false sẽ đảm bảo thay đổi lock thành true trước khi tiến trình khác kiểm tra được biến này. Điều này đảm bảo duy nhất một tiến trình vào được đoạn nguy hiểm.

Ngồi ra, tiến trình ở ngồi đoạn nguy hiểm khơng có khả năng ảnh hưởng tới giá trị của lock và do vậy không thể ngăn cản tiến trình khác vào đoạn nguy hiểm.

Giải pháp sử dụng lệnh phần cứng đặc biệt có một số ưu điểm sau: - Việc sử dụng tương đối đơn giản và trực quan.

- Giải pháp có thể dùng để đồng bộ nhiều tiến trình, tất cả đề sử dụng chung lệnh Test_and_Set trên một biến chung gắn với một tài nguyên chung.

- Có thể sử dụng cho trường hợp đa xử lý với nhiều CPU nhưng có bộ nhớ chung. Cần lưu ý là trong trường hợp này, mặc dù hai CPU có thể cùng thực hiện lệnh Test_and_Set nhưng do hai lệnh cùng truy cập một biến chung nên việc thực hiện vẫn diễn ra tuần tự.

Bên cạnh đó, giải pháp dùng lệnh phần cứng cũng có một số nhược điểm:

- Chờ đợi tích cực. Tiến trình muốn vào đoạn nguy hiểm phải liên tục gọi lệnh Test_and_Set trong vòng lặp while cho tới khi nhận được kết quả lock=false.

- Việc sử dụng lệnh Test_and_Set có thể gây đói. Trong trường hợp có nhiều tiến trình cùng chờ để vào đoạn giới hạn, việc lựa chọn tiến trình tiếp theo khơng theo quy luật nào và có thể làm cho một số tiến trình khơng bao giờ vào được đoạn giới hạn.

Một phần của tài liệu Giáo trình môn Hệ Điều Hành PTIT (Trang 70 - 72)