MỤC LỤC01 03 02 MÔ TẢ BÀI TOÁN VÀ THUẬT TOÁN 04 MINH HỌA CHƯƠNG TRÌNH TÀI NGUYÊN GĂNG DEADLOCK VÀ STARVATION GIẢI PHÁP ĐIỀU ĐỘ... Các tiến trình hoạt động đồng thời thường cạnh tranh nha
Trang 1Giảng viên: Tsĩ Đỗ Quốc Huy
Thành viên nhóm :
- Lê Duy Anh Dũng – 20198170
- Trần Trung Dũng – 20198171
- Lê Đức Mạnh - 20198189
BÁO CÁO NHÓM 12 Minh họa bài toán người thợ cắt tóc
Sleeping Barber Problem
Trường đại học Bách Khoa Hà Nội
Hanoi University of Science and Technology
Trang 2MỤC LỤC
01
03
02
MÔ TẢ BÀI TOÁN
VÀ THUẬT TOÁN
04
MINH HỌA CHƯƠNG TRÌNH
TÀI NGUYÊN GĂNG
DEADLOCK VÀ STARVATION
GIẢI PHÁP ĐIỀU ĐỘ
Trang 3TÀI NGUYÊN GĂNG
DEADLOCK VÀ STARVATION
01
Trang 4TÀI NGUYÊN GĂNG
Là các tài nguyên hạn chế về khả năng sử dụng chung Các tiến trình hoạt động đồng thời thường cạnh tranh nhau trong việc sử dụng tài nguyên dùng chung (cùng ghi vào không gian nhớ chung hay cùng ghi dữ liệu vào một file chia sẻ)
Dùng chung tài nguyên găng có thể dẫn đến không đảm bảo tính toàn vẹn dữ liệu
Cần có cơ chế đồng bộ hóa tiến trình
Trang 5YÊU CẦU ĐỒNG BỘ HÓA TIẾN TRÌNH
Loại trừ lẫn nhau (Mutal Exclusion): Không có hai tiến trình cùng lúc trong đoạn găng
Tiến triển (Progress): Tài nguyên găng còn khả năng phục vụ và tồn tại tiến trình muốn vào đoạn găng, thì tiến trình đó phải được sử dụng tài nguyên
găng
Chờ đợi có hạn (Bounded wait): Nếu tài nguyên găng hết khả năng phục vụ và vẫn tồn tại tiến trình muốn vào đoạn găng, thì tiến trình đó phải được
xếp hàng chờ đợi và sự chờ đợi là hữu hạn
Trang 6 Hai hay nhiều tiến trình phải chờ nhau để giải phóng tài nguyên
Nhiều tiến trình chờ sử dụng các tài nguyên trong trạng thái mãi mãi
Các tiến trình chờ một sự kiện không bao giờ xảy ra
DEADLOCK xuất
hiện khi:
DEADLOCK
DEADLOCK xuất hiện khi cả 4 điều kiện xảy ra:
Tồn tại tài nguyên găng
Chờ đợi trước khi vào đoạn găng
Không có hệ thống phân phối lại tài nguyên găng
Chờ đợi vòng tròn
Trang 7Một tiến trình bị trưng dụng tài nguyên quá nhiều lần => gây ra sự chết đói Giải pháp: ghi lại số lần bị trưng dụng
Trang 8CÁC GIẢI PHÁP ĐIỀU ĐỘ
02
Trang 9GIẢI PHÁP SEMAPHORE
Semaphore là một biến nguyên nếu không tính toán đến toán tử khởi tạo, nó chỉ có
thể truy cập thông qua hai toán tử nguyên tố là wait và signal
Có 2 loại Semaphore:
Semaphore nhị phân Semaphore
Trang 10MÔ TẢ BÀI TOÁN
VÀ THUẬT TOÁN
03
Trang 11MÔ TẢ BÀI TOÁN
Trang 12DEADLOCK VÀ STARVATION
DEADLOCK
STARVATION
Starvation xảy ra khi một khách hàng phải chờ đợi trong một thời
gian dài, khi những khách hàng khác không tuân theo trật tự, hoặc thợ cắt tóc gọi khách một cách ngẫu nhiên.
Deadlock - xảy ra khi cả khách hàng và thợ cắt tóc đều cùng chờ đợi
lẫn nhau.
Trang 13THUẬT TOÁN
Trang 14 Customers: Đếm số khách hàng trong phòng chờ
Barber (mang giá trị 0 và 1): Kiểm tra tình trạng của thợ cắt tóc xem có hay không làm việc.
AccessSeat: Cho phép khách hàng truy cập vào số lượng ghế còn trống và có thể tăng hoặc giảm số lượng Biến này dùng để thực
hiện thao tác loại trừ lẫn nhau
Cần thêm một biến FreeSeat để đếm số lượng ghế trống hiện tại, khách hàng sẽ ngồi vào nếu còn ghế trống, nếu không, khách
hàng rời đi
THUẬT TOÁN
Giải quyết vấn đề deadlock và starvation => sử dụng ba biến semaphore :
Trang 15 Customers: Đếm số khách hàng trong phòng chờ
Barber (mang giá trị 0 và 1): Kiểm tra tình trạng của thợ cắt tóc xem có hay không làm việc.
AccessSeat: Cho phép khách hàng truy cập vào số lượng ghế còn trống và có thể tăng hoặc giảm số lượng Biến này dùng để thực
hiện thao tác loại trừ lẫn nhau
Cần thêm một biến FreeSeat để đếm số lượng ghế trống hiện tại, khách hàng sẽ ngồi vào nếu còn ghế trống, nếu không, khách
hàng rời đi
THUẬT TOÁN Giải quyết vấn đề deadlock và starvation => sử dụng ba biến semaphore:
Trang 16THUẬT TOÁN
Semaphore Customers = 0;
Semaphore Barber = 0;
Semaphore AccessSeat = 1;
int FreeSeats = N;
Barber {
while(true) {
/*Trạng thái ngủ - chờ đợi khách hàng */
wait (Customers); 0
/*Giảm biến semaphore, bảo vệ số lượng ghế khả dụng.*/
wait(AccessSeat); 0
/*Ghế trống tăng lên.*/
FreeSeats++; 5
/* Đưa khách hàng đi cắt tóc*/
signal(Barber); 1
/*Giải phóng biến mutex về ghế.*/
signal(AccessSeat); 1
/*Người thợ cắt tóc*/
}
}
Customer { while(true) {
/*Chỉ cho phép một khách hàng bước vào phòng đợi tại một thời điểm.*/
wait(AccessSeat); 0
/*Nếu số lượng ghế hàng đợi trống còn lớn hơn 0*/
if(FreeSeats > 0) {
/*Khách hàng ngồi xuống, biến FreeSeats giảm đi 1*/
FreeSeats ; 4
/*Thông báo tới thợ cắt tóc*/
signal(Customers); 0
/*Giải phóng khóa AccessSeat */
signal(AccesSeat); 1 cut_hair();
/*Nếu thợ cắt tóc đang bận, đợi tại phòng chờ*/
wait(Barber); 0
// Khách hàng được cắt tóc
} else {
/*Giải phóng khóa AcessSeat */
signal(AccessSeat);
//Khách hàng rời đi.
} }
Trang 17CHƯƠNG TRÌNH MINH HỌA
04