Tổng hợp 3 bài đồng bộ hóa tiên trính P1,P2,P3

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down

Tổng hợp 3 bài đồng bộ hóa tiên trính P1,P2,P3

Bài gửi  HUYNHTHENGUYENIT83(i12a) on 22/4/2012, 22:24

Giai thuật đèn hiệu Semaphore
typedef int semaphore;
wait (semaphore S)
{ while ( S <= 0 );
S --;
}
// Hàm signal được viết lại như sau:
signal (semaphore S, int i)
{
S = S + i;
}

Bài 1: đồng bộ P1 tới trước báo hiệu P2 và P3 cùng chạy sau P1.
Ta có: P1 có mã S1, P2 có mã S2, P3 có mã S3. Cần tổ chức để S2 và S3 thi hành sau S1
Sử dụng 1 đèn hiệu duy nhất Semaphore synch=0

Tại thời điểm ban đầu: P1 đang thực hiện lệnh S1, lúc này synch=0
 Khi tiến trình P2 được thực hiện, thì P2 sẽ bị khóa tại hàm wait(synch) do synch=0 cho đến khi synch>0.
 Tương tự, khi tiến trình P3 được thực hiện, thì cũng như P2, P3 sẽ bị khóa tại hàm wait(synch) do synch=0 cho đến khi synch>0. Do đó, S2 và S3 chỉ được thực hiện khi S1 thực hiện xong.
Khi tiến trình P1 được thực hiện, lệnh S1 được thi hành xong, rồi đến lệnh signal (synch,2) lúc này synch được tăng lên 2.
 Khi synch=2, tiến trình P2 được thực hiện và hàm wait(synch) sẽ giảm giá trị synch xuống 1 đơn vị (synch=1). Đồng thời, hàm wait(synch) của tiến trình P3 có thể được thực hiện trước khi S2 được thực hiện, hàm wait này sẽ giảm giá trị synch xuống một đơn vị (synch = 0), rồi lần lượt S2 , S3 được thi hành.
--> Luôn đảm bảo quy tắc S1 đi trước S2 và S3.


Bài 2: đồng bộ P1 và P2 tới trước P3
Ta có: P1 có mã S1, P2 có mã S2, P3 có mã S3. Cần tổ chức để S1 và S2 thi hành trước S3. Sử dụng 1 đèn hiệu duy nhất Semaphore synch=-1




Tại thời điểm ban đầu: P1 và P2 đang thực hiện lệnh S1, S2, lúc này synch=-1,
Khi tiến trình P3 được gọi, thì P3 sẽ bị khóa tại hàm wait(synch) do synch=0 cho đến khi synch>0.
Giả sử tiến trình P1 thực hiện lệnh S1 xong trước, rồi đến lệnh signal(synch) lúc này tăng synch lên 1 (synch=0). Sau đó, tiến trình P2 cũng thực hiện xong lệnh S2, rồi đến lệnh signal(synch), lúc này tăng synch lên 1(synch=1)

Khi synch=1, tiến trình P3 được thực hiện và hàm wait(synch) sẽ giảm giá trị synch xuống 1 đơn vị (synch=0), và thi hành lệnh S3
--> Luôn đảm bảo quy tắc S1 và S2 trước S3.


Bài 3: đồng bộ P1 trước P2 và P2 trước P3
Ta có: P1 có mã S1, P2 có mã S2, P3 có mã S3. Cần tổ chức để S1 và S2 thi hành trước S3. Sử dụng 2 đèn hiệu: Semaphore synch1=0, synch2=0.




Tại thời điểm ban đầu: P1 đang thực hiện lệnh S1, lúc này synch1=0,
Khi tiến trình P2 được thực hiện, thì P2 sẽ bị khóa tại hàm wait(synch1) do synch1=0 cho đến khi synch1>0.
Tương tự, khi tiến trình P3 được thực hiện, thì cũng như P2, P3 sẽ bị khóa tại hàm wait(synch2) do synch2=0 cho đến khi synch2>0. Do đó, S2 và S3 chỉ được thực hiện khi S1 thực hiện xong.

Khi tiến trình P1 được thực hiện, lệnh S1 được thi hành xong, rồi đến lệnh signal (synch1) lúc này synch1 được tăng lên 1 (synch1=1).

Khi synch1=1, tiến trình P2 mở khóa tại hàm wait(synch1) và hàm wait(synch1) sẽ giảm giá trị synch1 xuống 1 đơn vị (synch1=0), tiếp tục S2 được thực hiện, sau khi S2 thực hiện xong, lệnh signal(synch2) sẽ tăng lên 1 (synch2=1).

Khi synch2=1, tiến trình P2 chạy hoàn tất, P3 sẽ được mở khóa tại hàm wait(synch2) và thực thi lệnh S3

--> Luôn đảm bảo quy tắc S1 trước S2 và S2 trước S3.


daohuusang(i92c)

Admin
- Hình như thiếu các hình lời giải !
- Bài này có ưu điểm là viết lại hàm Signal để có thêm tham biến thứ 2 là i (gia số cần tăng cho giá trị đèn hiệu).


avatar
HUYNHTHENGUYENIT83(i12a)

Tổng số bài gửi : 21
Join date : 16/02/2012

Xem lý lịch thành viên

Về Đầu Trang Go down

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang


 
Permissions in this forum:
Bạn không có quyền trả lời bài viết