80652319 2017-04-02
利用键盘模拟进程的三种操作状态,并且使用C++中的list模板模拟内存的分配和回收。
能够模拟进程的创建与撤销过程
l可对进程的状态进行全面的控制
按先进先出方式管理就绪和阻塞队列,能够按队列形式输出进程状
用PCB代表进程,用全局变量表示进程的个数。
1 #include <iostream>
2 #include <list>
3 #include <numeric>
4 #include <algorithm>
5 #include<stdlib.h>
6 using namespace std;
7
8
9 struct PCB //PCB结构体
10 {
11 char name[10]; //外部标记
12 int PID; //内部标记
13 int begin; //起始地址
14 int length; //长度
15 struct PCB* next;
16 };
17
18
19 struct Memory
20 {
21 int start; //起始地址
22 int len; //长度
23 bool operator < (const struct Memory p) const
24 {
25 return len < p.len;
26 }
27
28 };
29 typedef list <Memory> Memy;//用模板定义Memory的列表
30
31 int SIZE; //用来存储内存的大小
32 Memy LM; //用来存储内存分配的链表
33 Memy::iterator K;
34 Memory L; //第一块完整的内存
35 static int number = 0;
36 //number用来标记进程的数量。
37
38 //创建三个链表,分别代表,就绪,执行,阻塞
39 struct PCB* Ready = new struct PCB;
40 struct PCB* Blocked = new struct PCB;
41 struct PCB* Running = new struct PCB;
42
43
44 bool px(struct Memory m, struct Memory n)
45 {
46 return m.start < n.start;
47 }
48
49
50 void CreateProcess(struct PCB* &Ready, Memy &LM)//创建进程
51 {
52 LM.sort();
53 struct PCB* P = new struct PCB;
54 struct PCB* X = new struct PCB;//利用X来做到插入队尾
55
56 X = Ready;
57
58 //cout << "请输入此进程的名称:" << endl;
59 cin >> P->name;
60
61
62 //cout << "请输入此进程大小:" << endl;
63 cin >> P->length;
64
65 for (K = LM.begin(); K != LM.end(); K++)//分配内存,
66 {
67 Memy::iterator x;
68 if (K->len <= 0)
69 {
70 cout << "已经没有足够的内存空间!" << endl;
71 return;
72 }
73 if (K->len < P->length)
74 {
75 x = K;
76 K++;
77 if (K == LM.end())
78 {
79 cout << "已经没有足够的内存空间!" << endl;
80 return;
81 }
82 else
83 {
84 K = x;
85 continue;
86 }
87 }
88 else if (K->len >= P->length)
89 {
90 if (K->len - P->length <= 2)
91 {
92 P->begin = K->start;
93 P->length = K->len;
94 LM.erase(K);
95 number++;
96 break;
97 }
98 else
99 {
100 P->begin = K->start;
101 K->start += P->length;//修改起始地址
102 K->len -= P->length;
103 number++;
104 break;
105 }
106 }
107 else
108 {
109 continue;
110 }
111 }
112
113 P->PID = number; //利用number来进行唯一系统内部进程标示
114 while (X->next != NULL) //新建节点连接到链表尾部
115 {
116 X = X->next;
117 }
118 X->next = P;
119 P->next = NULL;
120 }
121
122
123 void sort1(Memy &LM) //按照长度进行排序
124 {
125 LM.sort();
126 }
127
128
129 void EndProcess(struct PCB* &Running, Memy &LM) //结束进程
130 {
131 if (Running->next == NULL)
132 {
133 cout << "没有进程处于执行态!" << endl;
134 system("pause");
135 return;
136 }
137 LM.sort(px);
138 Memory O;
139 O.start = Running->next->begin;
140 O.len = Running->next->length;
141 if (LM.size() == 0) //系统剩余空间为0,直接插入。
142 {
143 Memory M;
144 M.len = O.len;
145 M.start = O.start;
146 LM.push_back(M);
147 }
148 else
149 {
150 for (K = LM.begin(); K != LM.end(); K++)
151 {
152 if (K->start>(O.start + O.len)) //上下都被占用 直接插入前面
153 {
154 Memory m;
155 m.len = O.len;
156 m.start = O.start;
157 LM.push_front(m);
158 break;
159 }
160 else if ((O.start + O.len) == K->start) //上占下空 改下区基址,改长度
161 {
162 K->start = O.start;
163 K->len += O.len;
164 break;
165 }
166 else if ((K->start + K->len) == O.start) //上空==============================================
167 {
168 int l = K->len;
169 Memy::iterator X;
170 X = K;
171 ++K;
172 if (K != LM.end())
173 {
174 if (K->start == (O.start + O.len)) //上空下空
175 {
176 X->len = K->len + l + O.len; //长度三合一//删除++K
177 LM.erase(K);
178 break;
179 }
180 else //上空 下占 改上区长度
181 {
182 X->len += O.len;
183 break;
184 }
185 }
186 else //上空 下占 改上区长度
187 {
188 X->len += O.len;
189 break;
190 }
191 }
192 else if ((K->start + K->len)<O.start) //提前进入下一次循环
193 {
194 continue;
195 }
196 }
197 }
198
199
200 while (Running->next != NULL)
201 {
202 struct PCB* P = Running->next;
203 P->next = NULL;
204 delete P;
205 Running->next = NULL;
206 number--;
207 }
208 }
209
210
211 void show(struct PCB* Ready, struct PCB* Running, struct PCB* Blocked)//显示三种状态的进程情况
212 {
213 cout << "就绪态:";
214 while (Ready->next != NULL)
215 {
216 cout << " name: " << Ready->next->name << " begin: " << Ready->next->begin << " length: " << Ready->next->length;
217 Ready = Ready->next;
218 }
219 cout << endl;
220 cout << "执行态:";
221 if (Running->next != NULL)
222 {
223 cout << "name: " << Running->next->name << " begin: " << Running->next->begin << " len: " << Running->next->length;
224 }
225 cout << endl;
226 cout << "阻塞态:";
227 while (Blocked->next != NULL)
228 {
229 cout << "name: " << Blocked->next->name << " begin: " << Blocked->next->begin << " len: " << Blocked->next->length;
230 Blocked = Blocked->next;
231 }
232 cout << endl;
233 int sum = 0;
234 for (K = LM.begin(); K != LM.end(); K++)
235 {
236 cout << "内存起始地址: " << K->start << "内存长度:" << K->len << endl;
237 sum += K->len;
238 }
239 cout << "进程所占空间: " << (SIZE - sum) << endl;
240 cout << "系统空闲空间: " << sum << endl;
241 sum = 0;
242 }
243
244
245 void Run(struct PCB* &Ready, struct PCB* &Running) //执行函数,查询就绪态中的PCB
246 {
247 while ((Ready->next != NULL) && (Running->next == NULL))
248 {
249 struct PCB* Z = Ready->next;
250 Running->next = Z;
251 Ready->next = Ready->next->next;
252 Z->next = NULL;
253 }
254 }
255
256
257 void Block(struct PCB* &Running, struct PCB* &Blocked) //执行到阻塞的转换
258 {
259 struct PCB* Head = Blocked;
260 while (Running->next != NULL)
261 {
262 while (Head->next != NULL)
263 {
264 Head = Head->next;
265 }
266 Head->next = Running->next;
267 Running->next = NULL;
268 }
269 }
270
271
272 void TimeUp(struct PCB* &Running, struct PCB* &Ready) //时间片到
273 {
274 struct PCB* Head = Ready;
275 struct PCB* P = Running->next;
276 P->next = NULL;
277 while (Running->next != NULL)
278 {
279 while (Head->next != NULL)
280 {
281 Head = Head->next;
282 }
283 Head->next = P;
284 Running->next = NULL;
285 }
286 }
287
288
289 void Wake(struct PCB* &Blocked, struct PCB* &Ready)//唤醒进程
290 {
291 if (Blocked->next == NULL)
292 {
293 cout << "没有进程处于阻塞态!" << endl;
294 system("pause");
295 return;
296 }
297 struct PCB* P = Ready;
298 while (P->next != NULL)
299 {
300 P = P->next;
301 }
302 if (Blocked->next != NULL)
303 {
304 P->next = Blocked->next;
305 Blocked->next = Blocked->next->next;
306 P->next->next = NULL;
307 }
308 else
309 {
310 cout << "没有处于阻塞状态的进程!" << endl;
311 }
312
313 }
314
315
316 void interface()
317 {
318 cout << "========帮助========" << endl;
319 cout << "C----------创建进程" << endl;
320 cout << "T----------时间片到" << endl;
321 cout << "S----------进程阻塞" << endl;
322 cout << "W----------唤醒进程" << endl;
323 cout << "E----------结束进程" << endl;
324 cout << "H----------查看帮助" << endl;
325
326 }
327
328
329 void start()
330 {
331 cout << "请输入内存的起始地址:" << endl;
332 cin >> L.start;
333 cout << "请输入内存的大小:" << endl;
334 cin >> L.len;
335 SIZE = L.len;
336 LM.push_front(L);
337 }
338
339
340 void process() // 中间过程
341 {
342 interface();
343 system("pause");
344 char choice;
345 do
346 {
347 system("cls");
348 cin >> choice;
349 switch (choice)
350 {
351 case 'C':LM.sort(px); CreateProcess(Ready, LM); Run(Ready, Running); show(Ready, Running, Blocked); system("pause"); break;
352 case 'T':TimeUp(Running, Ready); Run(Ready, Running); show(Ready, Running, Blocked); system("pause"); break;
353 case 'S':Block(Running, Blocked); Run(Ready, Running); show(Ready, Running, Blocked); system("pause"); break;
354 case 'W':Wake(Blocked, Ready); Run(Ready, Running); show(Ready, Running, Blocked); system("pause"); break;
355 case 'E':EndProcess(Running, LM); Run(Ready, Running); show(Ready, Running, Blocked); sort1(LM); system("pause"); break;
356 case 'H':interface();break;
357 default:cout << "输入错误,请重新输入!" << endl; system("pause"); break;
358 }
359
360 } while (number != 0);
361 }
362
363
364 void main()
365 {
366 Ready->next = NULL;
367 Blocked->next = NULL;
368 Running->next = NULL;
369 start();
370 process();
371 cout << "所有进程已结束" << endl;
372 system("pause");
373
374 }
View Code