Đồng bộ hóa tiến trình(tt)
Đồng bộ hóa tiến trình(tt)
Các phương pháp thực hiện loại trừ nhau vào vùng găng
Các phương pháp thực hiện loại trừ nhau vào vùng găng
SLEEP: Chuyển tiến trình gọi nó về trạng thái blocked cho đến khi
SLEEP: Chuyển tiến trình gọi nó về trạng thái blocked cho đến khi
tiến trình khác gởi đến nó tín hiệu đổi trạng thái ( WAKEUP)
tiến trình khác gởi đến nó tín hiệu đổi trạng thái ( WAKEUP)
WAKEUP(Process) : Chuyển tiến trình Process về trạng thái Ready
WAKEUP(Process) : Chuyển tiến trình Process về trạng thái Ready
(tiến trình đã gọi SLEEP trước đó)
(tiến trình đã gọi SLEEP trước đó)
Xét bài toán : “Sản xuất – tiêu thụ “: Có hai tiến trình SảnXuất và
Xét bài toán : “Sản xuất – tiêu thụ “: Có hai tiến trình SảnXuất và
TiêuThụ dùng chung buffer có kích thước cố định. Tiến trình SảnXuất
TiêuThụ dùng chung buffer có kích thước cố định. Tiến trình SảnXuất
đặt sản phẩm vào buffer nếu buffer còn trống. Tiến trình TiêuThụ lấy
đặt sản phẩm vào buffer nếu buffer còn trống. Tiến trình TiêuThụ lấy
sản phẩm từ buffer nếu buffer khác rỗng.
sản phẩm từ buffer nếu buffer khác rỗng.
#define N 100 #define N 100 int count=0; int count=0; void SảnXuất(void) void SảnXuất(void) { { int item; int item;
Đồng bộ hóa tiến trình(tt)
Đồng bộ hóa tiến trình(tt)
Các phương pháp thực hiện loại trừ nhau vào vùng
Các phương pháp thực hiện loại trừ nhau vào vùng
gănggăng găng while (TRUE) while (TRUE) { { SảnXuấtSảnPhẩm(&Item); SảnXuấtSảnPhẩm(&Item); if (count == N) SLEEP(); if (count == N) SLEEP(); ĐặtSảnPhẩm(Item); ĐặtSảnPhẩm(Item); count++; count++; if (count == 1) WAKEUP(
if (count == 1) WAKEUP(TieuThụTieuThụ););
}
}
}
Đồng bộ hóa tiến trình(tt)
Đồng bộ hóa tiến trình(tt)
Các phương pháp thực hiện loại trừ nhau vào vùng găng
Các phương pháp thực hiện loại trừ nhau vào vùng găng
void TiêuThụ(void) void TiêuThụ(void) { { int Item; int Item; while( TRUE) while( TRUE) { { if (count == 0) SLEEP(); if (count == 0) SLEEP(); LấySảnPhẩm(&Item); LấySảnPhẩm(&Item); count--; count--;
if (count == N-1) WAKEUP (SảnXuất);
if (count == N-1) WAKEUP (SảnXuất);
TiêuThụsảnPhẩm(Item); TiêuThụsảnPhẩm(Item); } } } }
Hãy thảo luận !
Đồng bộ hóa tiến trình(tt)
Đồng bộ hóa tiến trình(tt)
Các phương pháp thực hiện loại trừ nhau vào vùng găng
Các phương pháp thực hiện loại trừ nhau vào vùng găng
Hệ thống có thể dẫn đến tình trạng Deadlock.
Hệ thống có thể dẫn đến tình trạng Deadlock.
Do sử dụng biến dùng chung
Do sử dụng biến dùng chung count count không được thực hiện theo thao không được thực hiện theo thao tác nguyên tử. Kết quả là tín hiệu WAKEUP bị mất khi tiến trình được
tác nguyên tử. Kết quả là tín hiệu WAKEUP bị mất khi tiến trình được
WAKEUP chưa thật sự SLEEP.
WAKEUP chưa thật sự SLEEP.
Cần duy trì một biến đếm cho mỗi tiến trình để đếm tín hiệu
Cần duy trì một biến đếm cho mỗi tiến trình để đếm tín hiệu
WAKEUP được gởi đến từ tiến trình khác . Mỗi khi gọi SLEEP tiến
WAKEUP được gởi đến từ tiến trình khác . Mỗi khi gọi SLEEP tiến
trình kiểm tra biến đếm , nếu biến đếm >0 thì giảm biến đếm xuống 1
trình kiểm tra biến đếm , nếu biến đếm >0 thì giảm biến đếm xuống 1
và tiến trình vẫn không bị blocked.
và tiến trình vẫn không bị blocked.
Đó chính là ý tưởng để xây dựng khái niệm
Đồng bộ hóa tiến trình(tt)
Đồng bộ hóa tiến trình(tt)
Các phương pháp thực hiện loại trừ nhau vào vùng găng
Các phương pháp thực hiện loại trừ nhau vào vùng găng
Semaphore:
Semaphore:
Semaphore là một kiểu nguyên không âm. Một semaphore s =0 chỉ
Semaphore là một kiểu nguyên không âm. Một semaphore s =0 chỉ
ra rằng không tín hiệu WAKEUP nào được gởi đến. Có hai thao tác
ra rằng không tín hiệu WAKEUP nào được gởi đến. Có hai thao tác
nguyê tử trên semaphore được định nghĩa như sau:
nguyê tử trên semaphore được định nghĩa như sau:
DOWN(s) : if (s >0) s=s-1;
DOWN(s) : if (s >0) s=s-1;
else SLEEP();else SLEEP(); UP(s): if ( s >0 ) s=s+1;
UP(s): if ( s >0 ) s=s+1;
else nếu có một hoặc nhiều tiến trình đang bị Blocked else nếu có một hoặc nhiều tiến trình đang bị Blocked
trên semaphore s . Hệ điều hành chọn ngẫu nhiên
trên semaphore s . Hệ điều hành chọn ngẫu nhiên
một tiến trình cho phép thoát khỏi trạng thái
một tiến trình cho phép thoát khỏi trạng thái
Blocked.
Blocked.
ngược lại: không có tiến trình nào Blocked trên s
ngược lại: không có tiến trình nào Blocked trên s
thì: s= s+1 ;
thì: s= s+1 ;
Trong khi đó s vẫn =0.
Đồng bộ hóa tiến trình(tt)
Đồng bộ hóa tiến trình(tt)