You are on page 1of 32

ĐẠ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)
T r 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
giải thuật Peterson, semaphore, mutex, monitor. Trong nội dung cuối cùng của Chương 5, ta sẽ thảo luậ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 f f e r ( đ ã đ ượ c đ ề c ập tro 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à P r o d ucer và Co nsume r có nhiệm vụ đ ồ ng thời ghi và xó a p hần tử r a khỏ 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 q u yế t b ài to á n b o u nd ed – b u ffe r, t a c ầ n x á c đ ị n h đ ú n g đ i ề u k iệ n v à áp d ụ n g s e ma p ho r e đ ể đ ồ n g b ộ c ho 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 đ ề t hườ n g t h ấ y k hi c hư a hi ể u r õ c á c cô n g c ụ đ ồ n g b ộ đ ó l à n g ư ời l ập t rì n h t hư ờ n g cố g ắ n g sử d ụ n g wh i le
ho ặ c i f đ ể đ ồ n g 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 c h ấp d ẫ n đ ế n v i ệ c đ ồ n g b ộ k hô n g
đ ảm b ảo lo ại tr ừ tương 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 i a s ẻ gi ữa n hữ n g ti ế n tr ì n h đ a n g t hự c t hi đ ồ n g t hời . M ộ t số ti ế n tr ì n h c hỉ
mu ố n đ ọ c d ữ li ệ u t r o n g k hi mộ t số k há c mu ố n c ập n h ật ( vừ a đ ọ c v à g h i ) v ào cơ sở d ữ li ệ u n à y. C á c t i ế n t rì n h c h ỉ
muố n đ ọ c d ữ liệu đ ược gọ i là Rea d ers và các tiến trình muố n cập nhậ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ừa 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
nhau. này 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 liệu, không có một Readers mới nào được
Writers đ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 R e ad er s c ù n g t r u y c ập v à đ ọ c d ữ l iệ u đ ư ợc c hi a 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 ữ l iệ u
v à t í n h đ ú n g đ ắ n c ủ a c hươ n g trì n h . T u y n h i ê n , k h i có mộ t W rit er s c ù n g vớ i mộ t v à i ti ế n tr ìn h k há c (b ất k ể
Re ad er s h a y W r it er s k h á c) t r u y c ập đ ồ n g t hời v à o d ữ liệ u đ ượ c c h i a s ẻ t hì d ữ li ệ u s ẽ b ị ả n h hưở n g. Gi ải p h áp c ho
b ài to á n R e ad er s – W r it er s c ầ n p h ải d ự a v ào đ ộ ưu ti ê n giữ a R ead e rs v à W rit e rs , đ ồ n g t hời đ ả m b ảo đ ượ c t í n h lo ại
tr ừ tương hỗ khi mộ t W r iter truy 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--;
mutex.
if (read_count == 0) /* last reader */
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 Di ni n g -P hilo so p h er h a y cò n gọ i là B ài to á n Cá c T ri ế t gi a ă n tố i đ ược x e m l à b ài to á n đ ồ n g b ộ ki n h đ i ể n
k hô n g p h ải b ởi v ì t í n h q u a n t rọ n g tro n g t hự 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í c h cá c T riế t gi a
mà b ởi vì đ â y l à mộ t ví d ụ c ho c á c v ấ n đ ề đ ồ n g b ộ t rê n q u y mô lớ n. B ài to á n n à y c ho t h ấ y sự k hó k h ă n k hi p h ải
cấp p hát các tài nguyê n giữa các tiến trình sao cho khô ng b ị d ead lo ck và starvatio n .

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 Di ni n g -P hilo so p h er h a y cò n gọ i là B ài to á n Cá c T ri ế t gi a ă n tố i đ ược x e m l à b ài to á n đ ồ n g b ộ ki n h đ i ể n
k hô n g p h ải b ởi v ì t í n h q u a n t rọ n g tro n g t hự 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í c h cá c T riế t gi a
mà b ởi vì đ â y l à mộ t ví d ụ c ho c á c v ấ n đ ề đ ồ n g b ộ t rê n q u y mô lớ n. B ài to á n n à y c ho t h ấ y sự k hó k h ă n k hi p h ải
cấp p hát các tài nguyê n giữa các tiến trình sao cho khô ng b ị d ead lo ck và starvatio n .

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
0 2
DEADLOCK
signal (chopstick[i] );
4 2
signal (chopstick[ (i + 1) % 5] );
4 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
enum {THINKING; HUNGRY, EATING} state [5]; 0 1
1
• Triết gia thứ i chỉ có thể đặt trạng thái state[i] = EATING
khi cả 2 người kế bên đang không ăn
0 2
(state[(i+4)%5)] != EATING)
&&
(state[(i+1)%5)] != EATING) 4 2
• Khai báo condition self[5]: cho phép Triết gia thứ i tự 4 3
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
Tóm tắt lại nội dung buổi học
• Bài toán đồng bộ bounded-buffer
• Bài toán đồng bộ readers-writers
• Bài toán đồng bộ dining-philosophers

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

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

You might also like