Professional Documents
Culture Documents
1
Nội dung chương 3
2
Đồng bộ tiến trình
Liên lạc giữa các tiến trình
Mục đích:
Để chia sẻ thông tin như dùng chung file, bộ nhớ,…
Hoặc hợp tác hoàn thành công việc
Các cơ chế:
Liên lạc bằng tín hiệu (Signal)
Liên lạc bằng đường ống (Pipe)
Liên lạc qua vùng nhớ chia sẻ (shared memory)
Liên lạc bằng thông điệp (Message)
Liên lạc qua socket
3
Đồng bộ tiến trình
Liên lạc bằng tín hiệu (Signal) Tín hiệu được gởi đi
bởi:
Tín hiệu Mô tả - Phần cứng
- Hệ điều hành:
SIGINT Người dùng nhấn phím Ctl-C để ngắt - Tiến trình:
xử lý tiến trình - Người sử dụng:
SIGILL Tiến trình xử lý một chỉ thị bất hợp lệ
Khi tiến trình nhận
SIGKILL Yêu cầu kết thúc một tiến trình
tín hiệu:
SIGFPT Lỗi chia cho 0 - Gọi hàm xử lý tín
SIGSEG Tiến trình truy xuất đến một địa chỉ bất hiệu.
V hợp lệ - Xử lý theo cách
riêng của tiến trình.
SIGCLD Tiến trình con kết thúc - Bỏ qua tín hiệu.
Đồng bộ tiến trình
Liên lạc bằng đường ống (Pipe)
- Hai tiến trình chắc chắn không thể vào miền găng cùng lúc, vì
tại một thời điểm turn chỉ có một gía trị.
- Vi phạm: một tiến trình có thể bị ngăn chặn vào miền găng bởi
một tiến trình khác không ở trong miền găng.
Đồng bộ tiến trình
Thuật toán Peterson (dùng cho 2 tiến trình)
Dùng chung hai biến turn và flag[2] (kiểu int).
flag[0]=flag[1]=FALSE
turn được khởi động là 0 hay 1.
Nếu flag[i] = TRUE (i=0,1) -> Pi muốn vào miền găng và turn=i là
đến lượt Pi.
Để có thể vào được miền găng:
Pi đặt trị flag[i]=TRUE để thông báo nó muốn vào miền găng.
Đặt turn=j để thử đề nghị tiến trình Pj 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 (flag[j] =
FALSE), thì Pi có thể vào miền găng
Nếu flag [j]=TRUE thì Pi phải chờ đến khi flag [j]=FALSE.
Khi tiến trình Pi ra khỏi miền găng, nó đặt lại trị flag[i] là FALSE.
Đồng bộ tiến trình
Thuật toán Peterson (đoạn code)
// tiến trình P0 (i=0) // tiến trình P1 (i=1)
while (TRUE) while (TRUE)
{ {
flag [0]= TRUE; //P0 muốn vào flag [1]= TRUE; //P1 muon vao
//miền găng //miền găng
turn = 1; //thu de nghi P1 vao turn = 0; //thử de nghi P0 vao
while (turn==1 && while (turn == 0 && flag
flag[1]==TRUE); [0]==TRUE); //neu P0 muon vao
//neu P1 muon vao thi P0 chờ //thi P1 chờ
critical_section(); critical_section();
flag [0] = FALSE; //P0 ra ngoài mg flag [1] = FALSE;//P1 ra ngoài mg
noncritical_section (); Noncritical_section ();
} }
Đồng bộ tiến trình
Cấm ngắt
Tiến trình cấm tất cả các ngắt trước khi vào
miền găng, và phục hồi ngắt khi ra khỏi miền
găng.
Không an toàn cho hệ thống
Không tác dụng trên hệ thống có nhiều bộ xử
lý
Đồng bộ tiến trình
Sử dụng lệnh TSL (Test and Set Lock)
boolean Test_And_Set_Lock (boolean lock){
boolean temp=lock;
Lệnh TSL cho phép
lock = TRUE;
kiểm tra và cập nhật một
return temp; //trả về giá trị ban đầu của
//biến lock vùng nhớ trong một
} thao tác độc quyền.
Một tập hợp các tiến trình gọi là ở tình trạng tắc nghẽn
nếu mỗi tiến trình trong tập hợp đều chờ đợi tài nguyên
mà tiến trình khác trong tập hợp đang chiếm giữ.
Tình trạng tắc nghẽn (deadlock)
R1 R2 R3 R1 R2 R3 R1 R2 R3
P1 3 2 2 1 0 0 4 1 2
P2 6 1 3 2 1 1
P3 3 1 4 2 1 1
P4 4 2 2 0 0 2
Nếu tiến trình P2 yêu cầu 4 R1, 1 R3. hãy cho biết
yêu cầu này có thể đáp ứng mà không xảy ra
deadlock hay không?
Tình trạng tắc nghẽn (deadlock)
Ví dụ - cấp phát tài nguyên tránh tắc nghẽn
B0: Tính Need là nhu cầu còn lại về mỗi tài nguyên j
của mỗi tiến trình i:
Need[i,j]=Max[i,j]-Allocation[i,j]
Need Allocation Available
R1 R2 R3 R1 R2 R3 R1 R2 R3
P1 2 2 2 1 0 0 4 1 2
P2 4 0 2 2 1 1
P3 1 0 3 2 1 1
P4 4 2 0 0 0 2
Tình trạng tắc nghẽn (deadlock)
Ví dụ - cấp phát tài nguyên tránh tắc nghẽn
B1+B2: yêu cầu tài nguyên của P2 thoả đk ở B1, B2.
B3: Thử cấp phát cho P2, cập nhật tình trạng hệ thống
R1 R2 R3 R1 R2 R3 R1 R2 R3
P1 2 2 2 1 0 0 0 1 1
P2 0 0 1 6 1 2
P3 1 0 3 2 1 1
P4 4 2 0 0 0 2
Tình trạng tắc nghẽn (deadlock)
R1 R2 R3 R1 R2 R3 R1 R2 R3
P1 2 2 2 1 0 0 6 2 3
P2 0 0 0 0 0 0
P3 1 0 3 2 1 1
P4 4 2 0 0 0 2
Tình trạng tắc nghẽn (deadlock)
Ví dụ - cấp phát tài nguyên tránh tắc nghẽn
+ Chọn P1
Need Allocation Available
R1 R2 R3 R1 R2 R3 R1 R2 R3
P1 0 0 0 0 0 0 7 2 3
P2 0 0 0 0 0 0
P3 1 0 3 2 1 1
P4 4 2 0 0 0 2
Tình trạng tắc nghẽn (deadlock)
+ Chọn P3:
Need Allocation Available
R1 R2 R3 R1 R2 R3 R1 R2 R3
P1 0 0 0 0 0 0 9 3 4
P2 0 0 0 0 0 0
P3 0 0 0 0 0 0
P4 4 2 0 0 0 2
Tình trạng tắc nghẽn (deadlock)
R1 R2 R3 R1 R2 R3 R1 R2 R3
P1 0 0 0 0 0 0 9 3 6
P2 0 0 0 0 0 0
P3 0 0 0 0 0 0
P4 0 0 0 0 0 0
Mọi tiến trình đã được cấp phát tài nguyên với yêu cầu
cao nhất, nên trạng thái của hệ thống là an toàn, do đó
có thể cấp phát các tài nguyên theo yêu cầu của P2.
Tình trạng tắc nghẽn (deadlock)
Giải thuật phát hiện tắc nghẽn
P5 P5
R1 R3 R4
R1 R3 R4 P1 P2 P3
P1 P2 P3
P1 P2 P3
P4
R2 R5 R2 P4 R5
P4
đồ thị đợi tài nguyên
đồ thị cấp phát tài đồ thị thử cấp phát tài
nguyên nguyên theo yêu cầu
Tình trạng tắc nghẽn (deadlock)
2. Đối với Tài nguyên có nhiều thể hiện
Bước 1: Chọn Pi đầu tiên sao cho có yêu cầu tài
nguyên có thể được đáp ứng,
nếu không có thì hệ thống bị tắc nghẽn.
Bước 2: Thử cấp phát tài nguyên cho Pi và kiểm tra
trạng thái hệ thống,
nếu hệ thống an toàn thì tới Bước 3,
ngược lại thì quay lên Bước 1 tìm Pi kế tiếp.
Bước 3: Cấp phát tài nguyên cho Pi. Nếu tất cả Pi
được đáp ứng thì hệ thống không bị tắc nghẽn, ngược
lại quay lại Bước 1.
Tình trạng tắc nghẽn (deadlock)
Hiệu chỉnh tắc nghẽn
Hủy tiến trình trong tình trạng tắc nghẽn
Hủy đến khi không còn chu trình gây tắc nghẽn
Dựa vào các yếu tố như độ ưu tiên, thời gian đã xử lý,
số tài nguyên đang chiếm giữ, hoặc yêu cầu thêm...
Thu hồi tài nguyên
Chọn lựa một nạn nhân: tiến trình nào sẽ bị thu hồi tài
nguyên? và thu hồi những tài nguyên nào?
Trở lại trạng thái trước tắc nghẽn (rollback): khi thu hồi
tài nguyên, cần phục hồi trạng thái của tiến trình về
trạng thái gần nhất khi chưa bị tắc nghẽn.
Tình trạng «đói tài nguyên»: cần bảo đảm không có
tiến trình nào luôn bị thu hồi tài nguyên?