Semaphore - Bài tập OS

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 2

SEMAPHORE-1

Trong bài toán, có hai trường hợp P0 in ra 3 lần ‘0’, và hai trường hợp
P0 in ra 2 lần ‘0’. Cụ thể như sau.
Tình huống 1: Hàm wait(S0) ở P0 trong lần lặp thứ nhất thực hiện
trước lệnh signal(S0) của P1.
- Trong lần lặp đầu tiên ở P0, wait(S0) được thực hiện trước
signal(S0) của P1. S0 ban đầu có giá trị bằng 1 khi khởi tạo nên thực
hiện phần Critical Session và in ra ‘0’ một lần. Đồng thời, lệnh
signal(S1) và signal(S2) cũng được thực hiện và đặt S1 = 1 và S2 = 1.
- Có ba trường hợp xảy ra tiếp theo:
+ Trường hợp 1: Hàm Signal(S0) của P1 sẽ được thực hiện trước
hàm wait(S0) của P0 trong lần lặp thứ hai. Trong khi đó hàm
signal(S0) của P2 được thực hiện sau wait(S0) của lần lặp thứ hai.
- Sau khi thực hiện signal(S0) ở P1, xét wait(S0) ở lần lặp thứ
hai. Lúc này, S0 bằng 1 và thực hiện Critical Session. In ra ‘0’ lần
thứ hai.
- Sau đó, thực hiện signal(S0) ở P2, xét wait(S0) ở lần lặp thứ
ba. S0 có giá trị bằng 1 và thực hiện Critical Session. In ra’0’ lần thứ
ba.
- Tại lần lặp thứ 4, wait(S0) được thực hiện nhưng giá trị S0
bằng 0 nên không in ra ‘0’ nữa.
=> Có 3 lần in ‘0’.
+ Trường hợp 2: Hàm signal(S0) của P2 được thực hiện trước hàm
wait(S0) của P0 trong lần lặp thứ hai, còn signal(S0) của P1 được thực
hiện sau đó.
- Sau khi thực hiện signal(S0) ở P2, xét wait(S0) ở lần lặp thứ
hai. Giá trị S0 bằng 1 nên sẽ thực hiện Critical Session và in ra ‘0’ lần
thứ hai.
- Sau đó, thực hiện signal(S0) ở P1 và xét wait(S0) ở lần lặp thứ
ba. Do giá trị S0 bằng 1 nên tiếp tục in ra ‘0’ lần thứ 3.
- Tại lần lặp thứ 4, wait(S0) được thực hiện nhưng giá trị S0
bằng 0 nên không in ra ‘0’ nữa.
=> Có 3 lần in ‘0’.
+ Trường hợp 3: Hàm signal(S0) của P1 và P2 xảy ra trước khi hàm
wait(S0) của lần lặp thứ hai được thực hiện.
- Sau khi thực hiện signal(S0) ở P1 và P2, giá trị của S0 bằng 1.
Xét wait(S0) ở lần lặp thứ 2. Sau đó thực hiện Critical Session và in
ra ‘0’ lần thứ hai.
- Ở lần lặp thứ 3, thực hiện wait(S0). Giá trị S0 bằng 0 nên sẽ
không in ra ‘0’ nữa.
=> Có 2 lần in ra ‘0’.
Tình huống 2: Hàm wait(S0) ở P0 trong lần lặp thứ nhất thực hiện
sau lệnh signal(S0) của P1.
- Ban đầu, lệnh wait(S1) được thực hiện. S1 có giá trị bằng 1 từ khi
khởi tạo nên sẽ thực hiện Critical Session.
- Thực hiện signal(S0) ở P1. Tuy nhiên, giá trị ban đầu của S0 là 1 nên
giá trị không thay đổi.
- Ở lần lặp thứ nhất của P0, thực hiện wait(S0). Giá trị của S0 bằng 1
nên thực hiện Critical Session và in ra ‘0’ lần thứ nhất. Sau đó thực
hiện signal(S1) và signal(S2) để đặt S1 và S2 bằng 1.
- Sau khi đó, P2 được thực hiện. Hàm signal(S0) của P2 được kích
hoạt, đặt S0 bằng 1.
- Ở lần lặp thứ hai của P0, thực hiện wait(S0). Do S0 có giá trị bằng 1
nên sẽ thực hiện Critical Session, in ra ‘0’ lần thứ hai.
- Ở lần lặp thứ ba của P0, thực hiện wait(S0) nhưng S0 = 0 nên không
in ra ‘0’ nữa.
=> Có 2 lần in ra ‘0’

You might also like