1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 using namespace std;
5 int work,progress,available[100],mmax[100][100],allocation[100][100],need[100][100];
6 int p[100];
7 void init()
8 {
9 int i,j;
10 printf("请输入多少系统资源数\n");
11 scanf("%d",&work);
12 printf("请输入总共有多少进程\n");
13 scanf("%d",&progress);
14 for(i=1;i<=work;i++)
15 {
16 printf("第%d类资源有的资源实例:",i);
17 scanf("%d",&available[i]);
18 }
19 for(i=1;i<=progress;i++)
20 for(j=1;j<=work;j++)
21 {
22 printf("进程p[%d]当前分配第%d类资源数: ",i,j);
23 scanf("%d",&allocation[i][j]);
24 }
25 int sum;
26 for(j=1;j<=work;j++)
27 {
28 sum=0;
29 for(i=1;i<=progress;i++)
30 {
31 sum+=allocation[i][j];
32
33 }
34 available[j]-=sum;
35 }
36 for(i=1;i<=progress;i++)
37 for(j=1;j<=work;j++)
38 {
39 printf("进程p[%d]对第%d类资源的最大需求量: ",i,j);
40 scanf("%d",&mmax[i][j]);
41 }
42 for(i=1;i<=progress;i++)
43 for(j=1;j<=work;j++)
44 {
45 need[i][j]=mmax[i][j]-allocation[i][j];
46 }
47 printf("当前的状态:\n");
48 printf(" Max Allocation Need\n");
49 printf("进程");
50 for(i=1;i<=3;i++)
51 {
52 for(j=1;j<=work;j++)
53 printf(" %d类",j);
54 }
55 for(i=1;i<=progress;i++)
56 {
57 printf("\nP[%d]",i);
58 for(j=1; j<=work; j++)
59 {
60 printf(" %d ",mmax[i][j]);
61 }
62 for(j=1; j<=work; j++)
63 {
64 printf(" %d ",allocation[i][j]);
65 }
66 for(j=1; j<=work; j++)
67 {
68 printf(" %d ",need[i][j]);
69 }
70 }
71 printf("\n\n系统剩余资源量: ");
72 for(i=1; i<=work; i++)
73 {
74 printf(" %d ",available[i]);
75 }
76 printf("\n");
77 }
78 bool safe()
79 {
80 int w[100],finish[100],i,j,k,l=0;
81 memset(finish,0,sizeof(finish));
82 for(i=1;i<=work;i++)
83 w[i]=available[i];
84 printf("\n");
85 for(i=1;i<=progress;i++)
86 {
87 if(finish[i]==1)
88 continue;
89 for(j=1;j<=work;j++)
90 {
91 if(need[i][j]>w[j])
92 break;
93 }
94 if(j==work+1)
95 {
96 finish[i]=1;
97 for(k=1;k<=work;k++)
98 w[k]+=allocation[i][k];
99 p[l++]=i;
100 i=0;
101 }
102 else
103 continue;
104 if(l==progress)
105 {
106 printf("系统是安全的\n");
107 printf("安全序列:\n");
108 for(i=0;i<l;i++)
109 {
110 printf("%d",p[i]);
111 if(i!=l-1) //最后一项不输-->
112 {
113 printf("-->");
114 }
115 }
116 printf("""\n");
117 return true;
118 }
119 }
120 printf("系统是不安全的\n");
121 return false;
122 }
123 void Request()
124 {
125 int m,i,request[100],flag=0,j;
126 printf("请输入申请资源的进程:");
127 scanf("%d",&m);
128 for(i=1;i<=work;i++)
129 {
130 printf("请输入进程p[%d]对%d类资源的申请量:",m,i);
131 scanf("%d",&request[i]);
132 }
133 for(j=1;j<=work;j++)
134 {
135 if(request[j]>need[m][j])
136 {
137 flag=1;
138 }
139 }
140 if(flag)
141 printf("请求的资源数超过了需求的最大值\n");
142 else
143 {
144 for(j=1;j<=work;j++)
145 if(request[j]>available[j])
146 flag=1;
147 if(flag)
148 printf("尚无足够资源,P[%d]须等待\n",m);
149 else
150 {
151 for(j=1;j<=work;j++)
152 {
153 available[j]=available[j]-request[j];
154 allocation[m][j]=allocation[m][j]+request[j];
155 need[m][j]=need[m][j]-request[j];
156 }
157 printf("\n");
158 if(safe())
159 {
160 printf("可以分配给进程p[%d]\n",m);
161 }
162 else
163 {
164 printf("aaa\n");
165 printf("让进程p[%d]等待",m);
166 for(j=1;j<=work;j++)
167 {
168 available[j]=available[j]+request[j];
169 allocation[m][j]=allocation[m][j]-request[j];
170 need[m][j]=need[m][j]+request[j];
171 }
172 }
173 }
174 }
175
176 }
177 int main()
178 {
179 int cas;
180 printf("★★★★★★★★欢迎使用本程序★★★★★★★★\n");
181 printf("\n\n");
182 init();
183 for(;;)
184 {
185 Request();
186 printf("输入0程序运行结束,输入其他继续执行");
187 scanf("%d",&cas);
188 if(cas==0)
189 break;
190 }
191 return 0;
192 }