Professional Documents
Culture Documents
#Week10-Chapter5.3 2023
#Week10-Chapter5.3 2023
HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
HỆ ĐIỀU HÀNH
CHƯƠNG 5: ĐỒNG BỘ TIẾN TRÌNH (PHẦN 3)
Tr o n g 0 2 p h ầ n t r ư ớ c , t a đ ã t ì m h i ể u v ề n h ữ n g k ỹ t h u ậ t v à c ô n g c ụ đ ể g i ả i q u y ế t v ấ n đ ề v ù n g t r a n h c h ấ p
g i ả i t h u ậ t P e t e r s o n , s e m a p h o r e , m u t e x , m o n i t o r. Tr o n g n ộ i d u n g c u ố i c ù n g c ủ a C h ư ơ n g 5 , t a s ẽ t h ả o l u ậ n
việc áp dụng các kỹ thuật trên vào các bài toán đồng bộ kinh điển như thế nào và những vấn đề có thể
phát sinh khi thực hiện.
Trình bày: …
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
1
MỤC TIÊU
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
2
NỘI DUNG
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
3
BÀI TOÁN ĐỒNG BỘ BOUNDED-BUFFER
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
09. 4
5.9.1. Phát biểu bài toán bounded-buffer
count
5
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
5.9.1. Phát biểu bài toán bounded-buffer
count = n
count = 0
6
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
BÀI TOÁN ĐỒNG BỘ BOUNDED-BUFFER
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
09. 7
5.9.2. Giải pháp cho bài toán bounded-buffer
8
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
5.9.2. Giải pháp cho bài toán bounded-buffer
9
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
5.9.2. Giải pháp cho bài toán bounded-buffer
Producer Consumer
wait(empty); wait(full);
wait(mutex); wait(mutex);
// add to buffer[] // remove from buffer[]
Tài nguyên 2 Tài nguyên 1
count++; count--;
signal(mutex); signal(mutex); full empty
signal(full); signal(empty);
10
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
BÀI TOÁN ĐỒNG BỘ BOUNDED-BUFFER
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
09. 11
5.9.3. Các lỗi thường gặp
Producer Producer
wait(empty); Tài nguyên 2 Tài nguyên 1
while (count < n){
wait(mutex); wait(mutex);
// add to buffer[] // add to buffer[] full empty
count++; count++;
Consumer Consumer
signal(mutex); signal(mutex);
while (count > 0){ wait(full);
signal(full); }
wait(mutex); wait(mutex);
// remove from buffer[] // remove from buffer[]
BUSY WAITING count--; count--;
signal(mutex); signal(mutex);
} signal(empty);
12
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
5.9.3. Các lỗi thường gặp
Producer Producer
wait(empty); Tài nguyên 2 Tài nguyên 1
wait(empty);
wait(mutex); // add to buffer[]
// add to buffer[] count++; full empty
count++; signal(full);
Consumer Consumer
signal(mutex);
wait(full); wait(full);
signal(full);
// remove from buffer[] wait(mutex);
count--; // remove from buffer[]
signal(empty); count--;
DỮ LIỆU
signal(mutex);
KHÔNG NHẤT QUÁN
signal(empty);
13
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
BÀI TOÁN ĐỒNG BỘ READERS-WRITERS
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
10. 14
5.10.1. Phát biểu bài toán Readers-Writers
• Dữ liệu được chia sẻ giữa các tiến trình đang thực thi đồng thời
• Readers: Chỉ đọc dữ liệu; không thực hiện cập nhật
• Writers: Có thể vừa đọc và ghi dữ liệu
R1
W1 W2
R1 R1
15
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
5.10.1. Phát biểu bài toán Readers-Writers
• Dữ liệu được chia sẻ giữa các tiến trình đang thực thi đồng thời
• Readers: Chỉ đọc dữ liệu; không thực hiện cập nhật
• Writers: Có thể vừa đọc vừa ghi dữ liệu
• Vấn đề:
• Cho phép nhiều Readers cùng đọc dữ liệu đồng thời
• Chỉ một Writers được phép truy cập dữ liệu tại một thời điểm
R1
W1
R1 R1
16
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
5.10.1. Phát biểu bài toán Readers-Writers
Các biến thể của bài toán Readers - Writers
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
10. 18
5.10.2. Giải pháp cho bài toán Readers-Writers
Reader Writer
// đọc dữ liệu // cập nhật dữ liệu
19
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
5.10.2. Giải pháp cho bài toán Readers-Writers
Reader Writer
wait(mutex); wait(rw_mutex);
read_count++; ...
if (read_count == 1) /* first reader */ /* cập nhật dữ liệu */
wait(rw_mutex); ...
signal(mutex); signal(rw_mutex);
...
/* đọc dữ liệu */
• Nếu một Writer đang ở trong CS và có n Readers
...
đang đợi thì một Reader được xếp trong hàng đợi của
wait(mutex);
rw_mutex và n − 1 Reader kia trong hàng đợi của
read_count--;
if (read_count == 0) /* last reader */ mutex.
signal(rw_mutex); • Khi Writer thực thi signal(rw_mutex), hệ thống có
signal(mutex); thể phục hồi thực thi của một trong các Reader đang
đợi hoặc Writer đang đợi.
20
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
BÀI TOÁN ĐỒNG BỘ DINING-PHILOSOPHER
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
11. 21
5.11.1. Phát biểu bài toán Dining-Philosopher
• Có n Triết gia ngồi trên một chiếc bàn tròn với tô cơm ở giữa
22
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
5.11.1. Phát biểu bài toán Dining-Philosopher
23
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
BÀI TOÁN ĐỒNG BỘ DINING-PHILOSOPHER
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
11. 24
5.11.2. Giải pháp cho bài toán Dining-Philosopher
25
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
5.11.2. Giải pháp cho bài toán Dining-Philosopher
26
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
5.11.2. Giải pháp cho bài toán Dining-Philosopher
• Một số giải pháp có thể tránh deadlock:
• Cho phép tối đa 4 Triết gia ngồi vào bàn
• Chỉ cho phép Triết gia cầm đũa khi cả 2 chiếc đũa đã sẵn sàng Cần
phải thực hiện hành động cầm đũa trong CS
• Giải pháp bất đối xứng: Triết gia ngồi vị trí lẻ cầm đũa bên trái trước, rồi
sau đó cầm đũa bên phải; trong khi Triết gia ngồi vị trí chẵn cầm đũa
bên phải trước, rồi sau đó cầm đũa bên trái.
• Cần phải lưu ý tình trạng Starvation vẫn có thể xảy ra
27
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
5.11.2. Giải pháp cho bài toán Dining-Philosopher
• Triết gia chỉ có thể cầm đũa khi cả 2 chiếc đã sẵn sàng
• Khai báo kiểu dữ liệu
0 1
1
• enum {THINKING; HUNGRY, EATING} state [5];
• Triết gia thứ i chỉ có thể đặt trạng thái state[i] = EATING khi cả 2
0 2
người kế bên đang không ăn
• (state[(i+4)%5)] != EATING)
&& 4 2
(state[(i+1)%5)] != EATING) 4 3
• Khai báo condition self[5]: cho phép Triết gia thứ i tự trì hoãn
khi mình bị đói nhưng không thể cầm đũa
3
28
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
5.11.2. Giải pháp cho bài toán Dining-Philosopher
0 1
1
4 2
4 3
Khai báo monitor:
3
monitor DiningPhilosophers
{ ...
enum {THINKING; HUNGRY, EATING} state [5]; void test(int i) {
condition self [5]; if ((state[(i + 4) % 5] != EATING) &&
void pickup (int i) { (state[i] == HUNGRY) &&
state[i] = HUNGRY; (state[(i + 1) % 5] != EATING)) {
test(i); state[i] = EATING;
if (state[i] != EATING) self[i].wait; self[i].signal();
} }
void putdown (int i) { }
state[i] = THINKING; initialization code() {
test((i + 4) % 5); for (int i = 0; i < 5; i++)
test((i + 1) % 5); state[i] = THINKING;
} }
... }
29
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
5.11.2. Giải pháp cho bài toán Dining-Philosopher
30
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
HỆ ĐIỀU HÀNH
CHƯƠNG 5: ĐỒNG BỘ TIẾN TRÌNH (PHẦN 3)
Tr o n g 0 2 p h ầ n t r ư ớ c , t a đ ã t ì m h i ể u v ề n h ữ n g k ỹ t h u ậ t v à c ô n g c ụ đ ể g i ả i q u y ế t v ấ n đ ề v ù n g t r a n h c h ấ p
g i ả i t h u ậ t P e t e r s o n , s e m a p h o r e , m u t e x , m o n i t o r. Tr o n g n ộ i d u n g c u ố i c ù n g c ủ a C h ư ơ n g 5 , t a s ẽ t h ả o l u ậ n
việc áp dụng các kỹ thuật trên vào các bài toán đồng bộ kinh điển như thế nào và những vấn đề có thể
phát sinh khi thực hiện.
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
31