!"#$%#&'(!$
1
NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………
………………………………………………………………………………
Mục Lục
TỔNG QUAN VỀ ĐỀ TÀI
1. Bối cảnh và lý do chọn đề tài
$)*+,-./01234516*6
56478$)*93:3);<+=>
?312647@A6B6+=C+=>?
3D)2?E6BF8
#6+=G>0+,@*.-+HG>0I=J
+93)>?KLM8B.-45145@;45
N9-.-3O=8!;454P<Q<O
=-.-9RP9;SET8
J3U6B)JU@I6*.-@+,-I@
*45-/.4;DD6B3A*A.E3
.8J/.4;+H1V63<;23*0
4;$)*$3/5.W9@G>0
@XRYR6E!450$)*$8
2. Mục tiêu của đề tài
Z$6-)J3*
Z$Y6
Z$+,./0
Z$Y
Z$
Z$)
Z$?I[
!"#$%#&'(!$
2
3. Yêu cầu của đề tài
• "U)
• #-4\
• ]^4D+,-3;./6
• _;6`\B66O3#4*
• "Y35+U`@6X45135+U`3
;BX=
• !<a3;+,-K@Kbb@_Kbb
!"#$%#&'(!$
3
Chương 1. CƠ SỞ LÝ THUYẾT
1. Giới thiệu về Deadlock
1.1 Tiến trình
1.1.1 Định nghĩa
- #;-STO2=6B+,-O45
6478!9I6BU1;O4+,-SPc
;-T3/6)OBG>0;-D
+,-8
- +HG6,3P63))*8
- '6BDB@3U+,-6BPB8
1.1.2 Phân loại
K9O;-d
- #;-)*8
- #;-+=>?8
1.1.3 Các thành phần của tiến trình
- O6e)8
- O<)8
- OG;38
- KOB)O+H).;6)S(LT3B
STBG>08
1.1.4 Vòng đời của tiến trình
!"#$%#&'(!$
4
1.1.5 Vấn đề lập lịch tiến trình
- fJ+H451>?/*,J+H459SKLMT
- 9@1P^J=>?KLM;-
+=>?3)J8
1.2 Deadlock
1.2.1 Giới thiệu
- #.-P;-@.-=;-9
=4OQO3-45X451P<Q<
;-=8#+=H4+HES9;T8
1.2.2 Mô hình hệ thống
- B)J2J45<O+H^g<*.-
O8K454+H^*O@6hO2
6BJ)GP8iBU@jKLM3;P
kGAS+64@l[T<7?3*O458!;)J
9KLM@-O45KLM9)8#+,D@O45
64996)8
- !;6B.-4516B)O45-3)AA
2)O454R/6e4518!;99-
)GP3UO45R+HP
lH08#7?@6B)J99648$O6449
+HPlaUO45;9.-
.^664<)8#45@;6B64Q1m364
Q1)-+=aQ1mG664+,D
3U455n1+HPl6h648
- B.-/4516B45+U>?9@3//
9>?98B.-9451*45+9
+H451D)3?+H98KX0@J45+H45
13+H.J+HgB45o9)J8!9
@6B.-45164;)Jc98
- +U;B*+=@6B.-9>?6B
45c2Dd
!"#$%#&'(!$
5
- p51d;451+H2-S7?@45+H
aQ.-T-.-451/=U99
+H458
- f>?d.-9*45S7?@;4564@
.-964T
- "/9d.-/9458
- p513/945=E)J8#7?+4513
/9;P@6Q39@A3/9BU8p51
3/9459O+H.=q3
)89@6h+=H>?@)*6
/6/r.->?4513+HA458B/
)J6h.-/94+HA458!;
6B.-451456459)+HA6B
.-@99+H563H=4548
- BH.-O6h.-H
4=D)69+HOcQ.-H8
!<D)6X.^64;Q^43/9
458K4594530S7?@64@l[@
BU3jKLMT4450S7?@@6@
6T8#45@OD)9`;8
- 6OO@XGC)J3Ugl[8"/>
6h.-<6Bgl[48\^4=@;6h.-4516Bg
l[-.-RQO8h.-
=6BD)sgl[+H/9t69+H^4cQ6B
<.-=8#7?46O5.;
aO458
- u5.*O458#7?@GC6B)
J3U6B6436Bgl[8"/>@.-L<gl[3
.-L<648!;L451643L451gl[-
G/48
!"#$%#&'(!$
6
- B+=-<2?I/.^6Y
)U3A*4dK+,-I2>353A*
3-*I9O545+Hn8
1.2.3 Đặc điểm của Deadlock
#6B@.-=3)D3
45)JPBY@Y.-V18
#+UX/+,/.4;3A*
@XR6/Y666/8
vNhững điều kiện cần thiết gây ra deadlock:
o #+=H9;J*)G/4a6B
X)Jd
(1) Loại trừ hỗ tương: 7A6B45/+H<;B
nWl@c6B.-Oa6B=69>?
458!;6B.-451459@.-451/
O6[;45+H/98
(2) Giữ và chờ cấp thêm tài nguyên: .-/<7A6B
453=45566)+H<Q.
-8
(3) Không đòi lại tài nguyên từ quá trình đang giữ chúng: K45
P:OWl@459+H/9cD0Q.
-<9@.-93?8
(4) Tồn tại chu trình trong đồ thị cấp phát tài nguyên: 6BH.
-wLx@Ly@z@L{=69Lx=6B45+H<
QLy@Ly=45<QL|@z@Lvy=45
+H<Q.-Lx8
vKXA6OrA/J*)/a
G/48*)=H+,-+;*)<v3v=3-
;J*)B8
1.3 Các phương pháp xử lý Deadlock
K9}/.4;,/@9d
- KX9>?6B2Y4@/6
/r)JR=3O
!"#$%#&'(!$
7
- KX9C)J3O@)93
?I8
- KX9.3A*43/3==
G/4)J8"/4+Ha*)*@/
M!(]8
- ~*4Rc93*3;3*
8
2. Thuật toán nhà băng của Dijsktra
2.1 Giới thiệu
- '6BA453+HQ
8
- •?)J9*O45
- #6Or63)A
+HJ9A/O45+HGP+U@9
6OG6*)G/4A/;-
451459G/48f9D3O
4.4;P3)A458
2.2 Cấu trúc dữ liệu
- !*AX<)/+H4-Y/\8!<A
X<)46eO)JA458"EJ
.-)J36JO45)J8KX1
AX<)d
• Availabled6B39*PJ+H45o
a6hO8!;€3•‚ƒ@9)O45
„
oa8
• Maxd6B6GPlJ+HJ4516h.
-8!;G•@‚ƒ@-.-L
9451*A
)O45„
8
• Allocationd6B6GPlJ+H456h
O)+HAU6h.-8!;€•@‚ƒ@-.
-L
)+HA)O45„
8
!"#$%#&'(!$
8
• Needd6B6GP45145:O6h.
-8!;!•@‚ƒ@-.-L
9156)
O45„
3?98KX0r@!•@‚ƒ
G•@‚…€•@‚8
- KAX<)4;g=3*7+U3P8,/
3)-4/\@X;30)8"E]3p
39*8KX9r]†p;3c;]•‚†p•‚
A/ƒy@|@z@8#7?@;]ƒSy@‡@}@|T3pƒSx@}@|@yT-p†]@pˆ
];p†]3p‰]8
- KX9G6GC6h:6€3!+
<336;UX+€
3!
+,28
_€
GP45)+HAU.-L
W3
!
GP45g6.-L
93`451
3?98
2.3 Thuật toán kiểm tra an toàn
- "/GP)JQO49+H6/
+d
Bước 1: "EŠ3‹39*63+,28iQ
OŠdƒ€33‹•‚dƒŒƒy@|@z@8
Bước 2: #-6d
T‹•‚ƒŒ
T!†Š8!;9@4U+U•
Bước 3: ŠdƒŠb€‹•‚dƒ43*+U|8
Bước 4: !;‹•‚ƒA/@-)JQO8
"/49451B2O6G|.4;PO
48
2.4 Thuật toán yêu câu tài nguyên
- K„.3451.-L8!;„.•‚ƒ@-.-
L6J)O45„8i6B45145+HD
)Q.-L@-OB+HD)d
Bước 1: !;„.†!@4U+U|8!+HO@6B
*)h3-.-3+H.451J98
Bước 2: !;„.†€3@4U+U}8!+HO@L/=
3-45o98
!"#$%#&'(!$
9
Bước 3: "/>)JA45+H451U.-L
r4gOd
€3dƒ€3…„.W
€dƒ€b„.W
!dƒ!…„.W
!;;./OA45@-P+H
3.-L+HA4598#45@;O
6U@-L/=„.3OA45u
+H?I8
!"#$%#&'(!$
10
Chương 2. THIẾT KẾ VÀ XÂY DỰNG CHƯƠNG TRÌNH
1. Phân tích yêu cầu
\Y8
(dE[Œ8G6^G•@‚@€•@‚36/#•‚8
- \1d€•@‚ƒx8
- #;45145;;-A
Ždi6O;-45145@;
-A453;?451;;-A8
dfJ;-
dfJ45
!"#$%#&'(!$
11
2. Xây dựng chương trình
2.1 Cấu trúc hoạt động của chương trình
!"#$%#&'(!$
12
2.2 Các biến, hàm sử dụng trong chương trình
STT Tên hàm, biến Chức năng
y €•‚•‚ /€245eA
| G•‚•‚ /G245J6;-
451
} !•‚•‚ /!2456;-1
• €3•‚ /€3245N9
• #•‚ /#+gJ459N
• #6y•‚@6|•‚@
6}•‚
}6/+O6=}6/€3@
€@!
‡ „.•‚ /245451
‘ #6•‚•‚ /+45=A9
45
m K6•‚ /+;-/S6ƒ
yT
yx „ fJ45
yy ’ fJ;-
y| (ST $6A4<)[Œ8G
y} €3ST $6-66/3•‚•‚
y• !ST $6-66/•‚•‚
y• (fŒST $66@/3*y;@x;
y• “„.ST $645145
y‡ „.”‹S•@T $645145
y‘ \ST $6+<)
ym „ST $6?<)
|x ST $6P3)16
|y €S•@•@T $6B6/
|| Ž”yS•@T $6GA6/y*
|} Ž”|S•@T $6GA6/|*
|• KLS•.@T $6A45
|• ŠST $663A45;
-=
|• „34”„ST $6I45;-A
|‡ KST $66;-A
!"#$%#&'(!$
13
3. Kết quả thử nghiệm.
3.1 Dữ liệu từ file input.txt
!"#$%#&'(!$
14
3.2 Demo.
!"#$%#&'(!$
15
!"#$%#&'(!$
16
!"#$%#&'(!$
17
!"#$%#&'(!$
18
!"#$%#&'(!$
19
Chương 3. ĐÁNH GIÁ KẾT QUẢ
1. Đánh giá
$O;
• Thuật toán banker xuất phát từ giả thiết số tài nguyên là cố định. Nhưng bởi vì
các tài nguyên không thể làm việc mãi (ví dụ dừng lại để bảo dưỡng) do đó
chúng ta không thể cho rằng số lượng tài nguyên là cố định.
• Thuật toán đòi hỏi rằng số người dùng là không đổi. Yêu cầu đó cũng không
thực tế, vì trong các hệ đa chương trình, số lượng người dùng luôn thay đổi
• Thuật toán đòi hỏi bộ phận phân phối tài nguyên phải đảm bảo thoả mãn tất
cả các yêu cầu sau khoảng thời gian hữu hạn nào đó. Tuy nhiên trong thực tế
người ta cần những con số cụ thể hơn nhiều.
• Cũng như thế, thuật toán đòi hỏi người dùng phải trả lại các tài nguyên được
cấp, sau một khoảng thời gian nào đó- và trong thực tế cũng cần các chỉ số cụ
thể.
• Thuật toán yêu cầu người dùng phải báo trước số lượng lớn nhất tài nguyên
anh ta cần. Nhưng sự phân phối tài nguyên ngày càng phải linh động, và do
đó càng khó đánh giá yêu cầu lớn nhất. Vì máy tính ngày càng thân thiện với
người dùng nên sẽ ngày càng nhiều người dùng không có hình dung chính xác
về số tài nguyên lớn nhất mà anh ta sẽ cần, thay vào đó khi nào cần tài nguyên
người dùng mới yêu cầu.
8 #+)*6\@
–,6)*./71234516*65
647@.9eXXYR,3*6E!45'7$)
*$8
2. Những hạn chế
K+,-63`:+D.3B3`:5;
B@1/O56)+,-D.3B
,
!"#$%#&'(!$
20
PHỤ LỤC
Mã lệnh chương trình
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
// khai bao bien toan cuc
int alloc[10][10];
int max[10][10];
int need[10][10];
int avail[10];
int total[10];
int temp1[10],temp2[10][10],temp3[10][10],task[10];
int request[10],tam[10][10],complete[10];
int r,p; // r: so tai nguyen, p: so tien trinh
// nguyen mau ham
void Input();// lay du lieu tu txt
void Available();// tim mang avail[][]
void Need(); // tim mang need[][]
int IsSefe(); // ham kiem tra an toan
void EnterRequest();// ham nhap cac yeu cau tai nguyen
void Request_F(int *b, int n); // ham yeu cau tai nguyen
void Backup();// ham sao luu du lieu
void Resore();// ham khoi phuc du lieu
void Menu();// hien thi danh sach viec can lam
void Add(int *a,int*b,int n); // cong hai mang
void Out_1(int *a,int n);// xuat mang mot chieu
void Out_2(int *a,int n, int m);// xuat mang 2 chieu
void CapPhat(int *request, int a);// cap phat tai nguyen
cho tien trinh a
void waiting();// kiem tra va cap phat tai nguyen cho cac
tien trinh dang cho
void Recovery_R(int a);// thu hoi tai nguyen
void Check();//kiem tra cac tien trinh hoan tat de cap
phat tai nguyen cho cac tien trinh dang cho
//
void Input()
{
int i,j;
FILE* fp=fopen("input.txt","rt");
if(fp==NULL)
{
!"#$%#&'(!$
21
printf("/nLoi mo file!!!\nNhan phim bat ki de mo
lai file\n");
getch();
Input();
}
else
{
fscanf(fp,"%d",&r);// lay so luong tai nguyen
for(i=0;i<r;i++) fscanf(fp,"%d",&total[i]);
fscanf(fp,"%d",&p);// lay so luong tien trinh
// lay bang Allocation
for(i=0;i<p;i++)
{
for(j=0;j<r;j++)
fscanf(fp,"%d",&alloc[i][j]);
}
// lay bang Max
for(i=0;i<p;i++)
{
for(j=0;j<r;j++)
{
fscanf(fp,"%d",&max[i][j]);
}
}
fclose(fp);
}
}
//
void Available()
{
int i,j,k=0;
for(i=0;i<r;i++)
{
for(j=0;j<p;j++)
{
avail[k]+=alloc[j][i];
}
avail[k] = total[i]- avail[k];
k++;
}
}
//
void Need()
!"#$%#&'(!$
22
{
int i,j;
for(i=0;i<p;i++)
{
for(j=0;j<r;j++)
{
need[i][j] = max[i][j] - alloc[i][j];
}
}
}
//
void Output_1(int *a,int n)
{
int i;
for(i=0;i<n;i++)
printf("r[%d]=%3d\t",i,a[i]);
}
//
void Output_2(int a[10][10],int n,int m)
{
int i,j;
for(i=0;i<n;i++)
{
printf("P[%d] ",i);
for(j=0;j<m;j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}
}
//
void Backup()
{
for (int i=0;i<r;i++) temp1[i]=avail[i];
for (int i=0;i<p;i++)
for(int j=0;j<r;j++)
{
temp2[i][j]=alloc[i][j];
temp3[i][j]=need[i][j];
}
}
//
!"#$%#&'(!$
23
void Restore()
{
for (int i=0;i<r;i++) avail[i]=temp1[i];
for (int i=0;i<p;i++)
for(int j=0;j<r;j++)
{
alloc[i][j]=temp2[i][j];
need[i][j]=temp3[i][j];
}
}
//
void Add(int*a,int*b,int n)
{
for (int i=0;i<n;i++)
a[i]+=b[i];
}
//
void CapPhat(int *request,int a)
{
int i;
for(i=0;i<r;i++)
{
alloc[a][i] += request[i];
avail[i] -= request[i];
need[a][i] -= request[i];
}
}
//
void Recovery_R(int a)
{
int i;
for(i=0;i<r;i++)
{
avail[i]+=alloc[a][i];
alloc[a][i]=0;
}
printf("\n So luong tai nguyen san dung.
(Available) \n");
Output_1(avail,r);
}
//
void Menu()
{
!"#$%#&'(!$
24
printf("\n==============================");
printf("\n1: tiep tuc yeu cau tai nguyen");
printf("\n2: exit");
printf("\nMoi Chon: ");
printf("\n=> ");
}
//
void waiting()
{
int i,j,s,a[10],s1,s2;
for(i=0;i<p;i++)
{
s=0;
for(j=0;j<r;j++)
{
s+=tam[i][j];
}
if(s)
{
for(j=0;j<r;j++)
{
a[j]=tam[i][j];
}
if(complete[i]==0)
{
printf("\n
");
printf("\n => cap phat tai nguyen cho tien
trinh P[%d] dang cho",i);
printf("\n Tai nguyen ma P[%d] yeu
cau.\n",i);
Output_1(a,r);// in tai nguyen dang cho
luu o mang a
//
s1=0;
for(j=0;j<r;j++)
{
if(a[j] > need[i][j])
s1=1;
}
if(s1)
{
!"#$%#&'(!$
25