You are on page 1of 31

ĐẠ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.

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

1. Giải thích được bài toán đồng bộ bounded-buffer


2. Giải thích được bài toán đồng bộ readers-writers
3. Giải thích được bài toán đồng bộ dining-
philosophers
4. Phân tích các vấn đề thường gặp khi thực hiện
đồng bộ tiến trình/tiểu trình

Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
2
NỘI DUNG

9. Bài toán đồng bộ bounded-buffer


10.Bài toán đồng bộ readers-writers
11. Bài toán đồng bộ dining-philosophers

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

5.9.1. Phát biểu bài toán bounded-buffer


Bài to án b o u nd ed -b u ffer ( đ ã đ ược đ ề cậ p tr o n g p h ần 5 . 1 ) m ô tả m ộ t m ả n g c ó g iới h ạn số p h ần từ v à 0 2 tiến tr ìn h
lần lượt là Pro d u cer v à Con su m er có n h iệ m v ụ đ ồ n g th ờ i g h i v à x ó a p h ầ n tử r a k h ỏi m ảng .

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

• Một mảng buffer[] có tối đa n phần tử


Số lượng phần tử trong mảng là count

• Tiến trình Producer thêm phần tử vào mảng

Thêm phần tử vào mảng

• Tiến trình Consumer xóa phần tử khỏi mảng

Xóa phẩn tử khỏi mảng

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

• Tiến trình Producer thêm phần tử vào mảng


 Không thể thêm khi mảng đã đầy
Không thể thêm tiếp

count = 0

• Tiến trình Consumer xóa phần tử khỏi mảng


 Không thể xóa khi mảng đang rỗng
Không thể xóa tiếp

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

5.9.2. Giải pháp cho bài toán bounded-buffer


Để giải qu y ết b ài to án b o u n d e d – b u ff er, ta c ầ n x á c đ ịn h đ ú n g đ iề u k iện v à áp d ụn g sem ap ho r e đ ể đồ n g b ộ ch o các
đ iều kiện n ày.

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

• Bước 1: Dựa vào điều kiện, xác định tài


nguyên: Tài nguyên 2 Tài nguyên 1

• Không thể thêm khi mảng đã đầy


Producer
 Tài nguyên 1: số vị trí có thể thêm
// add to buffer[]
• Không thể xóa khi mảng đang rỗng count++;

 Tài nguyên 2: số vị trí có thể xóa


Consumer
• Vùng tranh chấp: mảng buffer và count // remove from buffer[]
 Bảo vệ vùng tranh chấp  mutual exclusion count--;

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

• Bước 2: Xác định số lượng semaphore


• Tài nguyên 1: số vị trí có thể thêm
Tài nguyên 2 Tài nguyên 1

 semaphore empty: khởi tạo là n


full empty
• Tài nguyên 2: số vị trí có thể xóa
 semaphore full: khởi tạo là 0
• Bảo vệ vùng tranh chấp  mutual exclusion
 semaphore mutex: khởi tạo là 1
trạng thái ban đầu mảng rỗng:
empty = n;
full = 0;

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

• Bước 3: Đặt wait() và signal()

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

5.9.3. Các lỗi thường gặp


Mộ t v ấn đ ề th ườn g thấy k h i ch ưa h iể u r õ cá c cô n g cụ đ ồ n g b ộ đ ó là n g ười lậ p trìn h th ườn g cố g ắn g sử dụ n g while
h o ặc if để đ ồ ng b ộ . Một số k h ác k h i p h â n tíc h b à i to á n lạ i b ỏ q u ê n v ù n g tr a n h ch ấp d ẫn đ ến việc đ ồ ng b ộ kh ô n g
đ ảm bảo lo ại tr ừ tươn g hỗ .

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

Sử dụng hàm while hoặc if

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

Bỏ qua vùng tranh chấ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

5.10.1. Phát biểu bài toán Readers-Writers


Giả sử tồ n tại m ộ t cơ sở dữ liệu đ ược c h ia sẻ g iữa n h ữn g tiến tr ìn h đ an g th ực th i đ ồ n g th ời. Mộ t số tiến tr ìn h ch ỉ
m u ố n đ ọ c dữ liệu tr o ng k h i m ộ t số k h á c m u ố n cậ p n h ậ t ( v ừa đ ọ c v à g h i) v à o cơ sở d ữ liệu n ày. Các tiến tr ìn h ch ỉ
m u ố n đ ọ c dữ liệu đ ược g ọ i là Rea d e rs v à c á c tiến tr ìn h m u ố n c ậ p n h ậ t đ ược g ọ i là 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

Biến thể 1 Biến thể 2


(The First Readers – Writers Problem) (The Second Readers – Writers Problem)

• Ưu tiên Readers. • Ưu tiên Writers.


• Các Readers có thể đọc đồng thời cùng • Khi một Writers đã sẵn sàng thì Writers này
nhau. sẽ được thực thi càng sớm càng tốt.
• Khi một Readers đang đọc, không có • Nếu một Writers đang chờ để truy cập dữ
Readers nào phải chờ chỉ vì có một Writers liệu, không có một Readers mới nào được
đang chờ trước nó. phép thực thi.
 Writers có thể bị starvation  Readers có thể bị starvation
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
17
BÀI TOÁN ĐỒNG BỘ READERS-WRITERS

5.10.2. Giải pháp cho bài toán Readers-Writers


Việc 2 Read ers cù n g tru y cậ p v à đ ọ c d ữ liệ u đ ược ch ia sẻ k h ô n g g ây r a v ấ n đ ề gì đến tín h n h ất q u án củ a d ữ liệu
v à tín h đú n g đắn củ a ch ươn g tr ìn h . Tu y n h iê n , k h i c ó m ộ t Wr ite r s cù n g v ới m ộ t v ài tiến tr ìn h k hác (b ất k ể
Read ers h ay Writers k h ác) tr u y c ập đ ồ n g th ờ i v ào d ữ liệ u đ ược c h ia sẻ th ì d ữ liệu sẽ b ị ản h hưởn g . Giải p háp ch o
b ài to án Read ers – Wr iter s c ần p h ải d ựa v à o đ ộ ưu tiê n g iữa Re a d e r s v à Wr iter s, đ ồ ng thời đ ảm b ảo được tín h lo ại
tr ừ tươn g h ỗ k h i m ộ t Writer tr u y c ậ p d ữ liệ u .

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

Biến thể 1 – Ưu tiên Readers

Reader Writer
// đọc dữ liệu // cập nhật dữ liệu

• Các dữ liệu được chia sẻ:


• Cơ sở dữ liệu/Biến/Mảng/...
• semaphore rw_mutex: khởi tạo là 1 // bảo vệ cơ sở dữ liệu
• semaphore mutex: khởi tạo là 1 // bảo vệ read_count
• Biến read_count: khởi tạo là 0 // đếm số Readers
// được chia sẻ giữa các Readers

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

Biến thể 1 – Ưu tiên Readers

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

5.11.1. Phát biểu bài toán Dining-Philosopher


Bài to án Dinin g- Philo so p h er h ay c ò n g ọ i là Bài to án Cá c Tr iết g ia ă n tố i đ ượ c x em là bài to án đ ồn g b ộ k inh đ iển
k h ôn g p h ải b ởi v ì tính q u an tr ọ n g tr o n g th ực h à n h h a y b ở i c ác n h à k h o a h ọ c m áy tín h k hô n g th ích các Tr iết g ia
m à b ởi v ì đ ây là m ộ t v í d ụ c h o c ác v ấn đ ề đ ồ n g b ộ tr ên q u y m ô lớn . Bà i to á n n ày cho th ấy sự k h ó k hăn kh i ph ải
cấp p h át các tài ng u y ên g iữa c á c tiến tr ìn h sa o ch o k h ô n g b ị d ea d lo ck v à sta r v ation .

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

• Họ dành thời gian chỉ để làm 2 công việc: suy nghĩ và ăn


• Họ không tương tác với những người bên cạnh
• Thi thoảng các Triết gia sẽ cầm lên 2 chiếc đũa (mỗi chiếc 1 lần) để ăn
• Cần phải có đủ 2 chiếc đũa thì mới ăn được, sau khi ăn xong thì trả lại 2 chiếc đũa
• Số chiếc đũa cũng là n

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

• Trường hợp có 5 Triết gia, dữ liệu được chia sẻ như sau:


• Tô cơm (dữ liệu)
• Mảng semaphore chopstick[5]: tất cả khởi tạo là 1 // 5 chiếc đũa

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

5.11.2. Giải pháp cho bài toán Dining-Philosopher


Bài to án Dinin g- Philo so p h er h ay c ò n g ọ i là Bài to án Cá c Tr iết g ia ă n tố i đ ượ c x em là bài to án đ ồn g b ộ k inh đ iển
k h ôn g p h ải b ởi v ì tính q u an tr ọ n g tr o n g th ực h à n h h a y b ở i c ác n h à k h o a h ọ c m áy tín h k hô n g th ích các Tr iết g ia
m à b ởi v ì đ ây là m ộ t v í d ụ c h o c ác v ấn đ ề đ ồ n g b ộ tr ên q u y m ô lớn . Bà i to á n n ày cho th ấy sự k h ó k hăn kh i ph ải
cấp p h át các tài ng u y ên g iữa c á c tiến tr ìn h sa o ch o k h ô n g b ị d ea d lo ck v à sta r v ation .

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

Giải pháp sử dụng semaphore

Triết gia thứ i:


wait (chopstick[i] ); // chờ đũa bên trái 0 1
1
wait (chopstick[ (i + 1) % 5] ); // chờ đũa bên phải
...
/* eat for awhile */ 0 2
...
signal (chopstick[i] ); // trả đũa bên trái
4 2
signal (chopstick[ (i + 1) % 5] ); // trả đũa bên phải
... 4 3
/* think for awhile */
... 3

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

Giải pháp sử dụng semaphore

Triết gia thứ i:


wait (chopstick[i] ); 0 1
Nếu tất cả Triết gia 1
wait (chopstick[ (i + 1) % 5] ); đồng thời cầm đũa
... bên trái
/* eat for awhile */ 0 2
... DEADLOCK
signal (chopstick[i] );
4 2
signal (chopstick[ (i + 1) % 5] );
... 4 3
/* think for awhile */
... 3

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

Giải pháp sử dụng monitor

• 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

Giải pháp sử dụng monitor 0 2

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

Giải pháp sử dụng monitor

Triết gia thứ i:


dp.pickup(i); 0 1
1
// ăn
dp.putdown(i);
0 2
• Giải thuật không bao giờ bị deadlock
4 2
• Tuy nhiên, vẫn có thể xảy ra starvation
4 3

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.

ThS. Trần Hoàng Lộc

Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
31

You might also like