Professional Documents
Culture Documents
He-Dieu-Hanh - Duynn - Chuong-3 - Quan-Ly-Tien-Trinh - 2 - (Cuuduongthancong - Com)
He-Dieu-Hanh - Duynn - Chuong-3 - Quan-Ly-Tien-Trinh - 2 - (Cuuduongthancong - Com)
.c
ng
co
Chương 3
an
th
ng
QUẢN LÝ TIẾN TRÌNH
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1
Nội dung chương 3
om
1. Khái niệm về tiến trình (process).
.c
ng
2. Tiểu trình (thread).
co
3. Điều phối tiến trình.
an
4. Đồng bộ tiến trình. th
o ng
5. Tình trạng tắc nghẽn (deadlock)
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt 2
Đồng bộ tiến trình
om
Liên lạc giữa các tiến trình
.c
Mục đích:
ng
co
Để chia sẻ thông tin như dùng chung file, bộ nhớ,…
an
Hoặc hợp tác hoàn thành công việc
Các cơ chế:
th
ng
Liên lạc bằng tín hiệu (Signal)
o
du
om
Liên lạc bằng tín hiệu (Signal)
.c
Tín hiệu được gởi đi
bởi:
ng
- Phần cứng
co
Tín hiệu Mô tả
- Hệ điều hành:
an
SIGINT Người dùng nhấn phím Ctl-C để ngắt - Tiến trình:
th
xử lý tiến trình ng - Người sử dụng:
SIGILL Tiến trình xử lý một chỉ thị bất hợp lệ
o
Khi tiến trình nhận
du
SIGSEG Tiến trình truy xuất đến một địa chỉ bất hiệu.
V hợp lệ - Xử lý theo cách
riêng của tiến trình.
SIGCLD Tiến trình con kết thúc - Bỏ qua tín hiệu.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Liên lạc bằng đường ống (Pipe)
.c
ng
co
an
th
ng
Dữ liệu truyền: dòng các byte (FIFO)
o
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Liên lạc qua vùng nhớ chia sẻ (shared memory)
.c
Vùng nhớ chia sẻ độc lập với các tiến trình
ng
Tiến trình phải gắn kết vùng nhớ chung vào không
co
gian địa chỉ riêng của tiến trình
an
th
o ng
du
u
om
Liên lạc bằng thông điệp (Message)
.c
Thiết lập một mối liên kết giữa hai tiến trình
ng
Sử dụng các hàm send, receive do hệ điều hành
co
cung cấp để trao đổi thông điệp
an
Cách liên lạc bằng thông điệp:
th
Liên lạc gián tiếp (indirect communication)
ng
- Send(A, message): gởi thông điệp tới port A
o
du
om
Ví dụ: Bài toán nhà sản xuất - người tiêu thụ
.c
(producer-consumer)
ng
co
void nsx()
an
{ while(1)
th
{ tạo_sp();
ng
send(ntt,sp); //gởi sp cho ntt }}
o
du
void ntt()
u
cu
{ while(1)
{ receive(nsx,sp); //ntt chờ nhận sp
tiêu_thụ(sp); }}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
Liên lạc qua socket
om
.c
Mỗi tiến trình cần tạo một socket riêng
ng
Mỗi socket được kết buộc với một cổng khác nhau.
co
Các thao tác đọc/ghi lên socket chính là sự trao đổi
an
dữ liệu giữa hai tiến trình.
Cách liên lạc qua socket:
th
ng
Liên lạc kiểu thư tín (socket đóng vai trò bưu cục)
o
du
nhận”
- “tiến trình nhận” sẽ nhận dữ liệu bằng cách đọc dữ
liệu từ socket của “tiến trình nhận”
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
Liên lạc qua socket
om
.c
Cách liên lạc qua socket (tt):
ng
Liên lạc kiểu điện thoại (socket đóng vai trò tổng
co
đài)
an
- Hai tiến trình cần kết nối trước khi truyền/nhận dữ
th
ng
liệu và kết nối được duy trì suốt quá trình truyền
o
nhận dữ liệu
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Bảo đảm các tiến trình xử lý song song không tác động
.c
sai lệch đến nhau.
ng
Yêu cầu độc quyền truy xuất (Mutual exclusion): tại
co
một thời điểm, chỉ có một tiến trình được quyền truy
an
xuất một tài nguyên không thể chia sẻ.
th
Yêu cầu phối hợp (Synchronization): các tiến trình cần
o ng
hợp tác với nhau để hoàn thành công việc.
du
bài toán “độc quyền truy xuất” (“bài toán miền găng”)
bài toán “phối hợp thực hiện”.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Miền găng (critical section)
.c
Đoạn mã của một tiến trình có khả năng xảy ra lỗi khi
ng
truy xuất tài nguyên dùng chung (biến, tập tin,…).
co
Ví dụ:
an
if (taikhoan >= tienrut) taikhoan = taikhoan - tienrut;
th
else Thong bao “khong the rut tien ! “;
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Các điều kiện cần khi giải quyết bài toán miền găng
.c
1. Không có giả thiết về tốc độ của các tiến trình, cũng
ng
như về số lượng bộ xử lý.
co
2. Không có hai tiến trình cùng ở trong miền găng
an
th
cùng lúc. ng
3. Một tiến trình bên ngoài miền găng không được
o
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Các nhóm giải pháp đồng bộ
.c
Busy Waiting
ng
Sleep And Wakeup
co
an
Semaphore
Monitor
th
ng
Message.
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Busy Waiting (bận thì đợi)
.c
Giải pháp phần mềm
ng
Thuật toán sử dụng biến cờ hiệu
co
an
Thuật toán sử dụng biến luân phiên
th
Thuật toán Peterson
ng
Giải pháp phần cứng
o
du
Cấm ngắt
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Thuật toán sử dụng biến cờ hiệu (dùng cho nhiều
.c
tiến trình)
ng
lock=0 là không có tiến trình trong miền găng.
co
lock=1 là có một tiến trình trong miền găng.
an
lock=0;
while (1)
th Vi phạm : “Hai
ng
{ tiến trình có thể
o
du
om
Thuật toán sử dụng biến luân phiên (dùng cho 2 tiến trình)
.c
Hai tiến trình A, B sử dụng chung biến turn:
ng
turn = 0, tiến trình A được vào miền găng
co
turn=1 thì B được vào miền găng
an
// tiến trình A turn=0 thi A // tiến trình B
turn=1 thi B
th
while (1) { duoc vao while (1) {
duoc vao
while (turn == 1); while (turn == 0);
ng
mien gang mien gang
critical-section (); critical-section ();
o
turn = 1; turn = 0;
du
} }
cu
- Hai tiến trình chắc chắn không thể vào miền găng cùng lúc, vì
tại một thời điểm turn chỉ có một gía trị.
- Vi phạm: một tiến trình có thể bị ngăn chặn vào miền găng bởi
một tiến trình khác không ở trong miền găng.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Thuật toán Peterson (dùng cho 2 tiến trình)
.c
Dùng chung hai biến turn và flag[2] (kiểu int).
ng
flag[0]=flag[1]=FALSE
co
turn được khởi động là 0 hay 1.
an
Nếu flag[i] = TRUE (i=0,1) -> Pi muốn vào miền găng và turn=i là
th
đến lượt Pi. ng
Để có thể vào được miền găng:
o
Pi đặt trị flag[i]=TRUE để thông báo nó muốn vào miền găng.
du
Nếu tiến trình Pj không quan tâm đến việc vào miền găng (flag[j] =
FALSE), thì Pi có thể vào miền găng
Nếu flag [j]=TRUE thì Pi phải chờ đến khi flag [j]=FALSE.
Khi tiến trình Pi ra khỏi miền găng, nó đặt lại trị flag[i] là FALSE.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Thuật toán Peterson (đoạn code)
.c
// tiến trình P0 (i=0) // tiến trình P1 (i=1)
ng
while (TRUE) while (TRUE)
co
{ {
an
flag [0]= TRUE; //P0 muốn vào flag [1]= TRUE; //P1 muon vao
th
//miền găng ng //miền găng
turn = 1; //thu de nghi P1 vao turn = 0; //thử de nghi P0 vao
o
while (turn==1 && while (turn == 0 && flag
du
critical_section(); critical_section();
flag [0] = FALSE; //P0 ra ngoài mg flag [1] = FALSE;//P1 ra ngoài mg
noncritical_section (); Noncritical_section ();
} }
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Cấm ngắt
.c
Tiến trình cấm tất cả các ngắt trước khi vào
ng
miền găng, và phục hồi ngắt khi ra khỏi miền
co
găng.
an
Không an toàn cho hệ thống
th
ng
Không tác dụng trên hệ thống có nhiều bộ xử
o
du
lý
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Sử dụng lệnh TSL (Test and Set Lock)
.c
boolean Test_And_Set_Lock (boolean lock){
ng
boolean temp=lock;
Lệnh TSL cho phép
co
lock = TRUE;
kiểm tra và cập nhật một
an
return temp; //trả về giá trị ban đầu của
vùng nhớ trong một
th
//biến lock
thao tác độc quyền.
ng
}
o
du
while (Test_And_Set_Lock(lock));
critical_section ();
lock = FALSE;
noncritical_section ();
} CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Nhóm giải pháp “SLEEP and WAKEUP “ (ngủ và
.c
đánh thức)
ng
co
1. Sử dụng lệnh SLEEP VÀ WAKEUP
an
2. Sử dụng cấu trúc Semaphore
3. Sử dụng cấu trúc Monitors
th
o ng
4. Sử dụng thông điệp
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Sử dụng lệnh SLEEP VÀ WAKEUP
.c
SLEEP “danh sách sẵn sàng”, lấy lại CPU cấp cho
ng
P khác.
co
WAKEUP HĐH chọn một P trong ready list, cho
an
th
thực hiện tiếp. ng
P chưa đủ điều kiện vào miền găng gọi SLEEP để
o
om
Sử dụng lệnh SLEEP VÀ WAKEUP
.c
int busy=FALSE; // TRUE là có tiến trình trong miền găng, FALSE là không có
ng
int blocked=0; // đếm số lượng tiến trình đang bị khóa
co
while(TRUE){
if (busy) {
an
blocked = blocked + 1;
th
sleep(); ng
}else busy = TRUE;
o
critical-section ();
du
busy = FALSE;
u
if (blocked>0){
cu
om
Sử dụng cấu trúc Semaphore
.c
Biến semaphore s có các thuộc tính:
ng
Một giá trị nguyên dương e;
co
Một hàng đợi f : lưu danh sách các tiến trình đang
an
chờ trên semaphore s.
Hai thao tác trên semaphore s:
th
ng
Down(s): e=e-1.
o
du
Up(s): e=e+1.
- Nếu e<=0 thì chọn một tiến trình trong f cho tiếp
tục thực hiện (đánh thức).
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Sử dụng cấu trúc Semaphore
.c
Down(s) { P là tiến trình thực hiện thao tác Down(s) hay Up(s)
ng
e = e - 1;
co
if(e < 0) {
status(P)= blocked; //khóa P (trạng thái chờ)
an
enter(P,f); //cho P vào hàng đợi f
th
} ng
}
o
Up(s){
du
e = e + 1;
u
if(e<= 0 ){
cu
om
Sử dụng cấu trúc Semaphore
.c
Hệ điều hành cần cài đặt các thao tác Down, Up là
ng
độc quyền.
co
Cấu trúc của semaphore:
an
class semaphore{
int e; th
ng
PCB * f; //ds riêng của semaphore
o
du
public:
u
cu
down();
up();
};
|e| = số tiến trình đang chờ trên f.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Giải quyết bài toán miền găng bằng Semaphores
.c
Dùng một semaphore s, e được khởi gán là 1.
ng
Tất cả các tiến trình áp dụng cùng cấu trúc chương trình sau:
co
an
th
semaphore s=1; //nghĩa là e của s=1
ng
while (1)
o
du
{
u
Down(s);
cu
critical-section ();
Up(s);
Noncritical-section ();
} CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Giải quyết bài toán đồng bộ bằng Semaphores
.c
Hai tiến trình đồng hành P1 và P2, P1 thực hiện công việc 1, P2
ng
thực hiện công việc 2.
co
Cv1 làm trước rồi mới làm cv2, cho P1 và P2 dùng chung một
an
semaphore s, khởi gán e(s)= 0:
th
semaphore s=0; //dùng chung cho hai tiến trình
ng
P1:{
o
job1();
du
}
cu
P2:{
Down(s); // chờ P1 đánh thức
job2();
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Vấn đề khi sử dụng semaphore
.c
Tiến trình quên gọi Up(s), và kết quả là khi ra khỏi
ng
miền găng nó sẽ không cho tiến trình khác vào
co
miền găng!
an
th
e(s)=1; ng
while (1)
o
{
du
Down(s);
u
cu
critical-section ();
Noncritical-section ();
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Vấn đề khi sử dụng semaphore
.c
Sử dụng semaphore có thể gây ra tình trạng tắc nghẽn.
ng
co
P1:
{
Hai tiến trình P1, P2 sử dụng
an
down(s1); down(s2); chung 2 semaphore s1=s2=1
….
th
ng
up(s1); up(s2);
o
du
}
Nếu thứ tự thực hiện như sau:
P2:
u
{
down(s2); down(s1); P1: down(s2), P2: down(s1)
…. Khi đó s1=s2=-1 nên P1,P2 đều
up(s2); up(s1); chờ mãi
} CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Sử dụng cấu trúc Monitors
.c
Hoare(1974) và Brinch & Hansen (1975) đã đề nghị một cơ
ng
chế cao hơn gọil à monitor được cung cấp bởi 1 số ngôn
co
ngữ lập trình
an
Monitor là một cấu trúc đặc biệt (lớp)
th
các phương thức độc quyền (critical-section)
ng
các biến (được dùng chung cho các tiến trình)
o
- Các biến trong monitor chỉ có thể được truy xuất bởi các
du
Tại một thời điểm, chỉ có một tiến trình duy nhất được
cu
om
Sử dụng cấu trúc Monitors
.c
Wait(c): chuyển trạng thái tiến trình gọi sang chờ (blocked)
ng
Wait(c)
và đặt tiến trình này vào hàng đợi trên biến điều kiện c.
co
{
status(P)= blocked; //chuyển P sang trạng thái chờ
an
enter(P,f(c)); //đặt P vào hàng đợi f(c) của biến điều kiện c
}
th
ng
Signal(c): khi có một tiến trình đang chờ trong hàng đợi c,
Signal(c)
o
kích hoạt tiến trình đó và tiến trình gọi sẽ rời khỏi monitor.
du
{
if (f(c) != NULL){
u
cu
om
Sử dụng cấu trúc Monitors
.c
monitor <tên monitor > //khai báo monitor
ng
dùng chung cho các tiến trình
co
{
<cac bien dung chung>;
an
<các biến điều kiện>;
th
ng <cac phuong thuc độc quyền>;
}
o
//tiến trình Pi:
du
{
cu
Noncritical-section ();
<ten monitor>.Phươngthức_i; //thực
hiện công việc độc quyền thứ i
critical-section Noncritical-section ();
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Sử dụng cấu trúc Monitors
.c
Nguy cơ thực hiện đồng bộ hóa sai giảm rất nhiều.
ng
co
Ít có ngôn ngữ hỗ trợ cấu trúc monitor.
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Monitors và Bài toán 5 triết gia ăn tối
.c
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Monitors và Bài toán 5 triết gia ăn tối
.c
monitor philosopher{
ng
enum {thinking, hungry, eating} state[5]; // các biến dùng chung
co
//cho các triết gia
an
condition self[5]; //các biến điều kiện dừng để đồng bộ việc ăn tối
th
ng
//cac pt doc quyen (cac mien gang), viec doc quyen do nnlt ho
o
tro.
du
void test(int i); //dùng kiểm tra điều kiện trước khi triết gia thứ i ăn
void pickup(int i); //phương thức lấy đũa
void putdown(int i); //phương thức trả đũa
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Monitors và Bài toán 5 triết gia ăn tối
.c
void philosopher() //phương thức khởi tạo (constructor)
ng
{ //gán trạng thái ban đầu cho các triết gia là "đang suy nghĩ"
co
for (int i = 0; i < 5; i++) state[i] = thinking;
an
}
th
void test(int i) { //nếu tg_i đói và các tg bên trái, bên phải không đang
ng
//ăn thì cho tg_i ăn
o
if ( (state[i] == hungry) && (state[(i + 4) % 5] != eating) &&(state[(i
du
+ 1) % 5] != eating)) {
u
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đồng bộ tiến trình
om
Monitors và Bài toán 5 triết gia ăn tối
.c
ng
void pickup(int i)
co
{
state[i] = hungry; //ghi nhận tg_i đói
an
test(i); //kiểm tra đk trước khi cho tg_i ăn
th
if (state[i] != eating) self[i].wait(); //doi tai nguyen
ng
}
o
du
void putdown(int i)
{
u
cu
om
Monitors và Bài toán 5 triết gia ăn tối
.c
// Cấu trúc tiến trình Pi thực hiện viec ăn của triết gia thứ i
ng
philosopher pp; //bien monitor dung chung
co
an
Pi:
th
while(1) { ng
Noncritical-section();
o
du
om
Sử dụng thông điệp
.c
Một tiến trình kiểm soát việc sử dụng tài nguyên và
ng
nhiều tiến trình khác yêu cầu tài nguyên.
co
an
while (1) {
th
Send(process controler, request message); //gởi thông điệp cần tài nguyên
ng
//và chuyển sang blocked
o
Receive(process controler, accept message); //nhận thông điệp
du
Noncritical-section();
}
Trong những hệ thống phân tán, cơ chế trao đổi thông điệp sẽ
đơn giản hơn và được dùng để giải quyết bài toán đồng bộ hóa.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Một tập hợp các tiến trình gọi là ở tình trạng tắc nghẽn
.c
nếu mỗi tiến trình trong tập hợp đều chờ đợi tài nguyên
ng
mà tiến trình khác trong tập hợp đang chiếm giữ.
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Điều kiện xuất hiện tắc nghẽn
.c
ng
1. Điều kiện 1: Có sử dụng tài nguyên không thể chia
co
sẻ.
an
2. Điều kiện 2: Sự chiếm giữ và yêu cầu thêm tài
nguyên không thể chia sẻ. th
o ng
3. Điều kiện 3: Không thu hồi tài nguyên từ tiến trình
du
4. Điều kiện 4: Tồn tại một chu trình trong đồ thị cấp
phát tài nguyên.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Đồ thị cấp phát tài nguyên
.c
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
.c
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Các phương pháp xử lý tắc nghẽn và ngăn chặn tắc
.c
nghẽn
ng
co
Sử dụng một thuật toán cấp phát tài nguyên ->
không bao giờ xảy ra tắc nghẽn.
an
th
Cho phép xảy ra tắc nghẽn ->tìm cách sữa chữa
ng
tắc nghẽn.
o
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Ngăn chặn tắc nghẽn
.c
Điều kiện 1 gần như không thể tránh được.
ng
Để điều kiện 2 không xảy ra:
co
Tiến trình phải yêu cầu tất cả các tài nguyên cần thiết
trước khi cho bắt đầu xử lý.
an
th
Khi tiến trình yêu cầu một tài nguyên mới và bị từ chối
ng
- Giải phóng các tài nguyên đang chiếm giữ
o
- Tài nguyên cũ được cấp lại cùng với tài nguyên mới.
du
Thu hồi tài nguyên từ các tiến trình bị khoá và cấp phát
cu
trở lại cho tiến trình khi nó thoát khỏi tình trạng bị khóa.
Để điều kiện 4 không xảy ra:
Khi tiến trình đang chiếm giữ tài nguyên Ri thì chỉ có thể
yêu cầu các tài nguyên Rj nếu F(Rj) > F(Ri).
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Giải thuật cấp phát tài nguyên tránh tắc nghẽn
.c
ng
Giải thuật xác định trạng thái an toàn
co
Giải thuật Banker
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Giải thuật xác định trạng thái an toàn
.c
int NumResources; //số tài nguyên
ng
int NumProcs; //số tiến trình trong hệ thống
co
int Available[NumResources] //số lượng tài nguyên còn tự do
an
th
int Max[NumProcs, NumResources]; ng
//Max[p,r]= nhu cầu tối đa của tiến trình p về tài nguyên r
o
du
om
Giải thuật xác định trạng thái an toàn
.c
B1.
If i:
ng
Finish[i] = false //tiến trình i chưa thực thi xong
co
Need[i,j] <= Available[j], j //Yêu cầu của process i được thỏa
an
Do B2 else goto B3
th
B2. Cấp phát mọi tài nguyên mà tiến trình i cần
ng
Allocation[i,j]= Allocation[i,j]+Need[i,j]; j
o
need[i,j]=0 ; j
du
Finish[i] = true;
Available[j]= Available[j] + Allocation[i,j];
goto B1
B3. i If Finish[i] = true -> « hệ thống ở trạng thái an toàn », else
« không an toàn »CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Giải thuật Banker: Pi yêu cầu kr thể hiện của tài
.c
nguyên r
ng
co
B1. If kr <= Need[i,r] r, goto B2, else « lỗi »
an
B2. If kr <= Available[r] r, goto B3;
th
else Pi « wait» ng
B3. r:
o
du
Available[r]=Available[r]-kr;
u
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Ví dụ - cấp phát tài nguyên tránh tắc nghẽn
.c
ng
Max Allocation Available
co
R1 R2 R3 R1 R2 R3 R1 R2 R3
an
th
P1 3 2 2
ng 1 0 0 4 1 2
P2 6 1 3 2 1 1
o
du
P3 3 1 4 2 1 1
u
P4 4 2 2 0 0 2
cu
Nếu tiến trình P2 yêu cầu 4 R1, 1 R3. hãy cho biết
yêu cầu này có thể đáp ứng mà không xảy ra
deadlock hay không?
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Ví dụ - cấp phát tài nguyên tránh tắc nghẽn
.c
ng
B0: Tính Need là nhu cầu còn lại về mỗi tài nguyên j
co
của mỗi tiến trình i:
an
Need[i,j]=Max[i,j]-Allocation[i,j]
th
ng
Need Allocation Available
o
du
R1 R2 R3 R1 R2 R3 R1 R2 R3
u
P1 2 2 2 1 0 0 4 1 2
cu
P2 4 0 2 2 1 1
P3 1 0 3 2 1 1
P4 4 2 0 0 0 2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Ví dụ - cấp phát tài nguyên tránh tắc nghẽn
.c
B1+B2: yêu cầu tài nguyên của P2 thoả đk ở B1, B2.
ng
B3: Thử cấp phát cho P2, cập nhật tình trạng hệ thống
co
an
th
Needng Allocation Available
R1 R2 R3 R1 R2 R3 R1 R2 R3
o
du
P1 2 2 2 1 0 0 0 1 1
u
P2 0 0 1 6 1 2
cu
P3 1 0 3 2 1 1
P4 4 2 0 0 0 2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Ví dụ - cấp phát tài nguyên tránh tắc nghẽn
.c
B4: Kiểm tra trạng thái an toàn của hệ thống.
ng
co
Lần lượt chọn tiến trình để thử cấp phát:
an
Chọn P2, thử cấp phát, g/s P2 thực thi xong thu hồi
th
Available[j]= Available[j] + Allocation[i,j];
ng
o
Need Allocation Available
du
R1 R2 R3 R1 R2 R3 R1 R2 R3
u
cu
P1 2 2 2 1 0 0 6 2 3
P2 0 0 0 0 0 0
P3 1 0 3 2 1 1
P4 4 2 0 0 0 2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Ví dụ - cấp phát tài nguyên tránh tắc nghẽn
.c
ng
co
+ Chọn P1
an
Need Allocation Available
R1
th
R2 R3 R1 R2 R3 R1 R2 R3
o ng
P1 0 0 0 0 0 0 7 2 3
du
P2 0 0 0 0 0 0
u
cu
P3 1 0 3 2 1 1
P4 4 2 0 0 0 2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Ví dụ - cấp phát tài nguyên tránh tắc nghẽn
.c
ng
co
an
+ Chọn P3:
th
Need Allocation Available
ng
R1 R2 R3 R1 R2 R3 R1 R2 R3
o
du
P1 0 0 0 0 0 0 9 3 4
u
P2 0 0 0 0 0 0
cu
P3 0 0 0 0 0 0
P4 4 2 0 0 0 2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Ví dụ - cấp phát tài nguyên tránh tắc nghẽn
.c
+ Chọn P4:
ng
co
Need Allocation Available
an
R1 R2 R3 R1 R2 R3 R1 R2 R3
th
P1 0 0 0
ng 0 0 0 9 3 6
P2 0 0 0 0 0 0
o
du
P3 0 0 0 0 0 0
u
P4 0 0 0 0 0 0
cu
Mọi tiến trình đã được cấp phát tài nguyên với yêu cầu
cao nhất, nên trạng thái của hệ thống là an toàn, do đó
có thể cấp phát các tài nguyên theo yêu cầu của P2.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Giải thuật phát hiện tắc nghẽn
.c
ng
1. Đối với Tài nguyên chỉ có một thể hiện
co
2. Đối với Tài nguyên có nhiều thể hiện
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
1. Đối với Tài nguyên chỉ có một thể hiện
.c
Dùng đồ thị đợi tài nguyên (wait-for graph)
ng
co
Được xây dựng từ đồ thị cấp phát tài nguyên
an
(resource-allocation graph) bằng cách bỏ những
th
đỉnh biểu diễn loại tài nguyên.
ng
Cạnh từ Pi tới Pj : Pj đang đợi Pi giải phóng một
o
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
Tiến trình Yêu cầu Chiếm giữ
1. Đối với Tài nguyên chỉ có P1 R1 R2
.c
một thể hiện P2 R3, R4 R1
ng
P3 R5 R4
Ví dụ
co
P4 R2 R5
P5 R3
an
P5
th
P5 ng P5
R1 R3 R4
o
R1 R3 R4 P1 P2 P3
du
u
P1 P2 P3
cu
P1 P2 P3
P4
R2 R5 R2 P4 R5
P4
đồ thị đợi tài nguyên
đồ thị cấp phát tài đồ thị thử cấp phát tài
nguyên nguyên theo yêu cầu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tình trạng tắc nghẽn (deadlock)
om
2. Đối với Tài nguyên có nhiều thể hiện
.c
Bước 1: Chọn Pi đầu tiên sao cho có yêu cầu tài
ng
nguyên có thể được đáp ứng,
co
an
nếu không có thì hệ thống bị tắc nghẽn.
th
Bước 2: Thử cấp phát tài nguyên cho Pi và kiểm tra
ng
trạng thái hệ thống,
o
du
om
Hiệu chỉnh tắc nghẽn
.c
Hủy tiến trình trong tình trạng tắc nghẽn
ng
Hủy đến khi không còn chu trình gây tắc nghẽn
co
Dựa vào các yếu tố như độ ưu tiên, thời gian đã xử lý,
an
số tài nguyên đang chiếm giữ, hoặc yêu cầu thêm...
th
Thu hồi tài nguyên ng
Chọn lựa một nạn nhân: tiến trình nào sẽ bị thu hồi tài
o
nguyên? và thu hồi những tài nguyên nào?
du
Trở lại trạng thái trước tắc nghẽn (rollback): khi thu hồi
u
cu
tài nguyên, cần phục hồi trạng thái của tiến trình về
trạng thái gần nhất khi chưa bị tắc nghẽn.
Tình trạng «đói tài nguyên»: cần bảo đảm không có
tiến trình nào luôn bị thu hồi tài nguyên?
CuuDuongThanCong.com https://fb.com/tailieudientucntt