You are on page 1of 27

Chương

DEADL
8

OCK
Môn: Hệ Điều Hành
Khoa: Công Nghệ Thông Tin
Trường ĐH Giao Thông Vận Tải
Tp.HCM
DEADLOCK
Deadlock
01 System model Characterization
3.1 Necessary Conditions
03
3.2 Resource-Allocation Graph
Deadlock in
Multithreaded
Methods for Handing
02 Applications
Deadlocks 04
2.1 Livelock
Lời mở đầu
Trong một môi trường multiprogramming,
một số luồng có thể cạnh tranh một số tài
nguyên hữu hạn. Một luồng yêu cầu tài
nguyên, nếu tài nguyên không có sẵn vào
thời điểm đó, luồng sẽ vào trạng thái chờ.
Đôi khi, một luồng đang đợi không bao giờ
có thể thay đổi trạng thái lại nữa, vì tài
nguyên mà nó đã yêu cầu đang được các
luồng khác giữ. Tình huống này được gọi là
deadlock.
Chúng ta xác định deadlock là tình huống
mà mỗi tiến trình trong một tập hợp các tiến
trình đang chờ đợi một sự kiện chỉ có thể
được gây ra bởi một tiến trình khác trong
tập hợp đó.
Deadlock là gì
Deadlock là một trạng thái mà hệ thống đó:
• Một tập hợp các tiến trình bị nghẽn
• Mỗi tiến trình đang giữ một tài nguyên và
cũng đang chờ một tài nguyên đang bị giữ bởi
một tiến trình khác trong tập các tiến trình
đang bị nghẽn.

Ví dụ 1: với ba quá trình P1, P2, P3 và ba tài


nguyên R1, R2, R3:
Nếu P1 yêu cầu R2 của P2 thì phải chờ cho P2
giải phóng tài nguyên và tạo ra R3. Tương tự như
vậy đối với P1 và P3. Vì thế mà nó thường xuyên
xảy ra các tình trạng Deadlock trong hệ điều
hành.
VD2: Traffic Deadlock
01
System
model
1. System Model
● Hệ thống bao gồm một số hữu hạn các tài nguyên phải
được phân phối giữa một số luồng cạnh tranh.
● Các tài nguyên có thể được phân chia thành một số loại
(hoặc lớp), mỗi loại bao gồm một số lượng các phiên bản
giống nhau.
● Các loại tài nguyên, kí hiệu R1, R2, …, Rm, bao gồm:
○ CPU cycle, không gian bộ nhớ, thiết bị I/O, file,
semaphore,…
○ Mỗi loại tài nguyên Ri có Wi thực thể
1. System Model
● Một luồng phải yêu cầu một tài nguyên trước khi sử dụng nó và phải giải
phóng tài nguyên sau khi sử dụng xong.
● Một luồng có thể yêu cầu bất kỳ số lượng tài nguyên nào mà nó cần để thực
hiện nhiệm vụ của mình.
● Dưới chế độ hoạt động bình thường, một luồng chỉ có thể sử dụng tài
nguyên theo các bước sau:
1. Yêu cầu: Luồng yêu cầu tài nguyên. Nếu yêu cầu không thể được đáp
ứng ngay lập tức (ví dụ, nếu một khóa mutex hiện đang được giữ bởi
một luồng khác), thì luồng yêu cầu phải chờ đợi cho đến khi nó có thể
có được tài nguyên.
2. Sử dụng: Luồng có thể thao tác trên tài nguyên (ví dụ, nếu tài nguyên
là một khóa mutex, luồng có thể truy cập vào phần critial section của
nó).
3. Giải phóng: Luồng giải phóng tài nguyên
1. System Model
● Các tác vụ yêu câu và hoàn trả đều là system call
. Ví dụ:
○ request() và release() của một thiết bị.
○ open() và close() của một tệp tin.
○ allocate() và free() của bộ nhớ.
○ wait() và signal() trên semaphore
○ acquire() và release() của một khóa mutex.
DEADLOCK
IN
Chương 2
MULTITHREA
DS
APPLICATIO
NS
2. Deadlock in Multithreaded
Applications:
40
● Minh họa cách deadlock có thể xảy ra trong một chương trình
% Pthread (Posix thread) đa luồng sử dụng khóa mutex POSIX.
● Hàm pthread_mutex_init() khởi tạo một khóa mutex chưa được
khóa.
● Khóa mutex được mở và đóng bằng cách sử dụng
10 pthread_mutex_lock() và pthread_mutex_unlock(), tương ứng.
%● Nếu một luồng cố gắng mở một khóa mutex đã được khóa, lệnh gọi
pthread_mutex_lock() sẽ chặn luồng cho đến khi chủ sở hữu của
khóa mutex gọi pthread_mutex_unlock().
2. Deadlock in Multithreaded
Applications:
40
● Hai khóa mutex được tạo và khởi tạo
% trong ví dụ mã sau:
●pthread_mutex_t first_mutex;
●pthread_mutex_t second_mutex;
●pthread_mutex_init(&first_mutex,NULL);
10
●pthread_mutex_init(&second_mutex,NUL
% L);
● Tiếp theo, hai luồng - luồng một và luồng
hai - được tạo, và cả hai luồng này đều có
quyền truy cập vào cả hai khóa mutex.
Luồng một và luồng hai chạy trong các
hàm do_work_one() và do_work_two(),
2. Deadlock in Multithreaded
Applications:
40
● Tuy nhiên, mặc dù deadlock có thể xảy ra, nó sẽ không xảy ra nếu
% luồng một có thể mở và đóng các khóa mutex cho first_mutex và
second_mutex trước khi luồng hai cố gắng mở các khóa.
● Thứ tự mà các luồng chạy phụ thuộc vào cách chúng được lập lịch
bởi trình lập lịch CPU.
10
● Ví dụ trên minh họa một vấn đề với việc xử lý deadlock: việc nhận
% biết và kiểm tra deadlock có thể chỉ xảy ra dưới một số hoàn cảnh
lập lịch nhất định là khó khăn
2. Deadlock in Multithreaded Applications:
2.1 Livelock:
● Livelock là một dạng khác của liveness failure.
● Nó tương tự như deadlock; cả hai đều ngăn chặn hai hoặc nhiều
luồng tiếp tục, nhưng các luồng không thể tiếp tục vì các lý do khác
nhau.
● Trong khi deadlock xảy ra khi mỗi luồng trong một tập hợp bị chặn
đợi một sự kiện chỉ có thể được gây ra bởi một luồng khác trong tập
hợp, livelock xảy ra khi một luồng liên tục thử một hành động mà
thất bại.
● VD minh họa: khi hai người cố gắng đi qua một hành lang: Một
người di chuyển sang phải, người kia di chuyển sang trái, vẫn cản trở
sự tiến bộ của nhau. Sau đó, anh ta di chuyển sang trái, và cô ấy di
chuyển sang phải, và cứ như vậy. Họ không bị chặn, nhưng họ
không tiến bộ.
2. Deadlock in Multithreaded Applications:
2.1 Livelock:
● Livelock có thể được minh họa với
hàm pthread_mutex_trylock() của
Pthreads, hàm này cố gắng mở một
khóa mutex mà không chặn.
● Tình huống này có thể dẫn đến
livelock nếu luồng một mở
first_mutex, theo sau là luồng hai
mở second_mutex.
● Mỗi luồng sau đó gọi
pthread_mutex_trylock(), thất bại,
giải phóng khóa tương ứng của họ
và lặp lại các hành động giống nhau
vô hạn.
03
Deadlock
Characterization
3. Deadlock Characterization:
3.1 Necessary conditions:
Deadlock có thể xảy ra nếu 4 điều kiện sau cùng tồn tại trong hệ
thống:
1. Loại trừ hỗ tương (Mutual exclusion): ít nhất một tài nguyên
được giữ ở chế dộ không chia sẻ ( nonsharable mode)
2. Giữ và chờ (Hold and wait): một tiến trình đang giữ ít nhất một
tài nguyên và đợi them tài nguyên đang bị giữ bởi tiến trình khác
3. Không trưng dụng tài nguyên (No pre-emption): không trưng
dụng tài nguyên cấp phát tiến trình, trừ khi tiến trình tự hoàn trả
4. Chờ đợi vòng tròn (Circle wait) : tồn tại một tập các tiến trình {, ,
. . . ., } đang chờ đợi như sau: đợi một tài nguyên đang giữ, đợi
một tài nguyên đang giữ, . . . ., đang đợi một tài nguyên đang giữ.
3. Deadlock Characterization:
3.1 Necessary conditions:
Chúng ta phải chú ý rằng phải tồn tại 4 điều kiện thì mới xảy ra
deadlock.
Điều kiện circular wait bao hàm điều kiện hold and wait, nên 4 điều
kiện không hoàn toàn độc lập.
3. Deadlock Characterization:
3.2 Resource-Allocation Graph:
Deadlocks có thể được mô tả cụ thể
hơn trong thuật ngữ của một biểu đồ
có hướng được gọi là system
resource-allocation graph (biểu đồ
phân bố tài nguyên hệ thống).
Biểu đồ này bao gồm một tập hợp các
đỉnh V và một tập hợp các cạnh E. Tập
hợp các đỉnh V được phân chia thành
hai loại khác nhau: T = {T1, T2, ..., Tn}
tập hợp bao gồm tất cả các luồng trong
hệ thống và R = {R1, R2, ..., Rm} tập
hợp bao gồm tất cả các loại tài nguyên
trong hệ thống.
3. Deadlock Characterization:
3.2 Resource-Allocation Graph:
3. Deadlock Characterization:
3.2 Resource-Allocation Graph:

Tại thời điểm này, hệ thống có tối thiểu 2 chu trình:


T1 → R1 → T2 → R3 → T3 → R2 → T1
T2 → R3 → T3 → R2 → T2
3. Deadlock Characterization:
3.2 Resource-Allocation Graph:

T1 → R1 → T3 → R2 →
04
METHOD
FOR
HANDING
DEADLOCK
4. Method for Handing Deadlock:
40
Chúng ta có thể xử lý deadlock theo một trong ba cách sau:
%
o Chúng ta có thể hoàn toàn bỏ qua vấn đề và giả vờ rằng deadlock
không bao giờ xảy ra trong hệ thống.
o Chúng ta có thể sử dụng một giao thức để ngăn chặn hoặc tránh
10deadlock, đảm bảo rằng hệ thống sẽ không bao giờ vào trạng thái
%deadlock.
o Chúng ta có thể cho phép hệ thống vào trạng thái deadlock, phát hiện
nó và phục hồi sau đó.
4. Method for Handing Deadlock:
40
● Bảo đảm rằng hệ thống không rơi vào tình trạng deadlock bằng cách
%ngắn (Prevention) hoặc tránh ( Avoidance) deadlock
● Sự khác biệt giữa ngăn và tránh deadlock:
○ Ngăn deadlock: không cho phép một trong 4 điều kiện cần cho
10 deadlock
% ○ Tránh deadlock: các quá trình cần cung cấp thông tin về tài
nguyên nó cần để hệ thống cấp tài nguyền một cách thích hợp
4. Method for Handing Deadlock:
40
● Cho phép hệ thống vào trạng thái deadlock, nhưng sau đó phát hiện
%deadlock( Detection) và phục hồi hệ thống ( Recovery)
● Bỏ qua mọi vấn đề, xem như deadlock không bào giờ xảy ra trong hệ
thống
10 ○ Khá nhiều hệ điều hành sử dụng phương pháp này.
% ○ Deadlock không được phát hiện, dẫn đến việc giảm hiệu suất của
hệ thống. Cuối cùng, hệ thống có thể ngưng hoạt động và phải khởi
động lại.

You might also like