Giải pháp của Peterson

Một phần của tài liệu BÀI GIẢNG NGUYÊN LÝ CÁC HỆ ĐIỀU HÀNH (Trang 55 - 56)

Tiếp cận : Petson đưa ra một giải pháp kết hợp ý tưởng của cả hai giải pháp kể trên. Các tiến trình chia sẻ hai biến chung :

int turn; // đến phiên ai

int interesse[2]; // khởi động là FALSE

Nếu interesse[i] = TRUE có nghĩa là tiến trình Pi muốn vào miền găng. Khởi

đầu, interesse[0]=interesse[1]=FALSE và giá trị của est được khởi động là 0 hay 1. Để có thể vào được miền găng, trước tiên tiến trình Pi đặt giá trị interesse[i]=TRUE ( xác định rằng tiến trình muốn vào miền găng), sau đó đặt turn=j (đề nghị thử tiến trình khác vào miền găng). Nếu tiến trình Pj không quan tâm đến việc vào miền găng (interesse[j]=FALSE), thì Pi có thể vào miền găng, nếu không, Pi phải chờ đến khi

interesse[j]=FALSE. Khi tiến trình Pi rời khỏi miền găng, nó đặt lại giá trị cho

interesse[i]= FALSE.

while (TRUE) {

int j = 1-i; // j là tiến trình còn lại interesse[i]= TRUE;

turn = j;

while (turn == j && interesse[j]==TRUE);

critical-section ();

interesse[i] = FALSE;

Hình 3.7 Cấu trúc tiến trình Pi trong giải pháp Peterson

giải pháp này ngăn chặn được tình trạng mâu thuẫn truy xuất : mỗi tiến trình Pi chỉ có thể vào miền găng khi interesse[j]=FALSE hoặc turn = i. Nếu cả hai tiến trình đều muốn vào miền găng thì interesse[i] =interesse[j] =TRUE nhưng giá trị của turn

chỉ có thể hoặc là 0 hoặc là 1, do vậy chỉ có một tiến trình được vào miền găng.

2.4.3.1.2. Các giải pháp phần cứng

a) Cấm ngắt:

Một số vi xử lý cung cấp cấp chỉ thị CLI và STI để người lập trình thực hiện thao tác mở ngắt (STI: Setting Interrupt) và cấm ngắt (CLI: Clean Interrupt) của hệ thống trong lập trình. Người lập trình có thể dùng cặp chỉ thị này để đồng bộ hóa các tiến trình như sau: Trước khi vào miền găng tiến trình thực hiện chỉ thị CLI, để yêu cầu cấm các ngắt trong hệ thống, khi đó ngắt đồng hồ không thể phát sinh, nghĩa là không có một tiến trình nào khác có thể phát sinh, nhờ đó mà tiến trình trong đoạn găng toàn quyền sử dụng tài nguyên găng cho đến hết thời gian xử lý của nó. Khi kết thúc truy xuất tài nguyên găng, tiến trình ra khỏi miền găng, tiến trình thực hiện chỉ thị STI để cho phép ngắt trở lại. Khi đó các tiến trình khác có thể tiếp tục hoạt động và có thể vào miền găng.

Giải pháp đơn giản, dễ cài đặt. Tuy nhiên cần phải có sự hỗ trợ của vi xử lý và dễ gây ra hiện tượng treo toàn bộ hệ thống, khi tiến trình đang ở trong miền găng không có khả năng ra khỏi miền găng. Tiến trình không ra khỏi miền găng nên nó không thể thực hiện chỉ thị STI để mở ngắt cho hệ thống, nên hệ thống bị treo hoàn toàn.

Giải pháp này không thể sử dụng trên các hệ thống đa bộ xử lý, vì CLI chỉ cấm ngắt trên vi xử lý hiện tại chứ không thể cấm ngắt của các vi xử lý khác. Tức sau khi cấm ngắt, tiến trình trong miền găng vẫn có thể bị tranh chấp tài nguyên găng bởi các tiến trình trên các vi xử lý khác trong hệ thống.

Một phần của tài liệu BÀI GIẢNG NGUYÊN LÝ CÁC HỆ ĐIỀU HÀNH (Trang 55 - 56)

Tải bản đầy đủ (PDF)

(142 trang)